如何使用 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])