コース
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 49/60。
この章では、3Dプラットフォーマーを作ります。浮遊する足場の上を走ったりジャンプしたり、滑る足場に乗ったり、落下してもスタート地点まで戻されないようチェックポイントに触れたり、画面に数が表示される宝石を集めたり、ゴールを越えて次のレベルに進んだりして、自己ベストタイムの更新を目指します。このゲームには5つのスクリプトがあり、プロジェクトには最初から用意されています。Player、MovingPlatform、Checkpoint、Gem、FinishLineです。最後の4つは今のところ空で、各レッスンで1つずつ仕上げます。プレイヤーはInput Systemのアクションで操作するCharacterControllerで、カメラはその子オブジェクトなので、スクリプトなしで追従します。
CharacterControllerの移動方法は2つあります。Move(motion)は指定した距離だけ移動し、何も追加しないため、重力、ジャンプ、Time.deltaTimeの処理はスクリプト側で行います。これはCharacter Controllerの章で学んだとおりです。SimpleMove(speed)は、1秒あたりの単位で速度を受け取り、フレームの時間を自動的に掛けて重力を加えます。渡されたyの値は無視するため、これを使って移動するキャラクターは足場から落ちますが、ジャンプはできません。上から見下ろす牧羊ゲームのこの牧羊犬にはジャンプが不要なので、SimpleMoveとMoveアクションだけでスクリプト全体を構成できます。
using UnityEngine;
using UnityEngine.InputSystem;
public class Sheepdog : MonoBehaviour
{
[SerializeField] private float speed = 6f;
private CharacterController controller;
private InputAction moveAction;
void Start()
{
controller = GetComponent<CharacterController>();
moveAction = InputSystem.actions.FindAction("Move");
}
void Update()
{
Vector2 input = moveAction.ReadValue<Vector2>();
controller.SimpleMove(new Vector3(input.x, 0f, input.y) * speed);
}
}プラットフォーマーのプレイヤーはジャンプする必要があるため、自分で垂直方向の速度を保持し、Moveを使って移動します。また、Inputクラスではなく、MoveアクションとJumpアクションを読み取ります。Unityでは、1フレームにつきMoveまたはSimpleMoveを1回呼び出すことが推奨されています。歩行と落下を同じ呼び出しにまとめると、isGroundedはその移動全体を表します。
チャレンジ
中級プレイヤーを歩かせ、ジャンプさせ、落下させましょう。
Start()で、InputSystem.actions.FindActionを使ってMoveとJumpを見つけます。Update()で、speedで歩かせます。Moveのxをx軸に、yをz軸に沿って移動させます。velocity.yにgravity * Time.deltaTimeを加えます。接地していて落下中なら-2fにします。接地中にジャンプすると、Mathf.Sqrt(jumpHeight * -2f * gravity)を設定します。controller.Move((move + velocity) * Time.deltaTime)を1回呼び出します。
「プレイ」を押して、最初のプラットフォームまでジャンプします。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpHeight = 1.5f;
[SerializeField] private float gravity = -9.81f;
private CharacterController controller;
private Vector3 velocity;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
// Moveアクションで歩き、Jumpアクションでジャンプし、重力で落下する
}
}
本格的なゲームを作るのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド