アドセンス
毎月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での設定はプロジェクト内全体の設定となるためシーン毎に順序を変えて・・・という事は出来ないことに注意が必要です。