【初心者Unity】スクリプトの実行順を制御する
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
スクリプトの実行順を制御する
今回はスクリプトの実行順を制御する方法を紹介します。
実はスクリプトの実行順はランダム
シーンを再生するとまずStartが呼ばれて、そのあとはUpdateが繰り返し呼ばれて…と、Unityを勉強し始めたら誰しも最初に覚えたと思います。これらのStartやUpdateのように実行されるタイミングや順番が決まっている関数をイベント関数といいます。
では同じイベント関数が複数のスクリプトに存在する場合(例えばスクリプトAのStartとスクリプトBのStartがある状態)、それらの実行順はどうなっているのでしょうか?
見出しに書いた通りですが、同じ種類のイベント関数が実行される順番には決まりがありません。実行環境が構成されるたびに順番が変わる可能性があります。
具体的な例を確認してみましょう。
例えば以下の様にテキストだけ異なるスクリプトを用意します。
スクリプトA
スクリプトB
それぞれ違うゲームオブジェクトにアタッチして、シーンを再生すると次の結果が出力されました。
実行結果①
再生→停止→再生を繰り返しましたが結果は毎回同じでした。
次に、UnityEditorを再起動したのち、再びシーンを再生してみます。
実行結果②
今度は結果①とは異なる順に出力されました。
このようにスクリプトの実行順は、実行環境が構築されるたびに替わる可能性があります。
(もちろんランダムなので、再起動しても①と同じ順に出力された可能性もあります。)
実行順の設定方法
スクリプトの実行順を設定する方法です。
メニューバーから、Edit > Project Settings を開き、サイドバーから「Script Execution Order」を選択します。
この一覧がスクリプトの実行順となります。一覧の上の行ほど優先して実行されます。
Default Timeと表示されている部分が基準となっており、ここに登録していないスクリプトの実行優先度はDefault Timeの部分に分類されます。
したがって、優先して実行したいスクリプトはDefault Timeよりも上に配置します。
逆に、実行を後に回したいスクリプトはDefault Timeよりも下に配置します。
では試しに「スクリプトB」を優先、「スクリプトA」は最後に実行する想定で設定してみましょう。
スクリプトの追加は右下の+マークから行うか、Projectビューのスクリプトを直接ドラッグ&ドロップしてもOKです。
追加したものがこちら。
右側の数値はドラッグで順番を入れ替えれば適当に数値を割り当ててくれます。一応手動でも入力できます。
この設定により、SampleBスクリプトは、他のユーザスクリプトよりも優先して実行されるようになり、SampleAスクリプトは最後に実行されるように登録できました。
後書き
便利な機能ですが、頼りすぎには注意です。実行順を登録しすぎて複雑になってしまうと、メンテナンス性や拡張性が低下します。
極力、実行順に左右されないスクリプト作成を心掛け、この機能は限定的に使用する程度にとどめた方がよいでしょう。