Как уничтожить несколько gameObject во время выполнения? - PullRequest
0 голосов
/ 21 декабря 2018

В Unity3D я динамически создаю и уничтожаю капсулу во время выполнения.Я использовал пробел для создания капсулы и C для уничтожения.

Я хочу создать несколько объектов и уничтожить несколько объектов одновременно.Когда я нажимал Пробел несколько раз, объект создавал несколько раз, это нормально.

Но проблема в том, что когда я нажимал 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);
     }
}

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Я хотел бы добавить больше ответа.Если вы хотите добавить и удалить одну за другой лучшую структуру данных для использования, это очередь.

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

Очередь структура данных выдаст первый вошел в очередь.Таким образом, он выдаст первый игровой объект, который вы добавили в очередь во время выполнения, и вам не понадобится переменная для управления индексом, как в состоянии 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 #, которые вы можете использовать в зависимости от вашего необходимого случая.

0 голосов
/ 21 декабря 2018

Вы можете просто создать список капсул.Объявите список капсул, например:

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);
    }
}

Посмотрите, поможет ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...