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)
我想在 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# 中支持的数据结构列表,您可能希望根据您的需求使用该数据结构。