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从另一个类获取对实例的引用。。。或类似的。