Unity / 3D / Character Controller
Unityでキーボード入力で3Dプレイヤーを動かす方法
WASD で動かす 3D 操作の基本を、入力 → 方向 → 移動の流れでつかみます。
このページでは、最初からジャンプやアニメーションを足すのではなく、 「押した方向にまっすぐ動く」までを丁寧に固めます。後でカメラ追従や当たり判定を足す土台にもなります。
自己紹介
オープニング対談
🎁このレッスンのおみやげ
- WASD 入力を 2 本の値として受け取る考え方
- 斜め移動だけ速くならないようにする Normalize
- Character Controller を使う導入パターン
- 向きを滑らかに変えて歩きやすく見せる方法
Unity では Input + Character Controller で「歩く基礎」を素早く試せます。 物理挙動よりもまず入力の流れを掴みたいときに向いています。
1🎯まず何を作るのか
今回のゴールは、平らな床の上でプレイヤーが WASD に合わせて移動し、進む方向へ向きを変える 状態を作ることです。 ジャンプやダッシュは後回しにして、まずは「押した通りに動く」感覚を完成させます。
画面幅に応じて折り返します。横スクロールは不要です。
2🖼️完成イメージ
画面としては地味でも、ここができると「自分で操作している感」が一気に出ます。以後の敵、アイテム、カメラ追従もこの移動の上に積み上がります。
3🧠今回の理解ポイント
左右と前後を別々に読み、最後に 1 本の Vector3 にまとめると整理しやすくなります。
Normalize を入れておくと、斜めだけ速くなってしまう初心者あるあるを避けられます。
Rigidbody で本格物理へ進む前に、歩行の基本だけを試したい場面で扱いやすいです。
進む方向へ少しずつ向かせると、棒立ちで滑る見え方を防ぎやすくなります。
4🛠️最初の準備
最初はシンプルに、床とプレイヤーだけで十分です。複雑なアセットを入れる前に、Hierarchy と Inspector をきれいにしておきます。
- 1Capsule を Player として置く
3D Object の Capsule を作り、名前を Player にします。
- 2Plane を Ground として置く
動きを見やすくするため、床になる Plane を 1 枚置きます。
- 3Character Controller を追加
Player を選び、Add Component から Character Controller を追加します。
- 4Move Script をアタッチ
PlayerKeyboardMove スクリプトを作って Player に付けます。
5💻C# スクリプトを書く
先に全部の意味を理解しようとしなくても大丈夫です。まずは貼り付けて動かし、その後にどこが入力・方向・移動なのかを分けて見ていきます。
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 直書きでもよいのでは?
7✅動作確認
再生して、次の順に確認すると原因の切り分けが早くなります。
- 1再生する
Play を押して Scene を動かします。
- 2W / A / S / D を押す
Player が前後左右へ動くかをまず確認します。
- 3斜め移動を見る
真横と同じくらいの速さに見えるか、違和感がないかを見ます。
- 4向きの変化を見る
移動方向へ滑らかに向きを変えるか確認します。
8🧯つまずきやすい点
- Player が動かない: Character Controller が付いているか、Script が Player に付いているかを確認します。
- 斜めだけ速い: Normalize を外していないか見直します。
- その場で回るだけ: worldMove を SimpleMove に渡しているか、0 ベクトルになっていないか確認します。
- 床をすり抜けるように見える: Ground の位置や Scale が極端すぎないかを見直します。
9📝まとめ
Unity の 3D 操作は、入力を読む → 方向を作る → 前へ進める の順に考えると理解しやすくなります。 今日のスクリプトは小さく見えても、ジャンプ、カメラ追従、アニメーションへつながる基礎です。
10🚀次の一歩
移動の次は、クリック移動や UI、当たり判定を足すと「遊べる試作」に近づきます。
- クリックした場所へ移動するチュートリアルで移動の別パターンを見る
- Unity の UI ボタン入門で画面側の操作も理解する
- PC スペック完全ガイドで開発環境も整える
キャラ対談で総復習
クイズ
Q1. キーボードの左右入力と前後入力をまとめて受け取るときに、最初に確認する値はどれですか?
クイズ
Q2. 斜め移動だけ速くなるのを防ぐために入れている処理はどれですか?
クイズ
Q3. Character Controller を使う利点として、このチュートリアルで特に大きいものはどれですか?