Unityでコルーチンの使い方の基本をマスターしたい!
どうも、Linです。内側、意識してます。
Unityの使い方での基本の応用編といっても過言ではないのが、
コルーチンの使い方
でしょう。
コルーチンとは簡単にいってしまうと、
ゲームのフレームの変化とは関係ないタイミングで実行する処理
のことです。
Unityのスクリプトは基本的に、
- ゲームスタート時に発動する関数(Start関数)
- ゲームのフレームが変わるごとに発動する(Update関数)
しか用意されてないので、処理実行のタイミングの自由がなかなかきかないのが現状なのです。
そこでコルーチンを使えば、
指定した秒数で処理を実行できるようになり、ゲーム作りの自由度が増すことになります。
Unityを勉強し始めた当初は、コルーチンなんて蒸発すればいいと思ってました。
しかし、いくつかゲームを作るようになった今となっては、ゲーム作りの必須の技だと感じています。
今日は、コルーチンの処理をいつも忘れてしまうので、備忘録としてコルーチンの使い方の基本を書き留めておこうと思います。
執筆にあたり、次の神記事を参考にさせてもらいました。
Unityの超基本!コルーチンの使い方の基本
ゲーム開始時からの経過秒数が1秒、5秒、7秒になったときに表示する簡単なサンプルを作ってみましょう。

次のように、ヒエラルキーにText要素だけ置いて、適度に場所を移動して適度に大きくしてテキストの文字が見えやすいようにしましょう。

Step1. 空のオブジェクトを作成して、スクリプトをアタッチ
テキストの内容を変化させるためのスクリプト「GameManager.sc」を作成。
そして、そいつを実行するための空のゲームオブジェクト「GameObject」を作成しましょう。
これで準備完了です。
Step2. コルーチンの関数を作る
フレーム数やゲームの開始時とは関係のないタイミングで発動したいコルーチン関数を作っていきます。
private IEnumerator Sample() { // コルーチンの処理 }
が基本になります。
この例でいうと、Sampleというのが関数名で、引数はなしということですね。
今回はMessageというコルーチン関数を作りたいと思います。
GameManager.scを次のように編集。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } private IEnumerator Message() { } }
Step3. 実行させたい処理を追加
コルーチンの関数に、実行させたい処理を書いていきます。
今回のサンプルゲームでは、
テキストの内容を秒数ごとに変える
という処理を実行させたいのでしたね。
ということで、まずはテキストオブジェクトのテキストコンポーネントを取得し、messageTextというTextクラスの変数に代入します。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GameManager : MonoBehaviour { Text messageText; // Use this for initialization void Start () { messageText = GameObject.Find ("Text").GetComponent<Text> (); } // Update is called once per frame void Update () { } private IEnumerator Sample() { } }
続いて、コルーチン関数内に処理を書いていきます。
(1・5・7秒)ごとにテキストの内容を変えたいので、コルーチン関数を次のようにしてみましょう。
private IEnumerator Sample() { messageText.text = "1秒!"; messageText.text = "5秒!"; messageText.text = "7秒!"; }
Step4. 遅らせる時間の処理
最後に、コルーチン関数内で処理の実行を遅らせるコードを書いていきます。
yield return new WaitForSeconds (秒数);
というコードを書くと、引数で指定した秒数分処理が止まります。
たとえば、
yield return new WaitForSeconds (2.0f);
とすると、ここで2秒コルーチン関数内の処理が止まってしまうわけです。
今回は、1秒・5秒・7秒ごとにテキストの内容を変更したかったので、
private IEnumerator Message() { yield return new WaitForSeconds (1.0f); messageText.text = "1秒!"; yield return new WaitForSeconds (4.0f); messageText.text = "5秒!"; yield return new WaitForSeconds (2.0f); messageText.text = "7秒!"; }
とでもしましょう。
Step5. コルーチン関数を実行する
あとは、コルーチン関数を呼び出すだけ。
呼び出し方は、
StartCoroutine (コルーチン関数名);
です。
今回はゲームの開始時に、Messageというコルーチンを呼び出したいので、Start関数を、
void Start () { messageText = GameObject.Find ("Text").GetComponent<Text> (); StartCoroutine ("Message"); }
と変更しましょう。
GameManager.scのスクリプト全体では、
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GameManager : MonoBehaviour { Text messageText; // Use this for initialization void Start () { messageText = GameObject.Find ("Text").GetComponent<Text> (); StartCoroutine ("Message"); } // Update is called once per frame void Update () { } private IEnumerator Message() { yield return new WaitForSeconds (1.0f); messageText.text = "1秒!"; yield return new WaitForSeconds (4.0f); messageText.text = "5秒!"; yield return new WaitForSeconds (2.0f); messageText.text = "7秒!"; } }
となっているはずです。
これでコルーチンの基本は終了です!
Unityのコルーチンの使い方も基本抑えればこわくない!
以上がUnityのコルーチンの使い方の基本でした。
- コルーチンの関数を作る
- 実行させたい処理を関数に記述
- 待つ時間の処理をかく
- コルーチンの関数を発動する
で大体コルーチンの基本はマスターできると思います。
実際に先ほどのUnityゲームを実行させてみると、
という感じになるんじゃないですかね。
Unityのコルーチンを含めた重要な技たちをもっと深く学びたいという方にはTECHACADEMYの「オンラインブートキャンプ Unityコース」がおすすめです。
Unityプロの方にいつでもオンラインで質問できますからね。
よかったらチャレンジしてみてくださいね。
それでは!
Lin

おそらく、ブロガー。
今年でフリーランス 6年目。