C# 销毁阵列中的游戏对象

C# 销毁阵列中的游戏对象,c#,unity3d,unity5,C#,Unity3d,Unity5,我有一个数组可以在玩家进入触发器时实例化多个游戏对象,但我不知道如何在玩家退出触发器时销毁这些游戏对象。这是我的代码: using UnityEngine; using System.Collections; using System.Collections.Generic; public class SpawnDestroy : MonoBehaviour { public List<GameObject> spawnPositions; public List<Game

我有一个数组可以在玩家进入触发器时实例化多个游戏对象,但我不知道如何在玩家退出触发器时销毁这些游戏对象。这是我的代码:

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

public class SpawnDestroy : MonoBehaviour {

public List<GameObject> spawnPositions;
public List<GameObject> spawnObjects;


void OnTriggerEnter(Collider other)
{

    if (other.gameObject.tag == "Player")
    {
        SpawnObjects ();
    }
}

void OnTriggerExit(Collider other)
{

    if (other.gameObject.tag == "Player")
    {

    ............

    }
}

void SpawnObjects()
{
    foreach(GameObject spawnPosition in spawnPositions)
    {
        int selection = Random.Range(0, spawnObjects.Count);
        Instantiate(spawnObjects[selection], spawnPosition.transform.position, spawnPosition.transform.rotation);
    }
}

}
使用UnityEngine;
使用系统集合;
使用System.Collections.Generic;
公共类:单行为{
公开职位名单;
公共物品清单;
无效对撞机(对撞机其他)
{
如果(other.gameObject.tag==“玩家”)
{
产卵对象();
}
}
void OnTriggerExit(碰撞器其他)
{
如果(other.gameObject.tag==“玩家”)
{
............
}
}
void对象()
{
foreach(游戏对象在spawnPositions中的spawnPosition)
{
int selection=Random.Range(0,spawnObjects.Count);
实例化(spawnObjects[selection],spawnPosition.transform.position,spawnPosition.transform.rotation);
}
}
}
更新代码:

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


public class SpawnDestroy : MonoBehaviour {

public List<GameObject> spawnPositions;
public List<GameObject> spawnObjects;
private List<GameObject> instantiated;


void OnTriggerEnter(Collider other)
{

    if (other.gameObject.tag == "Player")
    {
        SpawnObjects ();
    }
}

void OnTriggerExit(Collider other)
{

    if (other.gameObject.tag == "Player")
    {

        for(int i = 0; i < instantiated.Count; i++)
        {
            Destroy(instantiated[i]);
        }

        }
}

void SpawnObjects()
{
    // (re-)initialize as empty list
    instantiated = new List<GameObject>();

    foreach(GameObject spawnPosition in spawnPositions)
    {
        int selection = Random.Range(0, spawnObjects.Count);
        instantiated.Add(Instantiate(spawnObjects[selection], spawnPosition.transform.position, spawnPosition.transform.rotation));
    }
}

}
使用UnityEngine;
使用系统集合;
使用System.Collections.Generic;
公共类:单行为{
公开职位名单;
公共物品清单;
私有列表实例化;
无效对撞机(对撞机其他)
{
如果(other.gameObject.tag==“玩家”)
{
产卵对象();
}
}
void OnTriggerExit(碰撞器其他)
{
如果(other.gameObject.tag==“玩家”)
{
for(int i=0;i<实例化的.Count;i++)
{
销毁(实例化[i]);
}
}
}
void对象()
{
//(重新)初始化为空列表
实例化=新列表();
foreach(游戏对象在spawnPositions中的spawnPosition)
{
int selection=Random.Range(0,spawnObjects.Count);
添加(实例化(spawnObjects[selection],spawnPosition.transform.position,spawnPosition.transform.rotation));
}
}
}

当前您没有存储对实例化游戏对象的引用

为此,您可以创建另一个列表并添加实例化的对象,类似这样(这是一个简短的版本,您也可以将它们存储在临时文件中):


目前,您没有存储对实例化游戏对象的引用

为此,您可以创建另一个列表并添加实例化的对象,类似这样(这是一个简短的版本,您也可以将它们存储在临时文件中):


尽管我喜欢这个,但我认为有一个拼写错误<代码>实例化.Add(实例化(spawnObjects[selection],spawnPosition.transform.position,spawnPosition.transform.rotation))应该
实例化.Add(实例化(预置,spawnPosition.transform.position,spawnPosition.transform.rotation))
@Programmer我认为
spawnObjects
应该是一个预置列表。如果不是,这当然需要改变。@GunnarB。我已经对它进行了测试,出现了以下错误:Assets/0_asm/Scripts/SpawnDestroy.cs(44,38):错误CS1502:System.Collections.Generic.List.Add(UnityEngine.GameObject)的最佳重载方法匹配具有一些无效参数Assets/0_asm/Scripts/SpawnDestroy.cs(44,38):错误CS1503:Argument#1'无法将
UnityEngine.Object'表达式转换为类型
UnityEngine.GameObject'哦,是的,我的错。
实例化
的返回需要通过在实例化前面添加
(GameObject)
来强制转换到
游戏对象
。我已经编辑过了。@GunnarB。我有一个错误,因为玩家在退出触发器之前拾取了一些对象。我该怎么解决呢?虽然我喜欢这个,但我认为有一个打字错误<代码>实例化.Add(实例化(spawnObjects[selection],spawnPosition.transform.position,spawnPosition.transform.rotation))应该
实例化.Add(实例化(预置,spawnPosition.transform.position,spawnPosition.transform.rotation))
@Programmer我认为
spawnObjects
应该是一个预置列表。如果不是,这当然需要改变。@GunnarB。我已经对它进行了测试,出现了以下错误:Assets/0_asm/Scripts/SpawnDestroy.cs(44,38):错误CS1502:System.Collections.Generic.List.Add(UnityEngine.GameObject)的最佳重载方法匹配具有一些无效参数Assets/0_asm/Scripts/SpawnDestroy.cs(44,38):错误CS1503:Argument#1'无法将
UnityEngine.Object'表达式转换为类型
UnityEngine.GameObject'哦,是的,我的错。
实例化
的返回需要通过在实例化前面添加
(GameObject)
来强制转换到
游戏对象
。我已经编辑过了。@GunnarB。我有一个错误,因为玩家在退出触发器之前拾取了一些对象。我怎样才能解决它?
private List<GameObject> instantiated;

...

void SpawnObjects()
{
    // (re-)initialize as empty list
    instantiated = new List<GameObject>();

    foreach(GameObject spawnPosition in spawnPositions)
    {
        int selection = Random.Range(0, spawnObjects.Count);
        instantiated.Add((GameObject)Instantiate(spawnObjects[selection], spawnPosition.transform.position, spawnPosition.transform.rotation));
    }
}
for(int i = 0; i < instantiated.Count; i++)
{
    Destroy(instantiated[i]);
}
while(parentTransform.childCount > 0)
{
    Transform child = parentTransform.GetChild(0);
    Destroy(child.gameObject);
    child.SetParent(null);
}