コルーチン(Unity)を適当に使っている人間が送るコルーチンいろは唄
はじめに
はじめまして。2回生セキュリティネットワークコース、コーディング課と一応幽霊でDTM課のTZと申します。
今回の記事はタイトルの通りコルーチンを適当に使っている私がコルーチンについて説明する記事(アドカレ12/13日分)でございます。
アイキャッチがダサいのは気にしないでください。どうやらアイキャッチをRiGロゴから変えるっぽい風潮だったんですけど画像がなかったんです。
いろは唄っていうのもノリで付けたものなので気にしないでください。〇〇のいろはってあるじゃないですか。そう書こうとしたらなぜか唄がついてきたんですよね。いろはにほへとちりぬるを。
コルーチンとはなんぞや
他人様のコードを読んだりするRiGメンバーだったりそうでなかったりするそこのあなた。
IEnumerater 関数名(){内容~~~~}みたいな関数とか、StartCoroutine(Kansuumei());とか見たことはございませんでしょうか?
え、ある??そうですよね!!(ない場合の選択肢は想定してない感じのアドベンチャーゲームです、まぁ見たことなくても問題ないです)
これ(Inumeraterが返り値の関数)がコルーチンと呼ばれるものです。
Unity Documentationさん曰く、
コルーチンとは、実行を停止して Unity へ制御を戻し、その次のフレームで停止したところから続行することができる関数です。とのことです。
まぁなんか、秒ごとにタイマーの表示を変えるの1秒を待ってくれるとか、これやって何秒後にあれやってってのを実装できるものです。
Updateですればいいんじゃない??と思ったそこのあなた。
わかる、わかるぞ。しかしUpdateは適当に使っているとやばいのです。
コルーチンも乱用していいよとは言いませんが、Updateの呼び出し間隔は毎フレーム。タイマーは毎フレームtime.deltaTimeを使って算出、オブジェクトの移動もUpdate,あれやってこれやってアニメーションするのもUpdateとかしてるとなんか処理量がすごいことになります。そしてそれが毎フレーム(60FPSなら毎秒60回)呼び出される。
また、そこそこちゃんとクラス設計をしていればまだなんとかなるものの、いろんな処理を一つのクラスで書いちゃえ!(神クラス)とかしてるとUpdateがびっくりするほど長くなってしまいパソコンどころか人間にも優しくありません。
ということで処理の間ちょっと時間空けたいとかなら、コルーチンの使用を考えてみるのがパソコン、人間双方に優しいのではないでしょうか。
使ってみようぜ
コルーチンはコルーチン本体の書き方とその呼び出し方さえ分かっていれば書けます。
普通に関数を作る気持ちでいってみましょう。
①まずコルーチン本体を書きます。前述のとおり、IEnumeratorというものが返り値ならそれはコルーチンです。終。
返り値ってなーーにーー?というそこのあなたはなんか別の記事でも見てください。
void Kansuumei(){—–}のvoidは返り値なし、int GetAge(){——}はint、つまり整数値でなにか値(データ)が返される(呼び出すとデータが得られる)ということです。
名前的に何かの年齢が返ってくるんでしょうか。int myAge = GetAge();とか書いてますよね。この返ってくる値が返り値です。まんまだね!(小声)
ということでこれがコルーチンの関数本体(1秒ごとにカウントしてText更新)です。
時間制限が60秒あるとして、0秒まで1秒ずつ減っていくよっていうタイプのカウンターですね。
ちょっとこないだ作っていたゲームのGithubにあげたやつをスクショしているので、いらないとこは削ってあります。
nowTimeはint変数、timeTextはuGUIのTextですね。ここで大事なのはyield return new WaitForSeconds(1);です。
英語つよつよである読者の皆様は、はえー1秒待機するのかーと思われたことでしょう。そしてその上でnowTimeが–;とデクリメントされていますね?
つまりはそういうことです。
コルーチンは、このyield return new WaitForSeconds();や、それ以外のyieldなんとかって文を書かないとそういうの書いてくれないと困るーって怒られエラーが発生するのですが、このyieldなんとかがめっちゃ大事なんですね。
コルーチンが呼び出された後、yield文まで実行します。そして、yield文で指定された分待ち(正確にはUnityに制御を返す)待機が終了すればその下の文から再開します。
それを利用して簡単タイマーを作ったのが上になります。
yield文はいろいろあるらしいです。
私はとりあえずN秒待ちたい!みたいなことで深く考えずコルーチンを使っているのでyield return new WaitForSeconds(待ちたい秒数);
を一番使っていますが、ほかにも
yield break;(コルーチン終了)
yield return null;(1フレーム待機)
とかがあるらしいです。
忘れがちですが、呼び出すときにはそのまま関数名();ではなく、StartCoroutine(関数名());を使いましょう。
これであなたはコルーチンマスターです、タイマーが作れます!!!
え、ほかの使い方??知りません!!!
アニメーションとかにも使えそうですが、コルーチンで頑張るよりDOTWEEN(ちょっとした移動アニメーションから回転、スケールのじわ変更アニメーション、色変更、テキストとかすらいい感じにアニメーションできるアセット、すごい)とかを使いがちなので……。
ただ、使い方はいろいろあると思うので概念だけでも覚えておくといいことあるかもしれません。
ちなみに、コルーチンの返り値がIEnumretorだけど、これって何?とかなんでStartCoroutine(引数がIEnumretor)で呼ばないといけないの?とか、yield文ってなに??という疑問があるかもしれません。
知りません(適当に使ってきたので……使えたらいいかなって……)
ただ、どういうものかとかはもうちょっと知っておいた方がいい気がするので、他の素晴らしい記事を見てそこらへんの知識を吸収するのをおすすめします。
以上!!!!