2017-02-09 88 views
1

我有各种方法工作正常,但我想打电话给他们只有一段时间后。为了避免编写一个不同的方法所有这些我认为它更有利于Invoke他们以某种方式。我制定了这些方法,以便排除UnitytimeScale,因此他们总是使用自定义构建的短函数等待Real secondsC#自定义调用方法来调用各种其他方法

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我在另一个项目中用于UI等待游戏停止时,那很好。 正如我所说我有很多方法调用,所有他们返回void并有一个参数MonoBehaviour。目前它没有做任何事情,我不知道为什么。

+0

这是所有伟大的,但..还有已经是这个'公共无效调用(字符串methodName中,浮动时间);'内**统一API方法**,所以你可以叫它就像'Invoke(“MeFancyMethodName”,0.5);''和'MeFancyMethodName'将在'0.5'秒延迟后被调用。 –

+0

是的,但我**必须**通过'Monobehaviour',因为这些方法不是这样的后代。 AFAIK'Invoke(“Name”,time)'只能调用'void Name()'方法。 **编辑:** 他们不能'MonoBehaviours',因为我需要继承的力量,使这些方法发生。 – agiro

+0

是的,这是正确的。但是你仍然可以创建一个_“wrapper”_,它将调用方法,然后用以前指定的参数调用你的方法。这将比从头开始更容易:) –

回答

3

那么,我被转储足够忘记实际上启动协程。

在我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); 
    }