如何使用 C# 在 Unity 中按顺序销毁实例化的预制件?
How to destroy instantiated prefabs in order in Unity using C#?
我是 Unity 的新手,因为我是 C# 的新手。我正在制作一个 2D 无尽的跑步者,但是当我试图破坏实例化的预制件(关卡部件)时,我 运行 遇到了一些问题。我尝试了一些在网上找到的方法,但这些方法破坏了最新实例化的预制件(例如,如果我实例化了 10 个关卡部件,只有第 10 个被破坏)。我正在寻找破坏最早实例化预制件的东西。
谢谢你的帮助!玩得开心 :)
我手上的代码:
public class LevelGenerator : MonoBehaviour{
private const float distance_to_spawn = 100f;
[SerializeField]private List<Transform> LevelPartList;
[SerializeField]private Transform LevelPart0;
[SerializeField]private GameObject player;
private Vector3 lastEndingBlock;
private Vector3 distance = new Vector3(5,3,0);
private Transform lastLevelPartTransform;
// the starting point of the spawning process
private void Awake()
{
lastEndingBlock = LevelPart0.Find("ending_block").position;
}
// calling the spawning function, so it's infinite
private void Update()
{
if(Vector3.Distance(player.transform.position,lastEndingBlock) < distance_to_spawn)
{
SpawnLevelPart();
}
}
// choose randomly out of the prefabs(level parts)
private void SpawnLevelPart()
{
Transform chosenLevelPart = LevelPartList[Random.Range(0,LevelPartList.Count)];
lastLevelPartTransform= SpawnLevelPart(chosenLevelPart,lastEndingBlock - distance);
lastEndingBlock = lastLevelPartTransform.Find("ending_block").position;
}
// the function used to spawn new level parts
private Transform SpawnLevelPart(Transform LevelPart,Vector3 spawnPosition)
{
Transform levelPartTransform = Instantiate(LevelPart,spawnPosition,Quaternion.identity);
return levelPartTransform;
}
}
我不会保留备用 private Transform lastLevelPartTransform;
,而是将其保留在 Queue 中,如下所示:
private Queue<Transform> transformsToDestroy = new Queue<Transform>();
// choose randomly out of the prefabs(level parts)
private void SpawnLevelPart()
{
Transform chosenLevelPart = LevelPartList[Random.Range(0,LevelPartList.Count)];
gosToDestroy.Enqueue(SpawnLevelPart(chosenLevelPart,lastEndingBlock - distance));
lastEndingBlock = lastLevelPartTransform.Find("ending_block").position;
}
所以无论你需要什么,你都可以Destroy(transformsToDestroy.Dequeue().gameObject)
您好GergőStarosta!如果要删除之前实例化的对象,基本上可以将所有实例化的对象收集到一个父对象下。
private Transform SpawnLevelPart(Transform LevelPart,Vector3 spawnPosition)
{
Transform levelPartTransform = Instantiate(LevelPart,spawnPosition,Quaternion.identity);
levelPartTransform.parent = parentObject.transform;
return levelPartTransform;
}
之后,你可以使用这个:
Destroy(parentObject.GetChild[ChildNumber])
我是 Unity 的新手,因为我是 C# 的新手。我正在制作一个 2D 无尽的跑步者,但是当我试图破坏实例化的预制件(关卡部件)时,我 运行 遇到了一些问题。我尝试了一些在网上找到的方法,但这些方法破坏了最新实例化的预制件(例如,如果我实例化了 10 个关卡部件,只有第 10 个被破坏)。我正在寻找破坏最早实例化预制件的东西。 谢谢你的帮助!玩得开心 :)
我手上的代码:
public class LevelGenerator : MonoBehaviour{
private const float distance_to_spawn = 100f;
[SerializeField]private List<Transform> LevelPartList;
[SerializeField]private Transform LevelPart0;
[SerializeField]private GameObject player;
private Vector3 lastEndingBlock;
private Vector3 distance = new Vector3(5,3,0);
private Transform lastLevelPartTransform;
// the starting point of the spawning process
private void Awake()
{
lastEndingBlock = LevelPart0.Find("ending_block").position;
}
// calling the spawning function, so it's infinite
private void Update()
{
if(Vector3.Distance(player.transform.position,lastEndingBlock) < distance_to_spawn)
{
SpawnLevelPart();
}
}
// choose randomly out of the prefabs(level parts)
private void SpawnLevelPart()
{
Transform chosenLevelPart = LevelPartList[Random.Range(0,LevelPartList.Count)];
lastLevelPartTransform= SpawnLevelPart(chosenLevelPart,lastEndingBlock - distance);
lastEndingBlock = lastLevelPartTransform.Find("ending_block").position;
}
// the function used to spawn new level parts
private Transform SpawnLevelPart(Transform LevelPart,Vector3 spawnPosition)
{
Transform levelPartTransform = Instantiate(LevelPart,spawnPosition,Quaternion.identity);
return levelPartTransform;
}
}
我不会保留备用 private Transform lastLevelPartTransform;
,而是将其保留在 Queue 中,如下所示:
private Queue<Transform> transformsToDestroy = new Queue<Transform>();
// choose randomly out of the prefabs(level parts)
private void SpawnLevelPart()
{
Transform chosenLevelPart = LevelPartList[Random.Range(0,LevelPartList.Count)];
gosToDestroy.Enqueue(SpawnLevelPart(chosenLevelPart,lastEndingBlock - distance));
lastEndingBlock = lastLevelPartTransform.Find("ending_block").position;
}
所以无论你需要什么,你都可以Destroy(transformsToDestroy.Dequeue().gameObject)
您好GergőStarosta!如果要删除之前实例化的对象,基本上可以将所有实例化的对象收集到一个父对象下。
private Transform SpawnLevelPart(Transform LevelPart,Vector3 spawnPosition)
{
Transform levelPartTransform = Instantiate(LevelPart,spawnPosition,Quaternion.identity);
levelPartTransform.parent = parentObject.transform;
return levelPartTransform;
}
之后,你可以使用这个:
Destroy(parentObject.GetChild[ChildNumber])