【问题标题】:How do I destroy an instantiated game object clone?如何销毁实例化的游戏对象克隆?
【发布时间】:2019-03-27 05:23:59
【问题描述】:

我正在尝试检查对象是否出现在数字上方。如果确实如此,我想销毁它并重新创建它。如果没有,我想创建它。我已经尝试了以下代码。它创建对象但不销毁它。

GameObject newGameObject = null;
if (x > 3.14)
        {
            if (newGameObject != null && newGameObject.scene.IsValid())
            {
                Destroy(newGameObject);
                newGameObject = GameObject.Instantiate(object1);
            }
            else
            {
                newGameObject = GameObject.Instantiate(object1);
            }

        }
else
        {
             Destroy(newGameObject);
        }

当多次运行时,对象永远不会破坏,而是堆叠,我可以看到它们在层次结构中没有被破坏。

我已经尝试给 newGameObject 一个标签,这样我就可以销毁被标记的项目并且它没有标记任何克隆。

我尝试找到游戏对象的名称+“(克隆)”并销毁它们,但它没有让我这样做。

我已经尝试添加 1f 计时器,destroy(newGameObject,1f) 不会破坏游戏对象。

【问题讨论】:

  • 这是Update 的一部分?当您多次声明对象时,这很奇怪......
  • 它是 onclick 的一部分,但它可能是更新的一部分,我认为它可以在更新中用于检查更新源的值。
  • 我写的GameObject是一个错字

标签: c# unity3d instantiation destroy gameobject


【解决方案1】:

如果代码都是 OnClick 回调的一部分,那么这就是您不销毁任何对象的原因:

罪魁祸首是您在方法内定义了GameObject newGameObject = nullnewGameObject 的值在方法内将始终为 null,因此语句 if (newGameObject != null && newGameObject.scene.IsValid()) 将始终返回 false,因为 newGameObject 始终为 null,这就是您看到所有这些 GameObjects 被实例化的原因。 if(x > 3.14) 失败的情况不会破坏任何东西,因为您试图破坏 newGameObject,这是 null。

为了能够销毁对象,您需要一个类字段来存储对最后生成的 GameObject 的引用。

您的 MonoBehaviour 将如下所示:

public class MyBehaviour : MonoBehaviour
{
    private GameObject newGameObject;

    /* other useful code */

    public void OnClick(){
        if (x > 3.14)
        {
            if (newGameObject != null && newGameObject.scene.IsValid())
            {
                Destroy(newGameObject);
                newGameObject = GameObject.Instantiate(object1);
            }
            else
            {
                newGameObject = GameObject.Instantiate(object1);
            }
        }
        else
        {
             Destroy(newGameObject);
        }
    }
}

【讨论】:

  • 非常感谢。移除游戏对象 newGameObject = null;并将其声明为私有修复它,它现在可以完美运行。
【解决方案2】:
GameObject newGameObject = null;
if (x > 3.14)
        {
            if (newGameObject != null && newGameObject.scene.IsValid())
            {
                Destroy(newGameObject);
                newGameObject = GameObject.Instantiate(object1);
            }
            else
            {
                newGameObject = GameObject.Instantiate(object1);
            }

        }
else
        {
             Destroy(newGameObject);
        }

试试这个。每次你在destroy后创建一个新对象时,都会创建一个新对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    相关资源
    最近更新 更多