2017-02-09 86 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); 
    }