Unityには多くのイベント関数が用意されており、そこに処理を書くことで特定のタイミングで処理を実行することが出来ます。
StartやUpdate関数はお馴染みですが、OnEnableは未だに使いどころがちょっと分からない、というのが個人的な現状だったので今回少し調べました。
順番的にはAwakeの後に実行される関数になるのですが、問題は『利用可能(enable)になったら』という条件です。
上リンク先のイベント関数の実行の順序についてのページを見れば分かるように、基本的にAwake > OnEnable > Startという順番になっています。
この順序というのは不変なわけなので、例えば今回、テストのために書いた次のようなスクリプトは上から順に書いたとおりにデバッグ・ログをコンソールに出力します。
ただし、このスクリプトを装着したゲームオブジェクトのenable状態を変化させると、異なる挙動が起きます。
まず、ゲームが起動されシーンがロードされた後、そのゲームオブジェクトが非アクティブ状態、disabledであるならばStartやAwake関数は実行されません。
ゲーム実行中にインスペクターからゲームオブジェクトをアクティブにすると、そのタイミングで初めて、Awake, Start, OnEnable関数が実行されます。上スクリプトにおいては三つの出力がコンソールに表示されます。ここまでは通常と変わりません。
ここで、このゲームオブジェクトのenabledをゲーム起動中にインスペクター上で何回も切り替えると次のようになります。
そのゲームオブジェクトがenabledになる度に毎回OnEnable関数が実行されていることを示す結果となりました。
これはかなり重要な挙動で、例えばアクティブになる都度初期化が必要な処理などはOnEnableに書くのが良いのかもしれません。
AwakeとStartの使い分けすらも正直はっきりしていないので、そろそろUnity自体への理解度も上げていかないとなぁと思いました。