c# – Co-routine Wrapper不及时执行回调
发布时间:2020-12-15 07:52:01 所属栏目:百科 来源:网络整理
导读:好的,所以我非常清楚如何在Unity3d中使用协同例程 但我想为延迟执行创建一个可重用的组件,允许我这样做 拿这样的代码 StartCoroutine(WaitForDamageCooldown(DamageCooldown));IEnumerator WaitForDamageCooldown(float duration){ yield return new WaitFor
好的,所以我非常清楚如何在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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |