LoginSignup
2
2

More than 3 years have passed since last update.

滑らかな左右の移動

Last updated at Posted at 2019-06-14

今回は僕が実際に作ったレースゲームを例に挙げCoroutineとIEnumeratorの使い方について紹介していきます。

レースゲームの概要

コースはレーンになっており、ボタンも押すと隣のレーンに滑らかに移動できるようになっています。
はじめの移動は早く、最後はゆっくり動くようにしました。
gihなので少し滑らかさ無いように見えますが、もっと滑らかに動きます。

Qiita用.gif

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;
         }
     }

スクリーンショット 2019-06-13 16.03.35.png

また変数pを下のようにする事で等速で左右に移動したり、for文の条件を変える事で徐々に早く動くようにもできます。

float p = 3.7f / 10;
for(i = 1; i <11; i++)

これは『ここまでで1フレーム』という意味の文です。


yield return null;

また上の文を下のようにすることで1フレームだけでなく指定した数秒ごとに実行することができます。

yield return new WaitForSeconds(秒数);
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2