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だけを単独で設定することはできないためです。
チャレンジ
中級矢印キーでランナーを3つのレーン間で移動させましょう。
RunnerのUpdate()で、Input.GetKeyDown(KeyCode.LeftArrow)のときにlane--し、右矢印キーのときにlane++します。- 道路から外れないようにします:
lane = Mathf.Clamp(lane, -1, 1);。 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プレイグラウンド