好的,所以我非常清楚如何在Unity3d中使用协同例程
但我想为延迟执行创建一个可重用的组件,允许我这样做
拿这样的代码
但我想为延迟执行创建一个可重用的组件,允许我这样做
拿这样的代码
StartCoroutine(WaitForDamageCooldown(DamageCooldown)); IEnumerator WaitForDamageCooldown(float duration) { yield return new WaitForSeconds(duration); HasTempInvincibility = false; }
把它转换成这样的东西
CoroutineUtil.DeferredExecutor(float waitTime,Action onComplete);
要像这样使用
StartCoroutine(CoroutineUtil.DeferredExecutor(WaitTime,() => { Debug.Log("DeferredExecutor wait complete"); HasTempInvincibility = false; }));
我已尝试在以下实现
using System; using System.Collections; using UnityEngine; public static class CoroutineUtil { public static IEnumerator DeferredExecutor(float waitDuration,Action onComplete) { yield return new WaitForSeconds(waitDuration); onComplete.Invoke(); } public static IEnumerator DeferredExecutor<T>(float waitDuration,T obj,Action<T> onComplete) { yield return new WaitForSeconds(waitDuration); onComplete.Invoke(obj); } }
我认为这可能无法作为静态工作我也试图将它添加到对象的类中
public class Player: MonoBehavIoUr { ///....etc IEnumerator DeferredExecutor(float waitDuration,Action onComplete) { yield return new WaitForSeconds(waitDuration); onComplete.Invoke(); } ///....etc }
结果是零星的.我不知道合作例程完成时的押韵或理由,但在预期的时间之后表现良好.
我的方法有问题吗?
解决方法
这确实有效,但是,与Unity3d中的其他协同程序一样,它反映了
Time.TimeScale的时间.因此,2秒不一定是2秒.(这是我的问题)
Time.TimesScale = 1.0f;
据说以下是我一直在实施它的方式.
public static IEnumerator DeferredExecutor(float waitDuration,Action onComplete) { yield return new WaitForSeconds(waitDuration); onComplete(); }
这就是我一直在使用它的方式.
StartCoroutine(CoroutineUtil.DeferredExecutor(2f,() => { _TimePause.OnPause(); GameOverCanvas.enabled = true; }));
这确实有效,但请确保您记住正确的调用约定.特别是StartRoutine