Unityで遅延処理をする方法色々

Unityは遅延処理を実現する方法がたくさんあってどれにしようか迷う事が多いのでメモメモ。


Invokeを使う方法

一番簡単に実装できる。けど引数を渡す事ができないのが難点。


StartCoroutineを使う方法

StartCoroutineはコルーチンの中で一定時間中断する処理を実行する。

呼び出される関数の方は内部でyield return を実行して IEnumerator のインスタンスを返す必要がある。

StartCoroutineに渡すメソッドには遅延時間を引数として渡せるようにしておくと便利。

キャンセルしたい場合には Coroutine coroutine = StartCoroutine() で返ってくるコルーチンに StopCoroutine (coroutine); を実行する事で止める事ができる。

また、下記のように仲介するメソッドを一つ作成しておけばアロー関数で書くことができるようになるのでさらに便利。

さらにIEnumeratorのメソッドの方に引数を渡す処理を書けば intstring などの引数を渡すことができるようになるのでもっと便利。


ラッパークラスを使う方法

また、小規模なプロジェクトで毎回色々処理を書くのが面倒な時などには、前述のコルーチンの処理を使用した自分用のオレオレラッパークラスを作成する方法もある。

DelayUtil.cs

ラッパークラスを使用すると下記のように簡単に記載できるようになるのでコードの可読性も上がるし、カスタマイズすれば自分好みの使用方法で遅延処理を実行する事ができるようになる。

この例ではラッパークラスの中でGameObjectを作成し、その中でコルーチン処理を行っているので、キャンセルを実行したい場合には同じくラッパークラスのキャンセル用の関数DelayUtil.Stop(coroutine);を呼び出す必要がある。


MonoBehaviourを拡張する方法

また、拡張メソッドをモリモリ使っているようなプロジェクトの場合、MonoBehaviourを拡張する事でさらに簡単に書くこともできるようになる。

MonoBehaviorExtentsion.cs

MonoBehaviorExtentsion.csの中ではMonoBehaviourを拡張し、Delayというメソッドを追加して、内部で前述の例と同様に作成したDelayMethodを呼び出すようにしている。


DOTweenを使う方法

DOTweenを入れているプロジェクトの場合には、ラッパークラスや拡張を行わなくてもDOTweenで用意されている関数を利用して遅延処理を行う事ができる。


UniRxを使う方法

またUniRxを入れているプロジェクトの場合にも同様にUniRxに用意されている関数を利用して遅延処理を行う事ができる。

TimerTimerFrameを使用して遅延させSubscribeで実行する方法と

Delayを使用する方法がある。