【问题标题】:How to delete one gameObject with a tag in Unity?如何在 Unity 中删除一个带有标签的游戏​​对象?
【发布时间】:2021-02-16 07:09:56
【问题描述】:

我有一张由 6 个带有标签 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);
}

}

【问题讨论】:

    标签: c# unity3d game-development destroy


    【解决方案1】:

    FindWithTag 返回第一个遇到的带有相应标签的游戏​​对象。

    您真正想要销毁的对象是您的 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);
    }
    

    【讨论】:

      【解决方案2】:

      在你的脚本中

       // 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)告诉它自行销毁。

      编辑:我的错,我有一段时间没有触及统一性,你需要获取父对象并销毁它

      var parent = gameObject.transform.parent.gameObject;
      

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

      【讨论】:

      • 脚本位于 ExitTrigger 对象上,因此此代码只是将其删除,但块仍然存在。 ://
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多