遅延して処理をする

遅延してメソッドを発火させる方法はいくつもあります。 状況に応じて使い分けましょう。

Invokeを使う方法

1
2
3
4
5
6
7
8
void Start()
{
  Invoke("DelayMethod", 1.0f);
}
void DelayMethod()
{
  Debug.Log("Invoke");
}

StartCoroutineを使う方法

1
2
3
4
5
6
7
8
9
void Start()
{
  Coroutine coroutine = StartCoroutine("DelayMethod", 1.0f);
}
private IEnumerator DelayMethod(float waitTime)
{
  yield return new WaitForSeconds(waitTime);
  Debug.Log("StartCoroutine");
}

StopCoroutine (coroutine);で止めることができる。

StartCoroutineを使う方法(関数をアロー関数で指定したい場合)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
void Start()
{
  Coroutine coroutine = StartCoroutine(DelayMethod(1.0f, () => {
    Debug.Log("StartCoroutine");
  }));
}
private IEnumerator DelayMethod(float waitTime, Action action)
{
  yield return new WaitForSeconds(waitTime);
  action();
}

StartCoroutineを使う方法(関数をアロー関数で指定し、引数も渡したい場合)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
void Start()
{
  Coroutine coroutine = StartCoroutine(DelayMethod(1.0f, (int id) => {
    Debug.Log("StartCoroutine: "+id);
  }, 0));
}
private IEnumerator DelayMethod<T>(float waitTime, Action<T> action, T t)
{
  yield return new WaitForSeconds(waitTime);
  action(t);
}

ラッパークラスを作る方法

DelayUtil.cs

1
2
3
Coroutine coroutine = DelayUtil.Delay (1.0f, (int id) => {
  Debug.Log ("DelayUtil.Delay: "+id);
}, 10);

キャンセルはDelayUtil.Stop(coroutine);

MonoBehaviourを拡張する方法

MonoBehaviorExtentsion

1
2
3
Coroutine coroutine = this.Delay(1.0f, (int id) => {
  print("Delay: "+id);
}, 0);

DOTweenを使う方法

1
2
3
DOVirtual.DelayedCall (1.0f, () => {
  print ("DOVirtual.DelayedCall");
});

UniRxを使う方法

Timerを使用する方法

1
2
3
4
Observable.Timer(TimeSpan.FromSeconds(1.0f))
  .Subscribe(_ => {
    print("UniRx Observable.Timer");
  });

TimerFrameを使用する方法

1
2
3
4
Observable.TimerFrame(1)
  .Subscribe(_ => {
    print("UniRx Observable.TimerFrame");
  });

Delayを使用する方法(引数が無い時)

1
2
3
4
5
Observable.Return(Unit.Default)
  .Delay(TimeSpan.FromSeconds(1.0f))
  .Subscribe(_ => {
    print("UniRx Observable.Delay");
  });

Delayを使用する方法(引数を渡したい時)

1
2
3
4
5
Observable.Return(0)
  .Delay(TimeSpan.FromSeconds(1.0f))
  .Subscribe((int id) => {
    print("UniRx Observable.Delay: "+id);
  });