【Unity】ほんの数行! 簡単にウェイト処理を実装する方法4つ

どうも、個人ゲーム開発者のゆみねこです。

Unityで「○秒後に処理を呼び出したいなあ」ってこと、ありますよね。

  • 3,2,1,スタートの合図の後にゲームを開始する
  • 倒れてから3秒後にキャラクターを消滅させる
  • 一定間隔ごとにダメージ判定が出るダンジョンのギミック

などなど。

ウェイトを挟むにはいくつかの方法がありますが、初心者には難しいものもあるので、種類や使い方をまとめてみました。

この記事を読めば、もうウェイト処理で困ることはなくなります。

Time.deltaTimeでカウントする

Updateの中でTime.deltaTimeを加算する方法です。
一定値を超えたら、処理を呼び出すようにします。

コード

長所

  • コードがシンプルで、単純明快
  • どの環境でも実装できる
  • 負荷が軽い

短所

  • 1つの処理ごとに変数が1つ必要になる
  • 規模が大きくなると可読性が落ちる
  • Update内に記述する都合上、MonoBehaviourを継承しなければならない

まとめ

手っ取り早く実装できる反面、規模が大きくなると後々面倒なことになる方法です。ゲームジャムなどの短期的な開発でない限り、あまり使わないほうがいいでしょう。

ちなみに、Time.deltaTimeが何なのか分からない方は、以前くわしく書いた記事があるので参考にしてください。

ゆみねこブログ
ゆみねこブログ

コルーチンを使う

IEnumerator型のメソッドをStartCoroutineで呼び出し、yieldの戻り値で待機する方法です。
……と言われても初心者の方は意味不明だと思うので、深く考えずコードをご覧ください。

コード

  1. IEnumerator型のメソッドを作る
  2. StartCoroutineで呼び出す
  3. yield return new WaitForSecond( 秒); で、指定秒だけ待つことができる

Vanishメソッドを呼び出すと、アタッチされたGameObjectが1秒後に非アクティブになります。

長所

  • Time.deltaTimeと比べ、変数いらずでコードがすっきりする
  • どの環境でも実装できる

短所

  • 中断や再開が難しく、融通が利かない
  • 結果を受け取るのが苦手で、やっぱり融通が利かない
  • MonoBehaviourを継承し、かつActiveな状態でないと呼び出せない
  • いちいち専用のメソッドを作らないといけない

まとめ

Time.deltaTimeよりは合理的な実装だけど、やっぱり後々面倒になりやすい方法です。

2年ぐらい前までは積極的に採用されていた方法ですが、今となっては古い技術なので、敢えて選ぶ理由はうすいです。
作業環境が古いときにはいいかもしれません。

スポンサードサーチ

async / await を使う

一番新しく、イケている方法です。
深く理解するのはかなり難しいですが、取っかかりであれば非常にシンプルなコードでまとまります。

コード

  1. メソッドにasync修飾子をつける
  2. awaitで待機する

これだけです。超シンプルですね。

コルーチンの時と同様、Vanishを呼び出すとアタッチしたGameObjectを非アクティブにします。

長所

  • 実装が簡単
  • コードがシンプルで可読性が高い
  • なんかできるプログラマー感がある

短所

  • やっぱり中断が難しい
  • C#7.0 以降の機能なので、Unity2018.3以降じゃないと実装できない
  • 深く理解しようとするとクッソ難しい
  • Task処理はWebGLだと動かない

フォロワーさんから「WebGLでは動作しない」というご指摘をいただきました、ありがとうございます。

WebGLで使いたい場合、async / await をよりUnity向けに最適化したUniTaskをご使用ください。

ゆみねこブログ
ゆみねこブログ

まとめ

Unity C#だけで組むなら、一番イマドキで手っ取り早い方法です。
反面、奥が深く思わぬバグに直面する可能性があります。

また、WebGLでは動作しないので、unityroomで公開する作品には使えないのも注意しましょう。

手当たり次第に使わずに、簡単なところから慣らしていくのがおすすめ。

DOTweenを使う

アセット頼りになりますが、DOTweenを使うと簡単にウェイトを実装できます。

今回の用途なら無料版でOKですが、多機能な有料版もあります。

DOTween Pro (アセットストア)

コード

1秒後にDoSomethingメソッドを呼び出します。

長所

  • キャンセルや完了が簡単
  • コードが短くてスッキリする

短所

  • アセット頼りなので、共同開発だと使えないことがある
  • デリゲートを使うので、初心者はなじみがない記述に戸惑う
  • ウェイト1つのためだけにアセットを導入するのも仰々しい

まとめ

外部アセットを使うことに不都合がないのなら、一番簡単な方法です。

例えば社内開発であれば無断で使うわけにはいかないし、就職用の作品であれば自力で実装した場合と比較してどうしても見劣りします。

それらをクリアできるなら、シンプルで応用力も高いので一番おすすめできます。

まとめ

以上、ウェイト方法のまとめでした。

ぼくはちょっとしたウェイト処理ならasync / await を使い、キャンセルなどが絡む場合や処理が複雑でしんどい時はDOTweenを使っています。

記事をシェアする