Jaj*_*jan 5 c# unity-game-engine
所以我想了很多关于措辞这个线程的标题,但不知何故最终得到了一个愚蠢的问题.
我想做的事 :
我想重构我的代码,以便我可以用我自己的方法(Routine)替换所有Invoke(字符串,秒)调用IEnumerator WaitAndExecute(float time, Action callback)
,等待"time"秒并执行"回调".
原因:我不想将方法作为字符串传递,因为它很难在IDE中找到引用.
问题:我的CancelInvoke()不适用于没有Invoke()的情况下执行的方法.
所以我想知道Unity如何跟踪事物的跟踪和被调用方法的引用以便以后取消它们.
以下只是假设。
最有可能的是,当您调用 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 集合的调用。