Unityでプレイヤーの移動処理を実装したい。
でも、「どうやって実装すればいいのか分からない」そんな風に感じていませんか。
実は、Unityでのプレイヤー移動処理は、CharacterControllerやRigidbodyを使って実現できます。
適切な実装により、滑らかなキャラクター操作を作ることができるでしょう。
この記事では、Unityでのプレイヤー移動処理をまとめて詳しく解説します。
✨ この記事でわかること
- Unityでのプレイヤー移動処理の基本と2つの実装方法(所要30分)
- CharacterControllerを使った移動実装とコード例(所要1時間)
- Rigidbodyを使った移動実装とコード例(所要1時間)
- プレイヤー移動でよくある失敗5選と解決方法
- 実用的な移動システム完成までの4ステップ(合計4時間)

最初はCharacterControllerを使った基本的な移動から始めるのがコツです。段階的に機能を追加していくことで、滑らかな移動処理を実装できます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
Unityでのプレイヤー移動処理とは?基礎知識から理解する

Unityでのプレイヤー移動処理とは、プレイヤーキャラクターを移動させる処理のことです。
適切な実装により、滑らかなキャラクター操作を実現できます。
Unityでのプレイヤー移動処理には、CharacterControllerとRigidbodyの2つの方法があります。
CharacterControllerは、物理演算を使わずに移動する方法で、FPSやTPSに適しています。
Rigidbodyは、物理演算を使った移動方法で、よりリアルな動きを実現できます。
それぞれの方法には、特徴と用途があります。
CharacterControllerは、直接的な移動制御が可能で、操作感が良いのが特徴です。
Rigidbodyは、物理的な動きを再現できるのが特徴です。
ゲームの種類に応じて、適切な方法を選ぶことが重要です。
2つの実装方法の使い分け
CharacterControllerは、FPSやTPSなどのアクションゲームに適しています。
直接的な移動制御が可能で、操作感が良いのが特徴です。
物理演算を使わないため、処理負荷が軽いのも利点です。
一方、Rigidbodyは、物理的な動きを再現したい場合に適しています。
例えば、キャラクターが重い物体を押したり、滑ったりする動作を実現できます。
ただし、物理演算を使うため、処理負荷が高くなる可能性があります。
移動処理に必要な要素
✅ 移動処理に必要な要素
- 入力処理:キーボードやコントローラーの入力(Input.GetAxis、所要時間:実装30分)
- 移動方向の計算:入力から移動方向を計算(カメラの向きを考慮、所要時間:実装30分)
- 移動の実行:CharacterControllerやRigidbodyで移動(Move関数やAddForce、所要時間:実装1時間)
- ジャンプ処理:ジャンプと重力処理(Y軸の速度制御、所要時間:実装1時間)
入力処理では、Input.GetAxisやInput.GetKeyを使います。
移動方向の計算では、カメラの向きを考慮することが重要です。
移動の実行では、CharacterControllerのMove関数やRigidbodyのAddForce関数を使います。
ジャンプ処理では、Y軸の速度を制御して、ジャンプと重力を実装します。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
CharacterControllerを使った移動実装

