【Unity】狙った順に処理したい時はスクリプトの実行順を指定する

【Unity】狙った順に処理したい時はスクリプトの実行順を指定する

MonoBehaviourを継承したスクリプトはゲームオブジェクトにアタッチできます。この時、スクリプトの処理を行なう順番を指定したい時に便利なテクニックです。

Start()、Update()などのイベント関数がどのフレームで呼ばれるかはUnity側で決まっていますが、異なるスクリプト間で、どのスクリプトのStart()が先に呼ばれるかまでは決まっていません。

Start()が存在するA, B, Cのスクリプトで、最初のフレームになった時に呼ばれるのはA->B->Cの順番なのか、B->A->Cの順番なのか、といった部分はデフォルトだと決まっていないんです。

そこで役立つのが今回紹介するスクリプトの実行順序の設定です。

順番を指定できるのはMonoBehaviourを継承しているスクリプトという制限はあるものの、順番指定ができるのはありがたいです。

 

環境

macOS 10.13 High Sierra

Unity2018.1.0f2

Script Execution Order Setting

正式名称で書くとごつい英語ですが、読んで字のごとく、Unityではスクリプトの実行順序の設定を行なうことができます。

Unityのマニュアルにもちゃんと記載されているので、詳細についてはそちらもご覧あれ。

『Script Execution Order』ウィンドウを開くには、[Edit] -> [Project Settings] -> [Script Execution Order]を選択します。

設定ウィンドウを開いてくださいね、プロデューサーさん
設定ウィンドウを開いてくださいね、プロデューサーさん

 

『Script Execution Order』ウィンドウでの設定はシンプルで、[+]を押して表示されたスクリプト一覧から、順番指定したいスクリプトを実行したい順に並べるだけ。もちろん、全てのスクリプトを指定する必要はありません。

実行順序の設定
実行順序の設定

 

例としてプロジェクト内にあったスクリプトを適当に追加してみました。並べ替えはドラッグ&ドロップでできます。

真ん中にある『Default Time』が基準で、それより早く処理を行いたいならその上に、遅く処理を行いたいならその下に移動させます。

スクリプト名の右にある数字は実行順を表したもので、少ない数字から実行されます。この数字はUnity側で割り振ってくれるので、私たちは順番だけ決めればOK。

ここで指定しなかったスクリプトは『Default Time』内で実行されます。この時、順番の保証はありません。

ドラッグ&ドロップで並べ替え
ドラッグ&ドロップで並べ替え

 

具体的にやってみよう

動きを確認するため、以下のようなオブジェクトを用意しました。

左からオブジェクト名が『Cyan』、『Yellow』、『Magenta』となっています。

信号機のような、プリンターのインクのような
信号機のような、プリンターのインクのような

 

このオブジェクトに、以下のスクリプトをアタッチします。スクリプトの名前はオブジェクト名と対応しています。

 

 

スクリプト内でやっていることは単純で、Start()でメッセージ出力、Update()ではゲーム開始後5フレーム目にRigidbodyをアタッチしています。

ここで出力されるメッセージの順番で、スクリプトが呼ばれた順番が分かります。

順番指定なし

まずはそのまま実行してみましょ。

蒼が一番後ろになった
蒼が一番後ろになった

 

結果は『Magenta』->『Yellow』->『Cyan』の順でした。

『Hierarchy』ウィンドウでは以下の順で並んでいるけど、この辺は関係なさそう。デフォルトだとどんな順番になるか分からないのが怖いところ。

オブジェクトの並び順
オブジェクトの並び順

 

順番を決めてみる

次は順番を指定して実行します。上の方で紹介した『Script Execution Order』ウィンドウを開いて、スクリプトの実行順を指定します。

『Cyan』->『Magenta』->『Yellow』の順番でコンソールにメッセージが出力されればOKです。

順番を指定する
順番を指定する

 

実行するとこうなりました。

じゃあ、残していこうか、私たちの足跡…!
じゃあ、残していこうか、私たちの足跡…!

 

ちゃんと指定した通り、『Cyan』->『Magenta』->『Yellow』の順番ですね。蒼のセリフが一番先に出力されています。

念のため別の順序も指定します。今度は『Yellow』->『Cyan』->『Magenta』の順番になるはず。

今度は黄色を先頭に
今度は黄色を先頭に

 

実行結果は以下の通り。

まさにリーダー
まさにリーダー

 

『Yellow』->『Cyan』->『Magenta』の順番になっています。よかったよかった。

念のためそれぞれ10回ずつ実行していますが、ブレはなさそうでした。

まとめ

他のスクリプトのStart()より早いタイミングでオブジェクトをしたり、各Update()の最後に処理をさせたい時に便利なスクリプトの実行順序指定。

処理を行なうイベント関数を変える方法の他に、同じイベント関数内で順番を指定する時に設定しておくといいかも。

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!