本文へスキップ
🎮

Unity / 3D / Character Controller

Unityでキーボード入力で3Dプレイヤーを動かす方法

WASD で動かす 3D 操作の基本を、入力 → 方向 → 移動の流れでつかみます。

このページでは、最初からジャンプやアニメーションを足すのではなく、 「押した方向にまっすぐ動く」までを丁寧に固めます。後でカメラ追従や当たり判定を足す土台にもなります。

自己紹介

ココ先生・喜ぶ
ココ先生動かし方を整理するナビゲーター
3D の基本は、見た目を派手にする前に、気持ちよく動くことです。入力の取り方と移動の流れが分かると、他のチュートリアルでも迷いにくくなります。
はじめちゃん・驚く
はじめちゃんUnityを学び始めた初心者
クリック移動は触れましたが、自分でキーボードを押して動かす仕組みはまだ作ったことがありません。WASD の基本から知りたいです。

オープニング対談

ココ先生・楽しむ
ココ先生3Dゲームらしさを早く感じるには、自分で動かせる対象を1つ作るのが近道です。まずはWASDで歩けるだけでも十分価値があります。
はじめちゃん・驚く
はじめちゃん移動って毎フレームの計算が多そうで難しそうです。どこから考えれば混乱しませんか?
ココ先生・喜ぶ
ココ先生入力を読む → 方向を作る → その方向へ進める、の3段階に分けると見通しがよくなります。今日はそこだけに集中しましょう。

🎁このレッスンのおみやげ

  • WASD 入力を 2 本の値として受け取る考え方
  • 斜め移動だけ速くならないようにする Normalize
  • Character Controller を使う導入パターン
  • 向きを滑らかに変えて歩きやすく見せる方法

Unity では Input + Character Controller で「歩く基礎」を素早く試せます。 物理挙動よりもまず入力の流れを掴みたいときに向いています。

1🎯まず何を作るのか

今回のゴールは、平らな床の上でプレイヤーが WASD に合わせて移動し、進む方向へ向きを変える 状態を作ることです。 ジャンプやダッシュは後回しにして、まずは「押した通りに動く」感覚を完成させます。

入力を読むHorizontal / Vertical
方向を作るVector3 にまとめる
前へ進めるSimpleMove
向きを変えるSlerp でなめらかに

画面幅に応じて折り返します。横スクロールは不要です。

2🖼️完成イメージ

画面としては地味でも、ここができると「自分で操作している感」が一気に出ます。以後の敵、アイテム、カメラ追従もこの移動の上に積み上がります。

入力から移動までの流れ
入力を読み、方向を作り、Character Controller で前へ進める流れを先に頭へ入れておくと実装が追いやすくなります。

3🧠今回の理解ポイント

🎮
入力は2本で考える

左右と前後を別々に読み、最後に 1 本の Vector3 にまとめると整理しやすくなります。

📐
斜め移動の長さをそろえる

Normalize を入れておくと、斜めだけ速くなってしまう初心者あるあるを避けられます。

🧱
まずは Character Controller

Rigidbody で本格物理へ進む前に、歩行の基本だけを試したい場面で扱いやすいです。

🧭
向きも一緒に整える

進む方向へ少しずつ向かせると、棒立ちで滑る見え方を防ぎやすくなります。

4🛠️最初の準備

最初はシンプルに、床とプレイヤーだけで十分です。複雑なアセットを入れる前に、Hierarchy と Inspector をきれいにしておきます。

UnityのHierarchyとInspector設定
Player に Character Controller と Move Script を付けるところまでを先に揃えます。
  1. 1
    Capsule を Player として置く

    3D Object の Capsule を作り、名前を Player にします。

  2. 2
    Plane を Ground として置く

    動きを見やすくするため、床になる Plane を 1 枚置きます。

  3. 3
    Character Controller を追加

    Player を選び、Add Component から Character Controller を追加します。

  4. 4
    Move Script をアタッチ

    PlayerKeyboardMove スクリプトを作って Player に付けます。

5💻C# スクリプトを書く

