質問: 状況が説明しにくいのですが、 MainシーンのカメラにアタッチしているMainScript.csがあり、 MainシーンのCanvasにPanelオブジェクトがあり、 MainScript.csのStart()でPanelをSetActive(false)しています。 Panelには子GameObjectとしてプレハブ化したボタンオブジェクトがありSimpleButton.csをアタッチしています。 起動するとSimpleButtonのStart()が実行されるボタンとされないボタンがあって困りました。 実験的にSetActive(false)している部分をコメントアウトして最初から全て見えている状態だと、 SimpleButtonのStart()は全てのボタンで実行されていました。 ActiceになっていないとStart()が走らないものなのでしょうか? 非表示の状態で初期化させたいのですが困っています。 ◆環境 Unity2017 3.1f1 Windows10
回答: ドキュメントにも > > もしゲームオブジェクトがスタートアップ時に無効である場合、有効になるまで Awake は呼び出されません。 > > > と記載があるように、最初から非アクティブなオブジェクトはAwake以降呼ばれません。 Startが呼ばれるボタンと呼ばれないボタンがあるのは、Panelよりも先にStartが呼ばれているか否かの差だと考えられます。通常、コンポーネントの初期化順はランダムであるためです。 そこで[DefaultExecutionOrder(-1)]をボタンのclass定義の上に記述するなどしてみて下さい。 これでスクリプトの実行順序をある程度制御できるようになるハズです。 ``` [DefaultExecutionOrder(-1)] public class ButtonClass : MonoBehaviour { } ``` なお「0」がデフォルトで、より低い値の方が優先的に実行されます。