Unityでプログラムを組んでいるなかで一つ気がつきました。
それは一般によくあるタイマー処理というものがないということです。つまり、発火する時間と発火したときに行う処理を設定するだけ、といったようなインタフェースがないようなのです。
調べてみると、ほとんどの解決策としてGameObjectのUpdateメソッドで毎回経過時間をカウントし、期待する時間になったときに処理を行うようにしている、とのことです。
これをヒントに複数のタイマを仕掛けられる汎用クラスを作成しました。スクリプトをシーン内のGameObjectにアタッチするだけで動作します。
タイマーのキャンセルなどはなく、必要最低限の処理にしています。利用者はSetメソッドで発火時の処理(onFinishDelay)と発火時間(delay)を設定するのみです。
using System.Collections;
using System.Collections.Generic;
public class MyTimer : MonoBehaviour
{
public delegate void MyTimerDelegate ();
public class MyTimerParam
{
MyTimer.MyTimerDelegate onFinishDelay;
float delay;
public MyTimer.MyTimerDelegate OnFinishDelay {
set {
this.onFinishDelay = value;
}
get {
return this.onFinishDelay;
}
}
public float Delay {
set {
this.delay = value;
}
get {
return this.delay;
}
}
}
List<MyTimer.MyTimerParam> parameters;
// Use this for initialization
void Start ()
{
parameters = new List<MyTimer.MyTimerParam> ();
}
// Update is called once per frame
void Update ()
{
List<MyTimer.MyTimerParam> deleteParameters = new List<MyTimer.MyTimerParam> ();
foreach (MyTimer.MyTimerParam param in parameters) {
param.Delay -= Time.deltaTime;
if (param.Delay <= 0) {
param.OnFinishDelay ();
deleteParameters.Add (param);
}
}
foreach (MyTimer.MyTimerParam param in deleteParameters) {
parameters.Remove (param);
}
}
public MyTimer.MyTimerParam Set (MyTimer.MyTimerDelegate onFinishDelay, float delay)
{
MyTimer.MyTimerParam param = new MyTimer.MyTimerParam ();
param.OnFinishDelay = onFinishDelay;
param.Delay = delay;
this.parameters.Add (param);
return param;
}
}