Menu
CoddyTech

3つのレーン

CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 27/56。

この章ではエンドレスランナーを作ります。ランナーは3車線の道路を走り、向かってくる障害物を避けるために車線を切り替えます。これからのレッスンでは、道路が加速し、画面に距離が表示され、衝突すると走行が終了して再挑戦するためのボタンが表示され、最高記録が保存されます。ランナーは前進しません。z = 0 にとどまり、障害物がランナーに向かって移動するため、道路が尽きることはありません。このゲームには4つのスクリプト、Runner、Spawner、Obstacle、GameManagerがあり、最後の3つは今のところ空です。

車線を走るランナーは車のように操縦するのではなく、いくつかの決まった位置のいずれかにいます。位置を整数で保持し、キーが押されたときに数値を変えて、その数値から位置を求めます。この窓掃除用プラットフォームは、5階建ての建物の各階に停止します。階と階の間隔は3単位です。

[SerializeField] private float floorHeight = 3f;
[SerializeField] private float moveSpeed = 6f;
private int floor = 0;

void Update()
{
    if (Input.GetKeyDown(KeyCode.UpArrow)) floor++;
    if (Input.GetKeyDown(KeyCode.DownArrow)) floor--;
    floor = Mathf.Clamp(floor, 0, 4);

    Vector3 p = transform.position;
    p.y = Mathf.MoveTowards(p.y, floor * floorHeight, moveSpeed * Time.deltaTime);
    transform.position = p;
}

GetKeyDownを使うと、キーを1回押すごとに1階移動します。一方、GetKeyでは、キーを押し続けている各フレームで階が1つずつ増えます。Mathf.Clampは数値を建物内に収めるため、最上階で上キーを押しても何も起こらず、次に下キーを押すと3階に移動します。Mathf.MoveTowardsはプラットフォームを1秒あたりmoveSpeed単位の速さでその階へ滑らかに移動させ、正確に停止させます。1フレームで飛び移るわけではありません。位置はコピーを変更してから代入し直しています。transform.position.yだけを単独で設定することはできないためです。

challenge icon

チャレンジ

中級

ランナーとともにエンドレスランナーを始めましょう。Inspector では Runner に laneWidth の値 2.5 と laneSpeed の値 15 を設定し、左レーンでは lane が -1、中央では 0、右レーンでは 1 になります。Runner の Update() では、次のようにします。

  • 左矢印または右矢印を押すたびに、その方向へ lane を 1 ずつ変更します。キーを押し続けても、1 ずつしか変わりません。
  • lane が -1 未満、または 1 を超えることはありません。
  • ランナーは、y と z を保ったまま、x 方向に lane * laneWidth まで、毎秒 laneSpeed 単位の速さで滑らかに移動します。

今は残りの 3 つのスクリプトをそのままにしておきます。Play を押し、ゲーム画面をクリックしてレーンを切り替えたら、Check を押してください。

自分で試してみよう

using UnityEngine;

public class Runner : MonoBehaviour
{
    public float laneWidth = 2.5f;
    public float laneSpeed = 15f;
    private int lane = 0;   // -1 は左のレーン、0 は中央、1 は右のレーン

    void Update()
    {
        // 矢印キーでレーンを変更し、レーンの x 座標に向かって滑らかに移動する
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

本格的なゲームを作るのすべてのレッスン