

Unityで質問があります。  
現在、インスタンスで複数のゲームオブジェクトを作成し、Destroyしようと思いやってみたのですが、うまくいかず困っています。

更に以下のエラーが発生しているため、これが原因なのでしょうけどにっちもさっちもいかない状態です。

**エラーメッセージ**

[code]

    The referenced script on this Behaviour (Game Object 'Sphere') is missing!
    UnityEngine.Object:Instantiate(GameObject, Vector3, Quaternion)
    clone:Update() (at Assets/clone.cs:45)
    
[/code]

ちなみに45行目は以下のとおりです。

[code]

    Instantiate(Sphere, new Vector3(i, 7.6f, -2), Quaternion.identity);
    
[/code]

**ソースコード**

[code]

    // Use this for initialization
    public GameObject Sphere;
    public float timeleft;
    public static Vector3 mousePosition;
    
    //float var;
    //var = Random.Range(0.0f, 9.0f);
    
    void Start () {
    }
    
    void DelayMethod()
    {
        Debug.Log("Delay call");
    }
    
    void Update()
    {
        int i = Random.Range(0, 10);
        timeleft -= Time.deltaTime;
    
        if (timeleft <= 0.0f)
        {
            timeleft = 0.5f;
            Instantiate(Sphere, new Vector3(i, 7.6f, -2), Quaternion.identity);
        }
    
        /*if (Input.GetMouseButtonDown(0))
          {
    
          RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
          Debug.Log("Test");
          if (hit.collider != null)
          {
          Debug.Log("Test");
          if (hit.collider.gameObject == Sphere) Destroy(Sphere);
          }
          }*/
    }
    
[/code]


CC BY-SA 4.0
2017-07-12T05:13:40.223
36287
2019-08-13T13:03:35.417
2019-06-06T02:49:07.433
3060
24358
question
unity3d
プレハブ化したゲームオブジェクトをDestroyしたい


45行目のSphereが、空っぽってことかな。

2行目の public GameObject Sphere; のSphereにプレハブをつけないといけないんかな。

このスクリプトの情報を出してるインスペクターのSphereの欄に、Sphereのプレハブをドラッグして

つなげないといけないんやな。 このことアタッチっていうんやな

その辺のとこ、もう一度調べてみて・・。


CC BY-SA 3.0
2018-01-12T18:16:25.490
40921
2018-01-12T18:16:25.490
26976
36287
answer


まず、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されたインスタンスが設定された変数ぐらいは斜め読みで把握できるといいと思います。


CC BY-SA 4.0
2019-06-06T02:42:36.543
55566
2019-06-06T02:42:36.543
25396
36287
answer