C#Custom Invoke方法调用各种其他方法

时间:2017-02-09 09:55:40

标签: c# unity3d delay invoke

我有各种方法可以正常工作,但我想在延迟后调用它们。为了避免为所有这些编写不同的方法,我认为它对Invoke以某种方式更有益。我制作了这些方法,以便排除Unity timeScale,因此他们总是等待Real seconds,使用自定义构建的短函数。

WaitForRealSeconds

public class WaitForRealSecondsClass
{
    #region Wait for real seconds

    public Coroutine WaitForRealSeconds(float aTime, MonoBehaviour mono)
    {
        return mono.StartCoroutine(_WaitForRealSeconds(aTime));
    }
    private IEnumerator _WaitForRealSeconds(float aTime)
    {
        while (aTime > 0.0f)
        {
            aTime -= Mathf.Clamp(Time.unscaledDeltaTime, 0, 0.2f);
            yield return null;
        }
    }
    #endregion
}

我想Invoke Move function我的方式:

public void InvokeAnim(float timeBeforeStart, Action<MonoBehaviour> MoveFunction, MonoBehaviour mono)
{
    if (moveRoutine != null)
    {
        mono.StopCoroutine(moveRoutine);
    }
    moveRoutine = _InvokeAnim(timeBeforeStart, MoveFunction, mono);
}
IEnumerator _InvokeAnim(float timeBeforeStart, Action<MonoBehaviour> MoveFunction, MonoBehaviour mono)
{
    yield return new WaitForRealSecondsClass().WaitForRealSeconds(timeBeforeStart, mono);
    MoveFunction(mono);
}

Move(MonoBehaviour mono)本身:

public void Move(MonoBehaviour mono)
{
    if (moveRoutine != null)
    {
        mono.StopCoroutine(moveRoutine);
    }
    moveRoutine = _Move(from, to, overTime, mono);
    mono.StartCoroutine(moveRoutine);
}

我测试和工作的是Move本身,我在另一个项目中使用的WaitForRealSeconds用于在游戏停止时等待用户界面,当时就好了。 正如我所说,我有很多方法可以调用,所有方法都返回void并且有一个参数MonoBehaviour。目前它没有做任何事情,我不明白为什么。

1 个答案:

答案 0 :(得分:3)

Sod it,我倾倒了足以忘记实际开始那个协程。

在我的Invoke

        public void InvokeAnim(float timeBeforeStart, Action<MonoBehaviour> MoveFunction,
        MonoBehaviour mono)
    {
        if (moveRoutine != null)
        {
            mono.StopCoroutine(moveRoutine);
        }
        moveRoutine = _InvokeAnim(timeBeforeStart, MoveFunction, mono);
        mono.StartCoroutine(moveRoutine); //one line was missing
    }
    IEnumerator _InvokeAnim(float timeBeforeStart, Action<MonoBehaviour> MoveFunction,
        MonoBehaviour mono)
    {
        yield return new WaitForRealSecondsClass().WaitForRealSeconds(timeBeforeStart, mono);
        MoveFunction(mono);
    }