MonoBehaviourのenabledとは、そのコンポーネントの無効有効を切り替えるbool値であり、SetActiveはそのゲームオブジェクトの有効無効を切り替えるためのメソッドです。これらによってMonoBehaviourやUnityイベント関数がどういう影響を受けるか?という基本的かつ最重要で面倒くさいトピックを今回の記事でまとめてしまおうと思います!
※追記 : SetActiveはコンピュータの電源を切り替えるようなものであり、enabledはそれとはまったく違う性質を持ちます。enabledがfalseでも、そのコンポーネントは完全停止するわけではなく(つまり電源での例えで言うなら通電はしている)、あくまでPlayerLoopからは除外されているだけ、ということになります。説明が難しいですが、これらの性質がかなり違うことは理解しておくべきだと思います。
enabledはUnityイベントを止める(Awake以外)

まずenabledについてですが、インスペクター上で左上のチェックボックスで切り替えることのできる、そのコンポーネントの動作をON/OFFするものですが、完全に停止するものではありません。(つまり、どういうこと?)
有効か?無効か?というのは実際にはちょっと曖昧な概念ですよね。enabledは厳密に言えば、そのシーン中でそのコンポーネントが自律的に動作するか?Player Loopの干渉を受けるかどうかを決定するbool値です。
そのゲームオブジェクト及びコンポーネントの生成自体は行われているのでAwakeはゲームオブジェクトが有効であれば(つまりactiveSelfがtrueなら) 実行されます。
ただし、シーン開始時にゲームオブジェクト自体が無効だと、過去記事で言及したような現象が起きるので注意が必要です。
enabledがfalseだと、OnEnable, Start, Update, FixedUpdate, LateUpdateといった、これらのUnityイベント関数は動きません。

TesterAとTesterBの二つのゲームオブジェクトにそれぞれAwake, OnEnable, StartでDebug.Logを実行するスクリプトをつけ、TestBはエディタ上でenabledを無効にして実行すると、TesterAは全て実行されるのに対してTesterBはAwakeしか実行されていません。ゲーム実行中にTesterBのenabledを有効になると以下のようになります。

まずTesterBのコンポーネントが有効になったことでOnEnableが実行され、次にStartが実行されました。つまり、こういうことです。
少しややこしいこと言うと、Awakeでenabledを無効にすればOnEnable以下のイベント関数は実行されませんし、OnEnableで無効にすればStartや各Update関数が実行されない、ということになります。つまり、どこまで実行してどのイベント関数を止めておくか?ということを選択できるわけですが、混乱の元ではあります。
そして、そのスクリプトが完全に停止したわけではなく、外部から呼び出されるpublicメソッドや、OnTriggerEnterなどの物理システムから呼び出される処理は実行されます。つまり、自律的に動いていないだけで存在する以上動くことはできる、ということになります。
ある物理オブジェクトのFixedUpdateによる処理をenabled = falseで止めても、他の物理オブジェクトと衝突してOnCollisionEnterが呼び出される、という挙動を実現したいのならenabledは便利です。もし、そうでなければOnCollisionEnterにて、
if (enabled == false)
return;
のような早期リターンを使うか、コライダーを無効にするなどの対策が必要になります。これはつまり、そのコンポーネントが動かなくなっただけで、そのオブジェクトのRigidbody自体は生きているので、そこから物理イベントは呼び出されるということなのですが、enabledをfalseにしたんだから動かないんじゃ!?と混乱しがちなんですよね。
SetActiveはゲームオブジェクト全体のON/OFF

インスペクター左上のチェックボックスで切り替え可
そして、SetActiveはそのゲームオブジェクトをゲームオブジェクト全体の有効無効を切り替えるメソッドであり、activeSelfでその状態を確認できます。つまりゲームオブジェクトの動作が停止しているということで、実質そのゲーム中から消えたようになります。(ヒエラルキー上では灰色で名前が表示される)
全てのコンポーネントの動作が停止しているので、前述のenabledを無効にしたけど、Rigidbodyは健在だからOnTriggerEnterやOnCollisionEnterが呼び出される、というような挙動はなくなります。ただし存在自体はしているし、publicメソッドは呼び出されたら動く、ということには注意が必要です。
なので、activeSelfがfalseの時に動作させたくないメソッドがあるなら、やはりそういう風にコーディングする必要があります。SetActive(false)はそのゲームオブジェクト全体の動作を停止させるものであり、消えたように見えるのはレンダラーが機能停止し、物理システムから外れるのはRigidbodyが停止したからです。しかし、ゲームオブジェクト自体はシーン中に残っているし、スクリプトも健在である、ということを忘れてはいけません。
OnEnableについての補足
OnEnableについて再確認すると、そのコンポーネントが有効になった時(つまりenabled = trueかSetActive(true)された時)に毎回実行されるイベント関数です。何度もenabledを切り替えるような場合は何回も実行されることになり(OnDisableも)、初期化のためのコードが書かれることが多いと考えられます。
最初から有効だったらAwakeの後に一回目が実行されますし、無効だと最初に有効にされた時に実行されることになります(そしてStart関数も)。
まとめ
今回書いたことは自分への戒めとして書きました。これらは基本的な挙動ではありますが、やはり忘れがちですし、混乱しがちだからです。実際に私は最近、ゲームオブジェクトが無効でもAwakeは実行されるんだ、とenabledが無効の時の挙動と勘違いしちゃいましたからね。
最近はenabledを切り替えることでゲームオブジェクトをコントロールするコードを書くことが多かったので、これらの挙動は特に問題になる、ということで整理をしてみました。
以前書いたシーン実行時の状態によってイベント関数の順序が親子間で変わる問題も合わせて気に留めておきたい挙動だと思います。