2017-11-20 7 views
0

現在、私は、私は、これは時間が残り観測オフに基づいてカウントダウンを表示したいと思いますが、見つけることができませんObservable.Timerの「進捗状況」を入手する方法はあります

Observable.Timer(TimeSpan.FromSeconds(5)) 
      .Subscribe(x => MessageBroker.Default.Publish(new Messages.Serve())); 

予想通り、この作業を持っていますタイマーの現在の値にアクセスする方法。

これを行うには、すべてをラッピングして、進捗状況を別に追跡する必要はありませんか?

+0

あなたはUnityで 'TimeSpan.FromSeconds'を使ってタイマーを作る必要はないことを理解していますか?あなたは他のソリューションにオープンしているのですか、それとも 'TimeSpan.FromSeconds'である必要がありますか? – Programmer

+0

'.Do(...)'演算子はあなたのために機能しますか? – Enigmativity

+0

@Enigmativity私はこれを無駄にしようとしましたvoid Update(){ServeObservable.Do(x => Debug.Log(x));}観測可能なイベントが発生したときに.Do()が実行されるだけで、その進展の中で –

答えて

2

ユニティでタイマーを作るときには、そうでない大きな理由がない限り、常にUnity APIを最初に使ってみてください。カウントダウンタイマーを作成する場合は、毎フレームTime.detalTimeでタイマー変数を減らしてください。これは、Updateまたはコルーチン関数で実行できます。これの複数のインスタンスを使用できるようにするには、独自のクラスに配置します。

public struct CountDownTimer 
{ 
    private static int sTimerID = 0; 
    private MonoBehaviour monoBehaviour; 

    public float timer { get { return localTimer; } } 
    private float localTimer; 

    public int timerID { get { return localID; } } 
    private int localID; 

    public CountDownTimer(MonoBehaviour monoBehaviour) 
    { 
     this.monoBehaviour = monoBehaviour; 
     localTimer = 0; 

     //Assign timer ID 
     sTimerID++; 
     localID = sTimerID; 
    } 

    public void Start(int interval, Action<float, int> tickCallBack, Action<int> finshedCallBack) 
    { 
     localTimer = interval; 
     monoBehaviour.StartCoroutine(beginCountDown(tickCallBack, finshedCallBack)); 
    } 

    private IEnumerator beginCountDown(Action<float, int> tickCallBack, Action<int> finshedCallBack) 
    { 
     while (localTimer > 0) 
     { 
      localTimer -= Time.deltaTime; 
      //Notify tickCallBack in each clock tick 
      tickCallBack(localTimer, localID); 
      yield return null; 
     } 

     //Notify finshedCallBack after timer is done 
     finshedCallBack(localID); 
    } 
} 

使用

//Create new Timer 
CountDownTimer timer = new CountDownTimer(this); 

//What to do each second time tick in the timer 
Action<float, int> tickCallBack = (currentTime, timerID) => 
{ 
    Debug.Log("Time Left: " + currentTime + " ID: " + timerID); 
}; 


//What to do when timer changes 
Action<int> finshedCallBack = (timeriD) => 
{ 
    Debug.Log("Count Down Timer Done! ID: " + timeriD); 
}; 

//Start Countdown Timer from 5 
timer.Start(5, tickCallBack, finshedCallBack); 

ご希望の場合は、CountDownTimer.timer変数でいつでもタイマーの進行状況をアクセスすることができます。しかし、私は上記のようにActionを使い、進歩が変わったときに通知することを好みます。

+0

ありがとう!それは処理することがたくさんあるし、私は確かにそれを理解したい。明日の夜、それを試してみてください。 –

+1

問題ありません。試してみたら、いつでも質問をすることができます。 – Programmer

関連する問題