渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

DOTweenに用意されている遅延実行が便利


f:id:esakun:20150825162207p:plain

環境

  • Unity5.4.2f1
  • DOTween 1.1.340

ところで『数秒後にHoge関数を実行する』みたいな遅延実行処理を実装する場合、数パターンの方法が思い浮かびます。

※例として1秒後にHoge()を呼ぶ

1.MonobehaviourクラスのInvokeを使う

Invoke ("Hoge", 1f);

※引数を持つことは不可

2.コルーチンを使う

IEnumerator Start()
{
    yield return new WaitForSeconds (1f);
    Hoge ();
}

※コード量まあまあ多い

3.Updateで指定秒数待機する

float s = 0;
bool isExecuted = false;
void Update () {
    s += Time.deltaTime;
    if (s >= 1f && isExecuted == false)
    {
        Hoge ();
        isExecuted = true;
    }
}

※コルーチンよりコード量増えるしコードが分散するレガシーなコード

4.UniRxを使う

Observable.Timer(TimeSpan.FromMilliseconds(1000))
    .Subscribe(_ => Hoge());

※シンプルで今風なコード

他にも方法はあると思いますが、今回はサクッと使えるDOTweenの遅延実行関数の紹介をします。

DOVirtualクラス

あまり見かけないクラスを使います。

DOVirtual.DelayedCall (1f, ()=>Hoge());

先の遅延実行はこの一行で実装できます。 非常にわかりやすいソースコードです。

キャンセル、スキップも簡単

IEnumerator Start () {
    // 10秒後に実行予定だが1秒後に実行する
    var tw = DOVirtual.DelayedCall (10f,()=>Hoge());
    yield return new WaitForSeconds (1f);
    // 引数にtrueを入れるのをお忘れなく!
    tw.Complete (true);
}

遅延実行するときにはキャンセルとスキップが重要になりますが、こちらも通常のTweenと同様です。
Tweenインスタンスを変数に保持してスキップする場合は、上記のようなソースコードで実行できます。
※Completeの引数にtrueを入れるのをお忘れなく

キャンセルする場合は、以下のいずれかでOKです。

tw.Kill();
// 引数はfalse or 無し
tw.Complete();

内部的にはどうなってるのか?

public static Tween DelayedCall (float delay, TweenCallback callback, bool ignoreTimeScale = true)
{
    return DOTween.Sequence ().AppendInterval (delay)
        .OnStepComplete (callback)
        .SetUpdate (UpdateType.Normal, ignoreTimeScale)
        .SetAutoKill (true);
}

内部的にはSequenceインスタンスにAppendIntervalを噛ませているだけでしたので動作的には安心して使えるとは思います。

同時に大量の遅延処理などで処理負荷的にコストになりそうであれば、自前でもっと軽量なDelayedCallを作ったほうが良いと思います。

しかし数行で管理が楽な遅延処理を書け、可読性も高いのでDOTweenユーザーは普通に使って問題ないと思います。

あわせてどうぞ

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info