CancelInvoke()如何统一工作

Jaj*_*jan 5 c# unity-game-engine

所以我想了很多关于措辞这个线程的标题,但不知何故最终得到了一个愚蠢的问题.

我想做的事 :

我想重构我的代码,以便我可以用我自己的方法(Routine)替换所有Invoke(字符串,秒)调用IEnumerator WaitAndExecute(float time, Action callback),等待"time"秒并执行"回调".

原因:我不想将方法作为字符串传递,因为它很难在IDE中找到引用.

问题:我的CancelInvoke()不适用于没有Invoke()的情况下执行的方法.

所以我想知道Unity如何跟踪事物的跟踪和被调用方法的引用以便以后取消它们.

Eve*_*rts 1

以下只是假设。

最有可能的是,当您调用 Invoke(string, float); 时 Unity添加了一个字符串、对象类型的字典条目。这允许运行任何签名。另一方面,越通用则精度越低。

字符串大概是用来对对象进行反射,看看是否可以添加方法:

MethodInfo mi = this.GetType().GetMethod(methodName);
if(mi != null){
    // Create Delegate
    // Add to dictionary or other collection
}
Run Code Online (Sandbox Code Playgroud)

每一帧,它都会迭代所有条目,并在计时完成时运行它们。然后删除该条目。

当您调用 CancelInvoke(string); 时 它检查该条目是否存在并将其删除。

如果你想处理协程,你可能需要使用:

IEnumerator coroutine = null;
IEnumerator MyCoroutine(){ yield return null; }

void Start(){
    coroutine = MyCoroutine();
    StartCoroutine(coroutine);
    StopCoroutine(coroutine);
    coroutine = null;
}
Run Code Online (Sandbox Code Playgroud)

请注意,该模式的内部功能很可能类似于带有等待运行的 IEnumerator 集合的调用。