【问题标题】:How to Destroy multiple gameObject at runtime?如何在运行时销毁多个游戏对象?
【发布时间】:2018-12-21 18:02:20
【问题描述】:

在 unity3D 中,我在运行时动态创建和销毁胶囊。我使用 space 创建胶囊,使用 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);
     }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您可以简单地创建一个胶囊列表。 声明一个胶囊列表,如下所示:

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

    将任何已创建的胶囊添加到列表中:

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

    然后您可以销毁列表中的胶囊:

    public void destroyObject()
    {
        foreach(GameObject capsule in Capsules)
        {
            Destroy(capsule);
        }
    }
    

    看看有没有帮助。

    【讨论】:

    • 它会同时移除所有游戏对象。我想在每次按下 **C 时逐个删除 **。
    • @EveryThing 一次只从 destoryObject 获取一个元素。
    • @killer_mech,你能帮我吗?
    • @bolkay,帮我解决下面的问题stackoverflow.com/questions/53984168/…
    【解决方案2】:

    我想为 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());   
    }
    

    Queue 数据结构将提供先进先出。因此它会给出您在运行时添加到队列中的第一个游戏对象,并且您不需要像 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);
        }   
    }
    

    这里是 C# 中支持的数据结构列表,您可能需要use,具体取决于您需要的情况。

    【讨论】:

    • 我还有一个查询,我们可以给它一个唯一的 ID
    • 对于唯一 ID,有多种方法可以继续。您可以将其保存在 Dictionary 中,也可以使用具有以下变量作为 id 和 gameobject 的类的 Classobjects 列表,并通过与 id 匹配从列表中找到它的引用。
    • 2nd code 中,如果我正在创建多个对象并且仅在使用后禁用。如果我想重复使用禁用对象,那么禁用对象的数量将增加?
    • GameObject fetchedObject = pooledObjects.Dequeue(); fetchedObject.SetActive(true); 这部分代码是重用您的禁用对象(如果它们存在)。
    • 这不是使用队列而不是被视为队列的列表的真正好理由。使用列表可能会不包括 .NET 运行时的某些部分(队列不是核心系统的一部分。列表是)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多