今回は僕が実際に作ったレースゲームを例に挙げCoroutineとIEnumeratorの使い方について紹介していきます。
#レースゲームの概要
コースはレーンになっており、ボタンも押すと隣のレーンに滑らかに移動できるようになっています。
はじめの移動は早く、最後はゆっくり動くようにしました。
gihなので少し滑らかさ無いように見えますが、もっと滑らかに動きます。
#Coroutine
コルーチンとは『フレームを跨いで処理を中断・再開させることが出来る仕組み』です。
例えば、通常for文の繰り返し処理30回を処理しようとすると、30回の処理を全て同じ1フレームで行います。
これをコルーチンを用いることで、30回の処理を30フレームなど分けて処理することができます。
#ゲームのコード
十字キーのRightキーを押した時の処理を取り上げてみます。
RightKeyを押したら、(Horisontal1)というコルーチンを実行します。
void Update ()
{
float pos_x = transform.position.x;
if (Input.GetKeyDown (KeyCode.RightArrow)) {
if (pos_x < 4) {
StartCoroutine(Horizontal1());
}
}
}
for文の処理回数はiが10の時、9の時、8の時、...1の時まで10回の処理があります。
この10回の処理で3.7右に移動したいです。
3.7の距離を55等分して、iが10の時55等分のうち10だけ右に移動する、次はiが9の時55等分のうち9だけ右に進む、その次はiが8の時....とやっていくと丁度10回の処理で3.7右に進むことができます。
これで徐々に進む距離が減っているので最初は早く、最後はゆっくり進むことができました。
private IEnumerator Horizontal1()
{
for (int i = 10; i > 0; i--) {
float p = i * 3.7f / 55;
Vector3 nowPos = transform.position;
transform.position = new Vector3 (nowPos.x + p, nowPos.y, nowPos.z);
yield return null;
}
}
また変数pを下のようにする事で等速で左右に移動したり、for文の条件を変える事で徐々に早く動くようにもできます。
float p = 3.7f / 10;
for(i = 1; i <11; i++)
これは『ここまでで1フレーム』という意味の文です。
yield return null;
また上の文を下のようにすることで1フレームだけでなく指定した数秒ごとに実行することができます。
yield return new WaitForSeconds(秒数);