質問: Sphere) Destroy(Sphere); } }*/ } ```
回答: まず、Unityの基本となる仕組みを理解しましょう。 1. GameObjectとは、Unityの最も基本となるゲームオブジェクトそのものです。 2. プレハブとは、ひな形となるゲームオブジェクトです。 プログラマ的説明:Prototype 3. Instantiate()は、ひな形となるゲームオブジェクトをクローンします。 プログラマ的説明:Prototypeによるクローン SerializeしてDeserializeすることでクローンしてる。UnityEngine.Object継承クラスは参照も復元するという特殊仕様 4. MonoBehaviorは、ゲームオブジェクトにアタッチするスクリプトです。 プログラマ的説明:GameObjectに紐づけるふるまい。 ・GameObject自体は、座標、向き、GameObject同士の親子関係程度の情報しか持たない ・アタッチされたGameObjectがInstantiateすることで複製された場合にStart()する ・ゲームが1フレーム進むたびに、Update()する ・Unity開始時の第1フレーム以外は、事実上UpdateステップでInstantiateする状況のため、Instantiateで生成されたGameObjectは、そのフレームでUpdate()されない。例:STGで弾を生成する場合など) 5. エディタ上でGameObject(Prefab)に機能(Collider、自作のBehaviourなど)をアタッチすると、publicフィールドはエディタ上に表示され、パラメータを設定しておくことができます。別名インスペクタ プログラマ的説明:Instantiate()の瞬間に以下のように設定される ・コンストラクタ ・インスペクタ値の読み込み ・Awake()の呼び出し ・Instantiate()が終わり、戻り値が返る 以上を理解したうえで質問に戻りましょう。おそらく2つの原因が考えられます。 1つ目 > > public GameObject Sphere > > > こちらは、MonoBehaviourのpublicフィールドなので、エディタのインスペクタ上に表示されていると思います。 仮にEditor上でこのフィールドに何らかのプレハブが設定するか、プログラム上でどこかから持ってきたGameObjectを設定していればいいですが、設定されていない場合、この値はnull(空っぽ)になるはずです。 null(空っぽ)は当然Instantiateできません。(バージョンによってはエディタ上でダミーのGameObjectが勝手に設定された気もしますが...) 2つ目 > > The referenced script on this Behaviour (Game Object 'Sphere') is missing! > > > これはよくあるWarningで、Sphereに指定したプレハブを見ると、一度アタッチした機能が有ったけど、いつの間にかScript自体がなくなったか名前が変わったかして、アタッチに不整合が起きているときに表示されます。 以上、どちらかが原因かと思いますので、再確認してください。 UnityはGUIでかなりの部分が作れますが、C#の知識が0で作るのは難しいと思いますので、 変数、型、コンストラクタ、未設定の変数(null)、newされたインスタンスが設定された変数ぐらいは斜め読みで把握できるといいと思います。