この記事は
『プログラミング完全未経験からUnityでの開発現場に迎え入れてもらえた世界一の幸せ者』
の記事です。そのつもりでお読みください。
##Invokeで秒数指定
Invoke("メソッド名",秒数);
で指定した秒数後にメソッドを呼び出します。
いちいちメソッド作らないといけないのであまり使わないですが、
時間差の処理が少ないのなら一番手っ取り早いですね。
##Coroutineで処理を遅らせる
コルーチンはいろいろな条件を指定して処理を遅らせたり、中断したり、再開したりできます。
他にも~秒後する
とか、条件がtrueになったら再開
など非常に便利なので日々感謝してます。
便利な分、コルーチンの使い方は少しだけ面倒です。
まず、IEnumerator 自分で考えたコルーチンの名前()
を書いて、その中に処理を書きます。
これだけでは、処理は行われません。コルーチンはスタートさせてあげる必要があります。
StartCoroutine(自分で考えたコルーチンの名前())
でコルーチンがスタートします。
コルーチンの名前は文字列にして指定してもOKです。
こんな感じ→StartCoroutine("自分で考えたコルーチンの名前")
コルーチンは中の処理をループして使用することで
同じ処理を一定間隔で繰り返すことができます。
そのため、コルーチンを止めたい方法も存在します。
StopCoroutine(自分で考えたコルーチンの名前())
もしくは
StopCoroutine("自分で考えたコルーチンの名前")
です。
文字列でないタイプのStopCoroutineでコルーチンを止めるには以下のようにする必要があります。
// ケース1
var coroutine = StartCoroutine(自分で考えたコルーチンの名前()); // コルーチン開始
StopCoroutine(coroutine); // コルーチン停止
// ケース2
var ienumerator = 自分で考えたコルーチンの名前();
StartCoroutine(ienumerator); // コルーチン開始
StopCoroutine(ienumerator); // コルーチン停止
のようにコルーチンメソッドの結果、もしくはStartCoroutineの結果を渡す必要があります
↑コメントにて修正頂きました!私のよりはるかにわかり易いじゃないか...w
私がよく使うのはこの三つです。
コード | 機能 |
---|---|
yield return new WaitForSeconds(秒数); | 指定秒数待つ |
yield return new WaitUntil(条件); | 条件がtrueで再開 |
yield return new WaitWhile(条件); | 条件がfalseで再開 |
###yield return new WaitForSeconds(秒数);
これが一番わかりやすいですね。指定した秒数後に処理を行います。
IEnumerator JibundeKangaetaYatsu()
{
yield return new WaitForSeconds(3.0f);
//遅らせたい処理
}
JibundeKangaetaYatsu()
をどこかで
StartCoroutineしてあげれば3秒後に処理が走ります。
###yield return new WaitUntil(条件);
条件の部分がtrueになったらコルーチンを再開します。
これはコルーチンをループで回しながらも特定の条件で中断、再開させたいときに使えます。
ただし、条件の部分にはそのままbool型変数を入れられません。
デリゲートを指定する必要があります。
正直デリゲートとかラムダ式とか説明できるレベルまで理解してないので使い方だけ書きます。
() => bool型変数 == true
と書けば
bool型変数がtrueになったときにコルーチンが再開します。
こんな感じ→yield return new WaitUntil(() => a == true);
###yield return new WaitWhile(条件);
条件の部分がflaseになったらコルーチンを再開します。
これもコルーチンをループで回しながらも特定の条件で中断、再開させたいときに使えます。
WaitUntilと同様に条件の部分にはそのままbool型変数を入れられません。
() => bool型変数 == true
と書けば
bool型変数がfalseになったときにコルーチンが再開します。
こんな感じ→yield return new WaitUntil(() => a == true);
###書いてて思ったんですがWaitUntilとWaitWhileって一緒じゃないの?
偉い人教えてください。私には同じ使い方しか思いつきません...
条件が逆なだけで一緒のものです。
否定を入れるとコードが読みづらくなるのでその配慮と思われます。
// 文章が肯定: hogeobjectがアクティブな間止まる
yield return WaitWhile(() => hogeobject.activeSelf);
// 文章が否定: hogeobjectがアクティブでなくなってなければ止まる
yield return WaitUntil(() => !hogeobject.activeSelf);
↑なんという親切設計...