先日のサウンドゲームジャムで中々に期待出来そうなゲームを作りました。
このゲームでは基本的に音に合わせてゲームを進行させるのですが、昼から夜・もしくは夜から昼に変わる際にリズムに合わせて演出を行う的な物を作りました。Gifアニメでは少し分かり難いですが、音楽の拍手に合わせてライトが点きます。
その時に試した手法が中々に使いやすかったのでメモします。
ちなみにビートのタイミング自体はMusicEngineから取得しています。音楽とゲームがシンクロすると気持ち良い事はBeatbuddyやDropで確信を持ってましたが、本当に良いですね。
処理を順番に実行する
今回はライトの数が固定だったので、最初の8小節で太陽の角度を調整し、残りの8小節でライトを点灯させました。つまり、処理をタイミング毎に分割して行う必要があります。
やり方は「Switchと現在のステートを持つ」とか「イベントを登録して順番に呼び出す」とか色々とあると思いますが、今回はCoroutineライクにIEnumeratorを実行してみました。
上のコードはクリックする度に赤・青・緑・白の順番で色を変化させるサンプルです。事前にIEnumeratorを取得しておき、特定のタイミングでMoveNextを呼び出します。
ポイントはyield returnで処理を中断している所です。これでMoveNextを呼んだタイミングで処理を進める事が出来ます。また、その際の戻り値はaction.Currentに格納されます(今回の場合、色を戻しているのでaction.Currentで色を取得できます)
正直他にも色々とやり方はあると思いますが、計算に使うようなフィールドが殆ど不要になり処理を追いやすいので、案外悪くないかなと。
関連
G-MODE Engineers' Blog — StartCoroutineは何をしているのか?作って学ぶコルーチンの仕組み(前編)