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