好的,所以我非常清楚如何在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