Unity3d 在公共静态函数Unity中调用Invoke

Unity3d 在公共静态函数Unity中调用Invoke,unity3d,invoke,static-functions,Unity3d,Invoke,Static Functions,我犯了一个我不明白的错误。我的代码的简化版本: using UnityEngine; public class RunLater : MonoBehaviour { public static void Do() { Invoke("RunThisLater", 2.0f); } public void RunThisLater() { Debug.Log("This will run later"); } }

我犯了一个我不明白的错误。我的代码的简化版本:

using UnityEngine;
public class RunLater : MonoBehaviour
{
    public static void Do()
    {
        Invoke("RunThisLater", 2.0f);
    }

    public void RunThisLater()
    {
        Debug.Log("This will run later");
    }

}

一种方法是让类的静态部分存储对自身的单行为引用。像这样:

public class RunLater : MonoBehaviour
{
    public static RunLater selfReference = null;

    public static void Do()
    {
        InitSelfReference();
        selfReference.DoInstanced();
    }

    static void InitSelfReference()
    {
        if (selfReference == null)
        {
            // We're presuming you only have RunLater once in the entire hierarchy.
            selfReference = Object.FindObjectOfType<RunLater>();
        }
    }

    public void DoInstanced()
    {
        Invoke("RunThisLater", 2f);
    }

    void RunThisLater()
    {
        Debug.Log("This will run later");
    }
}
public类RunLater:monobhavior
{
公共静态RunLater selfReference=null;
公共静态void Do()
{
InitSelfReference();
selfReference.DoInstanced();
}
静态void InitSelfReference()
{
if(selfReference==null)
{
//我们假设您在整个层次结构中只有一次RunLater。
selfReference=Object.FindObjectOfType();
}
}
public void DoInstanced()
{
调用(“RunThisLater”,2f);
}
void RunThisLater()
{
Log(“这将在以后运行”);
}
}

现在,您可以从其他游戏对象代码中的任意位置调用RunLater.Do()。祝你好运

您可以将其作为如下参数传入:

public class RunLater : MonoBehaviour
{            
    public static void Do(RunLater instance)
    {
        instance.Invoke("RunThisLater", 2.0f);
    }

    public void RunThisLater()
    {
       Debug.Log("This will run later");
    }
}

正确的“runthislater”不是静态的,因此在您的类中没有可调用runthislater的实例..BugFinder那么我现在应该怎么做?使RunThisLater也是静态的,或者从Do function中删除静态的?这在一定程度上取决于您以后打算如何使用它…..您可以将引用传递给所属对象。。。例如,当您调用Do时,您可以像Do(MyBehavior)一样将一个参数传递给monobheaviour,当然您需要修改您的方法以接受一个参数,尽管名称
selfReference
有点误导。。它应该是
instance
singleton
,因为它实际上就是这样的。只有当monobhavior是singleton时,这才有效。。。。如果同一脚本有多个实例呢?@derHugo可能
selfInstance
?(澄清它是一个什么实例。)@JonathanAlfaro是的,你是对的,我在我的代码注释中试图澄清这个限制——以防它对询问者来说已经足够了。如果我想从另一个类调用它,那么我将如何调用?那么你必须从层次结构中获取实例。。。。把它传过来。不管你怎么做;如果要从静态方法内部调用实例方法,则需要访问该实例。另一个选择是不使方法成为静态的,而只是使用GetComponent或Find或FindWithTag从另一个类获取对实例的引用。。。或类似的。