如何在运行时销毁多个gameObject?

Eve*_*ing 5 c# unity-game-engine

在unity3D中,我在运行时动态创建和销毁封装.我用空间来制造胶囊,用C来破坏.

我想创建多个对象并在时间上销毁多个对象.当我多次按下Space时,对象正在创建多个时间就好了.

但问题是,当我多次按C时,只有一个物体在摧毁.我怎样才能破坏多个物体?逐一.

 using System;
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

 public class DynamicCreate : MonoBehaviour 
 {     
     public GameObject caps;

     // Update is called once per frame
     void Update () 
     {
          if (Input.GetKeyDown(KeyCode.Space))
          {
               createObject();
          }

          if (Input.GetKeyDown(KeyCode.C))
          {
               destroyObject();
          }
     }

     private void createObject()
     {
          caps = GameObject.CreatePrimitive(PrimitiveType.Capsule);
     }

     public void destroyObject()
     {
          Destroy(caps);
     }
}
Run Code Online (Sandbox Code Playgroud)

kil*_*ech 3

我想在 bolkay 答案中添加更多内容。如果要一一添加和删除,最好使用的数据结构是队列。

Queue<GameObject> Capsules;
void Start()
{
    Capsules = new Queue<GameObject>();
}

private void createObject()
{
    GameObject caps = GameObject.CreatePrimitive(PrimitiveType.Capsule);
    Capsules.Enqueue(caps);
}

public void destroyObject()
{
    if(Capsules.Count > 0)
        Destroy(Capsules.Dequeue());   
}
Run Code Online (Sandbox Code Playgroud)

队列数据结构将给出先进先出。因此,它将给出您在运行时添加到队列中的第一个游戏对象,并且您不需要像 List 状态那样使用变量来管理索引。


注意:这个解决方案仍然非常基本,但我建议您使用对象池,而不是在运行时创建和销毁对象,因为创建和销毁对象在运行时非常密集。因此,除非绝对必要,否则您应该避免创建和删除。

Queue<GameObject> pooledObjects;
Queue<GameObject> Capsules;
void Start()
{
    pooledObjects = new Queue<GameObject>();

    Capsules = new Queue<GameObject>();
}

private void createObject()
{
    if(pooledObjects.Count > 0)
    {
        GameObject fetchedObject = pooledObjects.Dequeue();
        fetchedObject.SetActive(true);
        //Do translations,scaling or other stuff on this reference

        //Add it back to main list of things present in scene.
        Capsules.Enqueue(fetchedObject);
    } else
    {
        //Only create objects if necessary
        GameObject caps = GameObject.CreatePrimitive(PrimitiveType.Capsule);
        Capsules.Enqueue(caps);
    }            
}

public void destroyObject()
{
    //here instead of destorying the object we will just disable them and keep them out if scene so we dont have to recreate them everytime
    if(Capsules.Count > 0)
    {
        GameObject fetchedObject = Capsules.Dequeue();
        fetchedObject.SetActive(false);//Turn the object off from scene
        pooledObjects.Equals(fetchedObject);
    }   
}
Run Code Online (Sandbox Code Playgroud)

以下是 C# 中支持的数据结构列表,您可能希望根据您的需求使用该数据结构。