Menu
CoddyTech

コース

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はその移動全体を表します。

challenge icon

チャレンジ

中級

プレイヤーを歩かせ、ジャンプさせ、落下させましょう。

  1. Start()で、InputSystem.actions.FindActionを使ってMoveとJumpを見つけます。
  2. Update()で、speedで歩かせます。Moveのxをx軸に、yをz軸に沿って移動させます。
  3. velocity.yにgravity * Time.deltaTimeを加えます。接地していて落下中なら-2fにします。接地中にジャンプすると、Mathf.Sqrt(jumpHeight * -2f * gravity)を設定します。
  4. 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プレイグラウンド