原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】スクリプトが実行される順番を制御するには

アドセンス

毎月Googleから「○月は収益が○%減少しました。改善しましょう」と怒られるも対処の仕方が分からない情弱ブログ運営者の皆さんこんにちは。ブログの更新頻度を変える気はないし内容も改めるつもりはないので、毎月こまめにレポートを送ってくれるのは有難いですが、これからもほぼ現状維持で推移すると思います。

 

シングルトンパターン

ゲーム制作を行っていると、ゲーム内に管理者的なクラスがあると色々便利なので結構な頻度でSingletonパターンを採用した設計デザインになってしまいます。
Singletonパターンとはその名の通りインスタンスが1個しか存在しないクラスを用意する事で、そのインスタスをその他のオブジェクトが参照しマスターデータの取得やらイベント発火のタイミングやらを図ったりするデザインパターンの事を指します。


Unityの場合はSingletonクラスでも基本的にMonoBehaviourを継承する必要があるので、初期処理はStartメソッド、フレーム単位の処理はUpdateメソッドで実装する事になります。
しかしながらMonoBehaviourを継承した複数のクラスに対してUnity側からStart及びUpdateメソッドが呼び出される順序はUnity任せとなっているため、SingletonのStartメソッドが他のオブジェクトのStartメソッドより後に実行される、という問題が発生する可能性があります。
このような実行順序の入れ替わりが困る場合、Script Execution Orderを設定して決まった順序でスクリプトが実行されるように制御することができます。

 

Script Execution Order

メニューのEdit→Project SettingsよりProject Settingsウィンドウを開き、左のリストからScript Execution Orderを選択します。

画面にはスクリプトとその実行順序を定義する数値が設定されており、この値が小さいもの順にUnity側から呼び出され実行されるようになります。
現状だとTextMeshやらChinemachieなどに対して数値が設定されていますが、通常のスクリプトはこの一覧にはなく実行順序の値が0として取り扱われています。

Script Execution Orderに実行順序を定義したいスクリプトをドラッグ&ドロップするとこの一覧に追加され、既存の最後尾に実行順が設定された状態で定義されます



順序の値は直接編集する事ができますが、リスト内の順序を変えて自動的に設定する事もできます。

設定が終わったらApplyボタンをクリックして適用します。設定を戻したい場合はRevertボタンをクリックします。

 

まとめ

前述のSingletonクラスの場合、他のオブジェクトよりも先に初期処理を実行させたいので、Script Execution Orderの設定でDefaultTime(実行順序の値0)よりも小さい値を設定しておく事で必ず先に初期処理を実行させることができます。

 

当然ながら、Script Execution Orderでの設定はプロジェクト内全体の設定となるためシーン毎に順序を変えて・・・という事は出来ないことに注意が必要です。

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。