ユニティでタイマーを作るときには、そうでない大きな理由がない限り、常に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
を使い、進歩が変わったときに通知することを好みます。
あなたはUnityで 'TimeSpan.FromSeconds'を使ってタイマーを作る必要はないことを理解していますか?あなたは他のソリューションにオープンしているのですか、それとも 'TimeSpan.FromSeconds'である必要がありますか? – Programmer
'.Do(...)'演算子はあなたのために機能しますか? – Enigmativity
@Enigmativity私はこれを無駄にしようとしましたvoid Update(){ServeObservable.Do(x => Debug.Log(x));}観測可能なイベントが発生したときに.Do()が実行されるだけで、その進展の中で –