如何在 Unity 中删除一个带有标签的游戏​​对象?

How to delete one gameObject with a tag in Unity?

我有一张由 6 个方块组成的地图,带有 LevelBlock 标签。汽车离开当前所在的街区后,我想删除该街区。现在,我的代码删除了随机的 LevelBlock,但没有删除汽车之前所在的 LevelBlock。如何删除不再使用的LevelBlock?

这是我的代码:

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

public class TriggerExit : MonoBehaviour {

public float delay = 5f;

public delegate void ExitAction();
public static event ExitAction OnChunkExited;

private bool exited = false;

private void OnTriggerExit(Collider other)
{
    CarTag carTag = other.GetComponent<CarTag>();
    if (carTag != null)
    {
        if (!exited)
        {
           exited = true;
           OnChunkExited();
           StartCoroutine(WaitAndDestroy());
        }
    }
}
    
IEnumerator WaitAndDestroy()
{
   
    yield return new WaitForSeconds(delay);

    // Destroy the LevelBlock
    var block = GameObject.FindWithTag("LevelBlock");
    Destroy(block);
}

}

在你的脚本中这个

 // Destroy the LevelBlock
var block = GameObject.FindWithTag("LevelBlock");
Destroy(block);

只是抓取带有标签 LevelBlock 的第一个对象并将其删除。

我了解到您提供的脚本已被阻止。如果是这种情况,那么修复它就非常简单了。也许像

IEnumerator WaitAndDestroy()
{
   
    yield return new WaitForSeconds(delay);

    // Destroy the LevelBlock
    Destroy(gameObject);
}

再次假设此脚本位于您的街区,但 Destroy(gameObject)(带有小写的 g)告诉它自行销毁。

编辑:糟糕,我已经有一段时间没有接触 unity 了,你需要获取父对象并销毁它

var parent = gameObject.transform.parent.gameObject;

有很多方法可以做到这一点,这取决于你的对象是如何设置的,但这会给你父对象,然后你可以销毁它。

FindWithTag returns 第一次遇到带有相应标签的游戏​​对象。

您真正想要销毁的对象是您的 ExitTrigger 的父对象,它附加了 LevelBlockScript

你可以像这样传递它

private void OnTriggerExit(Collider other)
{
    CarTag carTag = other.GetComponent<CarTag>();
    if (carTag != null)
    {
        if (!exited)
        {
           exited = true;
           OnChunkExited();
           StartCoroutine(WaitAndDestroy(GetComponentInParent<LevelBlockScript>().gameObject));

           // or also simply
           //StartCoroutine(WaitAndDestroy(transform.parent.gameObject))
        }
    }
}
    
IEnumerator WaitAndDestroy(GameObject block)
{
   
    yield return new WaitForSeconds(delay);

    // Destroy the LevelBlock
    Destroy(block);
}