Blog ブログ
コルーチンで楽して演出実装 ~導入編~
皆様初めまして。
プログラマの姫野と申します。
今回は、最近便利だと感じた「Unityのコルーチン」について紹介させていただこうかと思います。
StartCoroutineやら、IEnumeratorやらUnity触り始めたころだとなんぞやそれは?ってなるアイツです。
■どんなときに使うのか
さて、弊社では毎月複数のチームに分かれてゲームを制作しております。
1ヶ月で企画から完成まで持っていくにはスピードが命となります。
完成度を上げるためには、ゲームシステム、演出共にきちんと動作させることが重要だと考えております。
最も重要なのはゲームシステム部分で、これが完成していないと(当たり前ですが)ゲームとして成り立ちません。
完成度以前の問題です。
かといって、演出も馬鹿にできませんね。
中途半端に実装したりすると、「面白いかもしれないけど、何か足りない・・・」ということになりかねません。
いかに短い時間でこの両方を満たせるかどうか・・・特に演出がやっかいそうです。
例えばこんなケースはないでしょうか。
「条件を満たしたら演出Aを再生して、再生が終わったら演出Bを・・・あ、演出再生中にタップされたら演出スキップしたい」
・・・うーん。
ゲームリザルトとかで出てきそうな感じですね。
こういうのをステートマシン等で素直に実装すると、クラスや変数が増え、どうしてもコードが冗長になりがちです。
冗長になるとコーディング量が多くなるし、流れが追いづらくなるしでいいことはないですよね。
そもそも順番が決まっているのにややこしくなるというのは、できるだけ避けたいところです。
そこでコルーチンの出番となります。(やっと出てきましたね・・・)
コルーチンを使えば、順番が決まっている状態遷移をスッキリ綺麗に書くことができます。
■書いてみる
簡単なミニゲームの流れを例にして説明していきます。
まず大まかに
1. ゲーム開始演出中
2. ゲームプレイ中
3. ゲーム終了演出中
4. タイトルへ遷移
という流れで分けられるかと思います。
これをコルーチンを使ったコードに直すと以下のようになります。
///@brief ゲーム進行管理クラス
class MyGame : MonoBehaviour
{
IEnumerator Start()
{
// 1. ゲーム開始演出中
yield return StartCoroutine(playBeginGameAnimation());
// 2. ゲームプレイ中
yield return StartCoroutine(updateGame());
// 3. ゲーム終了演出中
yield return StartCoroutine(playEndGameAnimation());
// 4. タイトルへ遷移
Application.LoadLevel(“Title”);
}
///@brief ゲーム開始演出を再生します
IEnumerator playBeginGameAnimation()
{
// 省略
yield return 0;
}
///@brief 更新
IEnumerator updateGame()
{
// 省略
yield return 0;
}
///@brief ゲーム終了演出を再生します
IEnumerator playEndGameAnimation()
{
// 省略
yield return 0;
}
}
これだけで流れが見えてくるのではないでしょうか?
通常のメソッドではStartの最初から最後まで処理が実行されてしまいますが、コルーチンを使った場合はそうはなりません。
ポイントはyieldです。
簡単に説明すると、まずStartから始まるのは通常と変わりませんが一度の更新で、開始箇所から一番初めに呼び出されるyield returnまで実行するようになっています。(例ではplayBeginGameAnimation内部のyieldです)
そして、次の更新では先ほどyield returnした箇所からスタートします。
これを繰り返していき、最終的にはStartの最後にある「Application.LoadLevel」を呼び出し、完了となります。
あとは、各演出用に分けたメソッドの省略部分を以下のように書き換えれば、演出が完了した後、次の演出へ遷移させる処理が実装できます。
// 演出開始処理
while (演出がおわるまで) {
// 演出更新処理
yield return 0;
}
// 演出後処理
いかがでしょうか。
普段の処理順番とは違うのでコルーチンを読んだり書いたりしたことのない人はかなり読みづらくなってしまいますが、
それに目を瞑ってもいいくらいのメリットがコルーチンにはあると思います。
以上、かなり簡単にはなりますがコルーチンの導入でした。
次回は、今回紹介しきれなかったコルーチンに関わる機能を紹介していきます。
それではまた次回お会いしましょう。