こんにちは「DOTweenの教科書」執筆者のオオバです。

ゲーム開発中「数フレーム待機して何かしたい」っていうときありますよね。

さまざまな手段を思いつくと思いますが、今回紹介するのは 「DOTween」 を使った方法です。コード量も少なくサクッと書けます。Unityで少し処理を待機する手段のレパートリーを手に入れてみませんか。ぜひ最後まで読んでみてください。

DOTweenのDOVirtualクラスが便利

結論を簡単にまとめます。

DOTweenのDOVirtualが便利
  • DOVirtualクラスの待機メソッドを使う
  • 秒数指定で待機する
  • TimeScaleに依存するしないの選択が可能である

DOTweenの「DOVirtual」を使うことで、少しの間待機するといった処理が簡単に実装できます。

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

この1行だけで「1秒後」に Hogeメソッド が呼ばれます。とてもシンプルです。またキャンセル処理、この指定秒数をTimeScaleに依存させるかどうかも設定可能です。

使用上、注意点も存在しますので、ぜひ最後まで読んでみてください。

→11万文字で徹底解説した「DOTweenの教科書」Unityアニメーションの超効率化ツールはこちら

Unityで少しの間待機させる方法

Unityでゲームを開発中「少しの間待機させたい」という場面はよく発生します。特にゲーム演出を作るときです。
例えばUIの全要素を一度に表示すると情報が多すぎてユーザーに伝わらないため、左の要素から順番に時間差で表示させる。といったケースです。

この「少しの間待機する」実装は意外と悩みがち。なぜなら最適解がないからです。Unityで実装する場合以下の方法が思いつきます。

もちろん上記のやり方を採用しても問題ありません。この記事の主旨はあなたの手持ちの手段を増やすことです。今回紹介するのは 「DOTweenの待機メソッド」 です。

そもそもDOTweenはアニメーションライブラリでは?

DOTweenとはUnityでプログラミングでアニメーションを作る定番ライブラリですが、今回紹介するような遅延処理という便利機能も提供しています。DOTweenはAssetStoreで 無料 で提供されているため、どなたでも気軽に使用できます。DOTweenの特徴はなんといっても 数行のコードで複雑なアニメーションを実装できることと、柔軟な拡張性 です。

オオバは10年以上DOTweenを使い続けてきていますが、未だに現役で、しばらくDOTweenに代わるものは出てこないのではというくらい素晴らしいツールです。まだ使ったことがない方は↓こちらからインストールしてみてください。

【Unity】DOTweenをインストールする2種類の方法

便利な遅延処理DelayedCall

DOTweenにはDOVirtualというクラスが用意されています。このクラスの中に DelayedCall という遅延メソッドが用意されているのです。サンプルコードから見ていきましょう。

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

たった1行で遅延処理を実装できます。非常にわかりやすいソースコードです。引数の内訳は以下。

引数内容
第1引数待機時間(秒)
第2引数待機後実行したい関数
第3引数タイムスケール非依存フラグ(後述)

手放しでぜひ使ってほしいという気持ちはやまやまですが、落とし穴もあるため共有します。

DelayedCallの第3引数は落とし穴!falseを推奨

DelayedCallメソッドの落とし穴は「第3引数のタイムスケールの非依存フラグ」です。値をセットしなければデフォルトで「true」がセットされます。つまりDelayedCallの待機時間はデフォルトでタイムスケールに依存しないのです。

「タイムスケール」とは1フレームにかかる時間に影響します(タイムスケールのデフォルト値は1)。FPS30の場合、1秒÷30フレームで1フレーム当たり「0.03秒」かかります。もしタイムスケールが0.5になると、1フレームは約0.016秒になるのです。

1秒に30フレーム使うことは変わりませんが、1フレームに使う時間が小さくなるため、スローモーションな状態になります。

DelayedCallはデフォルトがタイムスケール非依存

ここでDelayedCallの第3引数の話に戻ります。もしデフォルト値「true」の場合、タイムスケールに依存しません。例えばタイムスケールを0にして、1フレームにかかる時間が0になってもDelayedCallは動作し続けてしまうということです。

