質問: 4; } ``` 2Sampleスクリプトがアタッチされた空のゲームオブジェクトをシーン上に作成。 3Sampleスクリプトを下記のように作成。 ``` using System.Collections; using System.Collections.Generic; using UnityEngine; public class Sample : MonoBehaviour { [SerializeField] GameObject obj; // Use this for initialization void Start () { Debug.Log (obj.transform.position); Debug.Log (obj.GetComponent().i); } } ``` 4SampleクラスのSerializeFieldにmypfbをセット。 5実行すると、下記のように出力される。 ``` (0.0, 0.0, 0.0) UnityEngine.Debug:Log(Object) Sample:Start() (at Assets/Sample.cs:12) 4 UnityEngine.Debug:Log(Object) Sample:Start() (at Assets/Sample.cs:13) ``` この実行結果についてわからないこと。 ``` ・positionが(0,0,0)と表示されているが、シーン上の(0,0,0)にmypfbは配置されていない。 ・MyPrefabの変数iはインスタンスフィールドのはず。 シーン上にプレハブは生成されていないのに、インスタンスフィールドにアクセスできてしまうのはなぜか。 シーン上になくても、アセットのmypfbのプレハブはインスタンスなのか? ``` ご教授のほどよろしくお願いします。
回答: ### public or [SerializeField] + Inspectorで設定 = 初期化 Inspectorで設定したものが配列ならその配列で初期化 GameObjectならGameObjectで初期化 スクリプトをアタッチしている場合そのスクリプトも合わせて初期化されます。 MonoBehaviourを継承しているクラスなら自動で初期化が走ります。 目には見えないですが、profilerで確認してください。 メモリ上に展開されているのがわかります。(1個はわかりにくいので複数設定してみると分かりやすいかもしれません) ### (0.0, 0.0, 0.0)の謎 上記でもお話しましたがInspector上で設定したオブジェクトは自動的に初期化が走ります。そしてtransform.positionの初期値が0,0,0です。ちなみにMyPrefabのtaranfrom positionに適当な値を設定するとその値が表示されることがわかります。この挙動からも何もしていなくても初期化が走っていることがわかると思います。 ### (おまけ)メモリ管理にご注意ください。 ゲーム画面に登場していないので初期化は走っていないと思いがちですがInspectorで設定したものは見えなくても全てメモリに展開されてしまいます。なのですぐ使うものはInspectorで設定、それ以外はResourcesに入れて動的に展開するのがオススメです。