在静态方法中无法访问Destroy()方法
public static void Die()
{
Destroy(gameObject);
}
但是只有在以下情况下才能访问Destroy():
public void Die()
{
Destroy(gameObject);
}
答案 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'类型。*