Menu
CoddyTech

3つのレーン

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

この章ではエンドレスランナーを作ります。ランナーは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では、キーを押し続けている間、フレームごとに階が増えます。Mathf.Clampは階数を建物の範囲内に保つため、最上階で上を押しても何も起こらず、次に下を押すと3階へ直接移動します。Mathf.MoveTowardsはプラットフォームを毎秒moveSpeedユニットの速さで階に向かって滑らかに動かし、その階で正確に停止させます。1フレームでそこへ跳ぶわけではありません。位置はコピーを作って変更してから代入し直します。transform.position.yだけを単独で設定することはできないためです。

challenge icon

チャレンジ

中級

矢印キーでランナーを3つのレーン間で移動させましょう。

  1. RunnerのUpdate()で、Input.GetKeyDown(KeyCode.LeftArrow)のときにlane--し、右矢印キーのときにlane++します。
  2. 道路から外れないようにします:lane = Mathf.Clamp(lane, -1, 1);。
  3. transform.positionをpにコピーし、Mathf.MoveTowardsを使って、laneSpeed * Time.deltaTimeの速度でp.xをlane * laneWidthに近づけ、最後にpを元に代入します。

「プレイ」を押し、ゲーム画面をクリックしてレーンを切り替えます。ランナーが横に滑るように移動します。その後、「確認」を押します。

自分で試してみよう

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 座標に向かって滑らかに移動する
    }
}

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

自分で練習してみよう: Unityプレイグラウンド