CharacterControllerを使った移動実装を解説します。
CharacterControllerは、物理演算を使わずに移動する方法です。
CharacterControllerの設定
CharacterControllerコンポーネントをプレイヤーオブジェクトに追加します。
CharacterControllerには、移動速度やジャンプ力などのパラメータを設定できます。
主なパラメータには、Height(高さ)、Radius(半径)、Slope Limit(坂の限界角度)などがあります。
CharacterControllerのMove関数を使って、移動を実行します。
Move関数は、Vector3の移動ベクトルを受け取り、キャラクターを移動させます。
移動は、物理演算を使わずに直接実行されるため、滑らかな操作感を実現できます。
基本的な移動処理の実装
基本的な移動処理の実装例を示します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using UnityEngine; public class PlayerController : MonoBehaviour { private CharacterController controller; public float moveSpeed = 5.0f; public float jumpForce = 8.0f; public float gravity = 20.0f; private Vector3 velocity; void Start() { controller = GetComponent(); } void Update() { // 入力の取得 float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); // 移動方向の計算 Vector3 move = transform.right * horizontal + transform.forward * vertical; move *= moveSpeed; // ジャンプ処理 if (controller.isGrounded) { if (Input.GetButtonDown("Jump")) { velocity.y = jumpForce; } else { velocity.y = -0.5f; // 地面に押し付ける } } else { velocity.y -= gravity * Time.deltaTime; } // 移動の実行 move.y = velocity.y; controller.Move(move * Time.deltaTime); } } |
このコードにより、基本的な移動とジャンプが実装できます。
Input.GetAxisで入力を受け取り、移動方向を計算します。
CharacterControllerのMove関数で移動を実行します。
カメラの向きを考慮した移動
FPSやTPSでは、カメラの向きを考慮して移動方向を計算します。
カメラの向きを基準に移動することで、直感的な操作を実現できます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public Camera playerCamera; // カメラの参照 void Update() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); // カメラの向きを基準に移動方向を計算 Vector3 forward = playerCamera.transform.forward; Vector3 right = playerCamera.transform.right; // Y軸成分を0にする(水平方向のみ) forward.y = 0f; right.y = 0f; forward.Normalize(); right.Normalize(); Vector3 move = right * horizontal + forward * vertical; move *= moveSpeed; // ジャンプ処理は同じ // ... controller.Move(move * Time.deltaTime); } |
このコードにより、カメラの向きを考慮した移動が実装できます。
カメラのforwardとrightベクトルを使って、移動方向を計算します。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
Rigidbodyを使った移動実装

Rigidbodyを使った移動実装を解説します。
Rigidbodyは、物理演算を使った移動方法です。
Rigidbodyの設定
Rigidbodyコンポーネントをプレイヤーオブジェクトに追加します。
Rigidbodyには、質量や摩擦などのパラメータを設定できます。
主なパラメータには、Mass(質量)、Drag(空気抵抗)、Angular Drag(回転抵抗)などがあります。
AddForce関数やMovePosition関数を使って、移動を実行します。
AddForce関数は、物理的な力を加えるため、よりリアルな動きを実現できます。
MovePosition関数は、直接位置を移動するため、より直接的な移動を実現できます。
AddForceを使った移動実装
AddForceを使った移動実装例を示します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
using UnityEngine; public class PlayerControllerRigidbody : MonoBehaviour { private Rigidbody rb; public float moveSpeed = 5.0f; public float jumpForce = 8.0f; void Start() { rb = GetComponent(); } void Update() { // 入力の取得 float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); // 移動方向の計算 Vector3 move = transform.right * horizontal + transform.forward * vertical; move *= moveSpeed; // 力を加える rb.AddForce(move, ForceMode.VelocityChange); // ジャンプ処理 if (Input.GetButtonDown("Jump") && IsGrounded()) { rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse); } } bool IsGrounded() { return Physics.Raycast(transform.position, Vector3.down, 1.1f); } } |
このコードにより、AddForceを使った移動が実装できます。
AddForce関数にForceModeを指定することで、力の加え方を調整できます。
VelocityChangeは、速度を直接変更するモードです。
Impulseは、瞬間的な力を加えるモードです。
MovePositionを使った移動実装
MovePositionを使った移動実装例を示します。
|
1 2 3 4 5 6 7 8 9 10 11 |
void FixedUpdate() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); Vector3 move = transform.right * horizontal + transform.forward * vertical; move *= moveSpeed * Time.fixedDeltaTime; // MovePositionを使った移動 rb.MovePosition(transform.position + move); } |
このコードにより、MovePositionを使った移動が実装できます。
MovePositionは、FixedUpdate内で使用することをおすすめします。
FixedUpdateは、物理演算の更新タイミングと同期します。
CharacterControllerとRigidbodyの使い分け
CharacterControllerは、FPSやTPSなどのアクションゲームに適しています。
直接的な移動制御が可能で、操作感が良いのが特徴です。
物理演算を使わないため、処理負荷が軽いのも利点です。
一方、Rigidbodyは、物理的な動きを再現したい場合に適しています。
例えば、キャラクターが重い物体を押したり、滑ったりする動作を実現できます。
ただし、物理演算を使うため、処理負荷が高くなる可能性があります。
一般的には、FPSやTPSではCharacterController、物理的な動きが必要なゲームではRigidbodyを使うことが多いです。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
プレイヤー移動でよくある失敗5選と解決方法

プレイヤー移動処理で、初心者が陥りやすい失敗があります。
ここでは、5つのよくある失敗と解決方法を紹介します。
失敗1:CharacterControllerとRigidbodyを同時に使う
❌ よくある失敗
- CharacterControllerとRigidbodyを同時に使う
- 衝突が正しく動作しない
- 移動が不安定になる
- 予期しない動作が発生する
CharacterControllerとRigidbodyを同時に使うと、衝突処理が競合します。
CharacterControllerは独自の衝突処理を持っており、Rigidbodyの物理演算と衝突します。
その結果、予期しない動作が発生する可能性があります。
✅ 正しいアプローチ
- CharacterControllerかRigidbodyのどちらか一方を使う
- 用途に応じて適切な方法を選ぶ
- FPSやTPSならCharacterControllerが適している
- 物理的な動きが必要ならRigidbodyを使う
失敗2:移動速度が速すぎる
移動速度が速すぎると、操作が難しくなります。
また、Time.deltaTimeを使わないと、フレームレートに依存した動きになります。
適切な速度を設定し、Time.deltaTimeを使うことが重要です。
解決方法:
- 移動速度を適切に設定する(一般的には3.0〜6.0)
- Time.deltaTimeを使って、フレームレートに依存しない移動にする
- 移動速度を調整して、操作感を確認する
- Rigidbodyを使う場合は、ForceModeを適切に設定する
失敗3:ジャンプが二重に実行される
ジャンプ処理で、条件チェックが不十分だと、ジャンプが二重に実行される可能性があります。
また、空中でもジャンプできるようになってしまう可能性があります。
⚠️ 解決方法
- isGroundedをチェックして、地面にいるときのみジャンプできるようにする
- ジャンプフラグを使って、連続ジャンプを防ぐ
- CharacterControllerのisGroundedプロパティを正しく使用する
- Rigidbodyの場合は、Raycastなどで地面判定を行う
失敗4:重力処理が正しく動作しない
重力処理を実装しないと、キャラクターが浮き続けてしまいます。
また、重力の値が適切でないと、ジャンプや落下の感覚が不自然になります。
解決方法:
- 重力を適切に設定する(一般的には9.81〜20.0)
- Time.deltaTimeを掛けて、フレームレートに依存しない重力にする
- CharacterControllerの場合は、Y軸の速度を手動で制御する
- Rigidbodyの場合は、重力を自動的に適用するか、手動で制御する
失敗5:カメラの向きを考慮しない
カメラの向きを考慮しないと、移動方向が直感的でなくなります。
例えば、カメラが右を向いているときに、Wキーを押すと右に移動するようになってしまいます。
⚠️ 解決方法
- カメラのforwardとrightベクトルを使って、移動方向を計算する
- Y軸成分を0にして、水平方向のみの移動にする
- ベクトルを正規化して、方向のみを取り出す
- カメラのTransformを参照して、正しい方向を計算する
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
実用的な移動システム完成までの4ステップ

- STEP1CharacterControllerの設定(所要30分)
CharacterControllerコンポーネントを追加し、パラメータを設定する。
Height、Radius、Slope Limitなどを適切に設定する。
学べること:CharacterControllerの設定、パラメータの調整
成果物:CharacterControllerが設定されたオブジェクト
- STEP2基本移動処理の実装(所要1時間)
入力を受け取り、移動方向を計算して、Move関数で移動する。
学べること:入力処理、移動処理、Move関数
成果物:基本的な移動ができるシステム
- STEP3ジャンプ処理の実装(所要1時間)
ジャンプと重力処理を実装する。
isGroundedをチェックして、地面にいるときのみジャンプできるようにする。
学べること:ジャンプ処理、重力処理、条件分岐
成果物:ジャンプができるシステム
- STEP4カメラ連動と調整(所要1時間30分)
カメラの向きを考慮した移動を実装し、操作感を調整する。
学べること:カメラ連動、操作感の調整
成果物:実用的な移動システム
合計4時間で、実用的な移動システムが完成します。
実装時のチェックリスト
✅ 実装時のチェックリスト
- CharacterControllerとRigidbodyを同時に使っていないか
- 移動速度が適切か(3.0〜6.0程度)
- Time.deltaTimeを使っているか
- ジャンプ処理でisGroundedをチェックしているか
- 重力処理が正しく実装されているか
- カメラの向きを考慮しているか
- 操作感が適切か(実際にプレイして確認)
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
まとめ

Unityでのプレイヤー移動処理は、CharacterControllerやRigidbodyを使って実現できます。
適切な実装により、滑らかなキャラクター操作を作ることができるでしょう。
✅ 記事の要点まとめ
- 移動処理の基本:CharacterControllerとRigidbodyの使い分け
- CharacterController:物理演算を使わない移動方法、FPS/TPSに適している
- Rigidbody:物理演算を使った移動方法、物理的な動きが必要な場合に適している
- 実装方法:Move関数、AddForce関数、MovePosition関数の使い方
- よくある失敗5選:同時使用、移動速度、ジャンプ処理、重力処理、カメラ連動
- 実用的なシステム:4ステップで完成(合計4時間)
今日から始める3ステップ:
- STEP1:CharacterControllerを設定する(所要30分)
- STEP2:移動処理を実装する(所要1時間)
- STEP3:ジャンプ処理を実装する(所要1時間)
あなたのペースで、少しずつ進めていけば大丈夫です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる



コメント