如何在Unity C#中从静态方法销毁对象

时间:2018-10-21 15:58:38

标签: c# unity3d static

在静态方法中无法访问Destroy()方法

  public static void Die()   
    {
        Destroy(gameObject);
    }

但是只有在以下情况下才能访问Destroy():

public void Die()
{
     Destroy(gameObject);
}

3 个答案:

答案 0 :(得分:3)

您不能从静态函数中调用非静态函数,但可以相反。

  

我需要使其可以在其他脚本上访问

使Die函数成为非static函数。假设此脚本名为OtherScript

public void Die()
{
     Destroy(gameObject);
}

然后从另一个脚本中,通过找到OtherScript脚本与GameObject.Find函数相连的GameObject,然后使用GetComponent函数获得{{1} }来自GameObject的参考:

OtherScript

您现在可以使用OtherScript otherScript; void Awake() { GameObject obj = GameObject.Find("NameOfGameObjectOtherScriptIsAttachedTo"); otherScript = obj.GetComponent<OtherScript>(); } 来调用Die函数。 请注意,您必须用otherScript.Die()脚本附加到的GameObject的名称替换“ NameOfGameObjectOtherScriptIsAttachedTo”。

答案 1 :(得分:0)

从您的评论看来,您似乎更想实际执行Programmer's answer所显示的内容。

我要添加的原因是您的标题要求How to Destroy Object from static method in Unity C#


如果您确实需要它是静态的(例如在静态类中),则可以这样使用它

using UnityEngine;

public static class SomeStaticClass
{
    public static void Die(GameObject obj)
    {
        Object.Destroy(obj);
    }
}

但老实说,在极少数情况下需要这样做。这可能会有所帮助,例如在没有任何组件执行代码的编辑器脚本中。

答案 2 :(得分:-1)

无法杀死单个static对象,它不能那样工作。请参考答案here.

以下摘录来自以上链接,应为您解释...

*我认为您可能误解了“静态”关键字。

需要澄清一下,想象一下……您有一个名为“车辆”的类。

非静态变量表示“每辆车都有该变量的副本”。我们可能会说“车辆的每个实例都有其自己的变量副本。

静态变量表示“所有车辆共享此值中只有1个”。在这里,我们要说“所有车辆实例共享该变量。

接着,函数很难显示,但是它们的工作方式大致相同:

非静态功能在车辆实例上运行。结果是它可以使用'this'运算符(很有意义!)并访问其实例的非静态成员变量和共享的静态变量

静态函数不与车辆的单个实例绑定,因此“ this”运算符没有任何意义(“ this”将是什么?)。能够访问静态变量仍然很有意义,但是非静态变量仍然没有意义-它要引用谁的变量版本?

您的“死亡”功能看起来像是在给定敌人实例上运行的。也就是说,您期望称呼“ Die”为“请杀死这个”。结果,它不应该是静态的。您还需要访问'gameObject'变量,而不是'GameObject'类型。*