先に全部の意味を理解しようとしなくても大丈夫です。まずは貼り付けて動かし、その後にどこが入力・方向・移動なのかを分けて見ていきます。

PlayerKeyboardMove.cs
csharp
using UnityEngine;

[RequireComponent(typeof(CharacterController))]
public class PlayerKeyboardMove : MonoBehaviour
{
    [SerializeField] private float moveSpeed = 4f;
    [SerializeField] private float turnSpeed = 12f;

    private CharacterController controller;

    private void Awake()
    {
        controller = GetComponent<CharacterController>();
    }

    private void Update()
    {
        Vector3 input = new Vector3(
            Input.GetAxisRaw("Horizontal"),
            0f,
            Input.GetAxisRaw("Vertical")
        );

        if (input.sqrMagnitude > 1f)
        {
            input.Normalize();
        }

        Vector3 worldMove = transform.TransformDirection(input);
        controller.SimpleMove(worldMove * moveSpeed);

        if (worldMove.sqrMagnitude > 0.001f)
        {
            Quaternion targetRotation = Quaternion.LookRotation(worldMove);
            transform.rotation = Quaternion.Slerp(
                transform.rotation,
                targetRotation,
                turnSpeed * Time.deltaTime
            );
        }
    }
}

6🔍コードの読み方

このコードで押さえたいのは、「どこで入力を読むか」「どこで移動に変えるか」「どこで向きを変えるか」の3点です。

  • Input.GetAxisRaw は、押されている方向を -1 / 0 / 1 に近い値で返します。
  • Normalize は、斜めだけ速い状態を防ぐためのひと手間です。
  • CharacterController.SimpleMove は、速度を渡すだけで歩行の基本を試しやすい関数です。
  • Quaternion.Slerp で向きを少しずつ変えると、見た目が自然になります。

まずは transform 直書きでもよいのでは?

もちろん最初の1回はそれでも構いません。ただ、今後カメラや坂道、当たり判定を足していくことを考えると、 Character Controller で「歩く基本」に触れておくと次へつながりやすいです。

7動作確認

再生して、次の順に確認すると原因の切り分けが早くなります。

  1. 1
    再生する

    Play を押して Scene を動かします。

  2. 2
    W / A / S / D を押す

    Player が前後左右へ動くかをまず確認します。

  3. 3
    斜め移動を見る

    真横と同じくらいの速さに見えるか、違和感がないかを見ます。

  4. 4
    向きの変化を見る

    移動方向へ滑らかに向きを変えるか確認します。

8🧯つまずきやすい点

  • Player が動かない: Character Controller が付いているか、Script が Player に付いているかを確認します。
  • 斜めだけ速い: Normalize を外していないか見直します。
  • その場で回るだけ: worldMove を SimpleMove に渡しているか、0 ベクトルになっていないか確認します。
  • 床をすり抜けるように見える: Ground の位置や Scale が極端すぎないかを見直します。

9📝まとめ

Unity の 3D 操作は、入力を読む → 方向を作る → 前へ進める の順に考えると理解しやすくなります。 今日のスクリプトは小さく見えても、ジャンプ、カメラ追従、アニメーションへつながる基礎です。

10🚀次の一歩

移動の次は、クリック移動や UI、当たり判定を足すと「遊べる試作」に近づきます。

キャラ対談で総復習

はじめちゃん・楽しむ
はじめちゃん入力、方向、移動を分けて考えるだけで、コードの見通しがかなりよくなりました。
ココ先生・喜ぶ
ココ先生その感覚が大事です。動かないときも、どの段階で止まっているかを切り分けやすくなります。
はじめちゃん・驚く
はじめちゃん次はジャンプやカメラ追従にも進みたいですが、まずは今日の移動を自分のプロジェクトへ入れてみます。
1

クイズ

Q1. キーボードの左右入力と前後入力をまとめて受け取るときに、最初に確認する値はどれですか?

2

クイズ

Q2. 斜め移動だけ速くなるのを防ぐために入れている処理はどれですか?

3

クイズ

Q3. Character Controller を使う利点として、このチュートリアルで特に大きいものはどれですか?