【Unity備忘録】アタッチしたスクリプトへの値渡しとStartメソッドについて


基本的なことなんだろうけどついさっき気が付いて感動したのでメモしておく

アタッチしているスクリプトは、アクセスレベルがpublicな変数に限りインスペクタで変数の値がセットできることを知った。
いや見りゃわかるだろとか言わないで・・気が付かなかったの・・・

んでStartメソッド内で同じ値を書き換えた場合、Startで指定した値で上書きされるらしい。

と、そもそもStartメソッドについて、最初に呼ばれるんだぁくらいのふわっとした理解のまま突き進んできてしまっているのでここでちょっと調べてみる。
Unityマニュアル-イベント関数の実行順
https://docs.unity3d.com/ja/current/Manual/ExecutionOrder.html
どうやら「最初」に呼ばれる関数はたくさんあるらしい。
今まで弄ってた感覚的には、インスタンスが作られたタイミングで最初に呼ばれるのがStartだと思っていたがどうも違うらしい。

順番としては
インスタンスができた直後:Awake
(アクティブになったとき:OnEnable)
シーンが読み込み終わったとき:OnLevelWasLoaded
初回Updateが行われる前:Start



とのこと。

というわけでこんなコードを書いた。

//省略
	public int test = 0;

	void Start(){


		Debug.Log ("Start:" + test);

		test = 2;

	}

	void Awake(){


		Debug.Log ("Awake:" + test);

		test = 3;

	}

	void OnEnable(){


		Debug.Log ("OnEnable:" + test);

		test = 4;

	}

	void OnLevelWasLoaded(){


		Debug.Log ("OnLevelWasLoaded:" + test);

		test = 5;

	}

//省略

アタッチしたスクリプトにインスペクタで値を渡し、それぞれのメソッドで同じ変数に値を代入してログにだす。
予想ではAwakeがインスタンスができた直後に走るとのことなのでAwakeとOnEnableの間にインスペクタで指定した引数の代入が入るのでは。なので出力は
Awake:0
OnEnable:3
Start:4
OnLevelWasLoaded:2
と予想。

実行結果

あっAwakeにインスペクタで指定した値が入ってる・・・・しかもOnLevelWasLoaded呼ばれてねぇ・・・

というわけでインスペクタで指定した値の代入はAwakeより先に行われているらしい。
いやいやうーん普通に考えてみれば「AwakeとOnEnableの間にインスペクタで指定した引数の代入が入る(キリッ」とか言ったけどそれだとスクリプト内にもかかわらずAwakeでインスペクタの値が使えないから当然といえば当然か。
でもインスタンス化直後っていったじゃんブツブツ・・・

あとOnLevelWasLoadedは今のバージョンのUnityでは非推奨になったそうです。
でも非推奨とはいえ呼ばれるらしいんだけどなぁ・・・まぁ今回そこまで追う気ないのでここで終わり。
使うときに調べりゃいいんだよ!!!!

基本的なことだけどこういうのって独学だと気が付かないまま進んじゃうことあるから困る。

あと今よく分かってないのがuGUI周り。Canvasの扱いがいまいちよく分からない。
Sceneビューで見ると大きさガバガバなんだけど何でGameビューだとぴったりになるんだ・・・黒魔術か・・・。
Sceneビュー上で大きさ変えられないしあそこでの大きさは飾りなの?
子要素のEventTriggerも色々弄ってると突然効かなくなるから弄るのが怖い。


あわせて読みたい