如何在 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);
}
我有一张由 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);
}