この仕様で都合が良いケースもあります。例えばゲームのポーズです。ポーズをタイムスケールで操作している場合は、ポーズ中に動かしたいオブジェクトはタイムスケールに依存しない処理が必要になるからです。

しかし問題はそこではありません。 DOTweenのデフォルトはタイムスケール依存です。 なぜかDelayedCallのデフォルトはタイムスケール非依存。DOTweenとあわせて使うことの多いDelayedCallですので、タイムスケールの違いには十分注意しましょう。

結論、DelayedCallの第3引数は「false」を入れると良いです。

ちなみにタイムスケールはコルーチンにも影響を与えます。例えば WaitForSeconds はタイムスケールを0にすると完全に停止します。非同期処理を実装するときに使うコルーチンについて次の記事で詳しく解説していますのであわせて呼んでみてください。

DelayedCallはキャンセルやスキップ処理も簡単

DelayedCallはコード量が少ないだけでなくDOTweenの機能を継承しているメリットがあります。遅延実行するとき キャンセルとスキップが重要 です。DOVirtualは通常のDOTweenと同じです。

10秒待機するDelayedCallを実行して1秒後にスキップして関数が呼ばれる処理を作ってみました。次のサンプルコードを見てください。

💻ソースコード : DOVirtualのスキップサンプル
IEnumerator Start () {  
    // 10秒後にHogeが呼ばれるDelayedCallを実行  
    var tw = DOVirtual.DelayedCall (10f,()=> Hoge());  

    // 1秒待機  
    yield return new WaitForSeconds (1f);  

    // DelayedCallがスキップ※Completeにの引数にtrue必須  
    tw.Complete (true);  
}

DelayedCallの戻り値はTweenインスタンスです。通常のDOTweenの戻り値と同じなのです。つまりキャンセル、スキップはおなじみの「Killメソッド」「Completeメソッド」を使えばよいというわけです。それぞれ以下の表にまとめました。

メソッドスキップキャンセル
Kill×
Complete(false)×
Complete(true)×

通常のDOTweenと使い勝手が同じであることがDelayedCallの強みです。

DelayedCallの内部処理は「Sequence」

結論から話すと、DelayedCallの内部処理はSequenceです。つまり安心して使える既存システムだということです。DelayedCall用に新システムが用意されているわけではないのです。安心して使ってください。

具体的には以下のようなコードで実装されています。

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

DelayedCallの招待ははSequenceの AppendInterval です。動作的には安心して使えるということが分かります。

より深くDelayedCallについて知りたい方は弊著:DOTweenの教科書を参考にしてみてください。

DOTweenの遅延実行まとめ

この記事ではDOTweenが用意する遅延実行機能について解説しました。簡単に内容をまとめます。

DOTweenの遅延実行まとめ

①DOVirtualクラスのDelayedCallメソッドが便利

②DelayedCallはたった1行で遅延処理が書ける

③注意点はDelayedCallの第3引数

④DelayedCallの中身はSequenceのため安心して使える

こんな感じです。

スピードが求められる開発で、素早い 演出のタイミング調整 を求められるときがあります。クオリティを上げるためには開発スピードが重要です。サクッと調整したいときにDOVirtualの出番です。DOTweenと同じ感覚で処理を書けてしまう点がとてもGOOD。キャンセルやスキップ処理もおなじみの書き方で実装できて開発効率を上げてくれます。
DelayedCallの注意点は第3引数。DOTweenはデフォルトでタイムスケール依存に対し、DelayedCallだけはタイムスケール比依存です。第3引数には基本falseを指定して作業すると事故率減りますのでおすすめです。

ゲーム開発よくある「少し待つ」手段の1つとしてストックしていただけると良いかなと思います。

この記事があなたのゲーム開発に少しでもお役に立てたら嬉しいです。

「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
ぜひチャンネル登録をお願いします!

最後まで読んでいただきありがとうございました!
すばらしいDOTweenライフをお過ごしください。

オススメ記事
検証環境