「キャラクターを移動させるには、どう計算すればいいのか?」
「速度と加速度の違いが分からない」
「方向ベクトルを使って移動させる方法を知りたい」
そんな疑問が浮かびますよね。
ゲームでキャラクターを滑らかに動かすには、速度・加速度・方向ベクトルの理解が欠かせません。
これらを組み合わせることで、自然な移動を実現できます。
この記事では、キャラクターの移動計算の基礎を、Unity実装例とともに解説します。
- キャラクターの移動計算方法が分からない…
- 速度と加速度の違いが理解できず、自然な動きを実装できない。
- 方向ベクトルを使って移動させる方法を知りたい。
✨ この記事でわかること
- キャラクター移動計算の基本となる速度と加速度
- 方向ベクトルを使った移動の実装方法
- 等速運動と等加速度運動の違い
- Unityでの移動処理の実装手順とコード例
- 初心者でも理解できる物理演算の基礎
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます
キャラ移動計算とは何か(ゲーム制作目線)

キャラクターの移動計算は、速度・加速度・方向ベクトルを使って、キャラクターの位置を更新する処理です。
単純に位置を直接変更するだけでは、滑らかな動きは実現できません。
物理法則に基づいた計算を行うことで、自然な移動を実現できます。
キャラ移動計算の基本要素は、以下の3つです。
- 速度(Velocity):単位時間あたりの移動距離
- 加速度(Acceleration):速度の変化率
- 方向ベクトル:移動する方向を表すベクトル
Unityでは、Time.deltaTimeを使って、フレームレートに依存しない滑らかな移動を実現します。
ゲームでの具体的な使い道

キャラクター移動計算が、ゲームでどう使われているか確認してみましょう。
アクションゲームのキャラ移動
アクションゲームでは、プレイヤーが入力した方向にキャラクターを移動させます。
入力方向を方向ベクトルとして取得し、速度をかけることで移動を実現します。
物理演算を使った移動
重力や摩擦などの物理演算を使った移動では、加速度を使います。
落下やジャンプの実装で、加速度を使って速度を更新します。
追尾AIの移動
敵キャラクターがプレイヤーを追いかける場合、プレイヤーへの方向ベクトルを計算し、その方向に移動させます。
毎フレーム方向を更新すれば、滑らかに追尾します。
車や乗り物の移動
レースゲームなどで車を動かす場合、加速度を使って加速や減速を実現します。
入力に応じて加速度を変更し、速度を更新します。
キャラ移動計算が使われる場面
- アクションゲームのキャラクター移動
- 物理演算を使った落下やジャンプ
- 敵キャラクターの追尾移動
- 車や乗り物の加速・減速
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
移動計算の基本原理:物理量(速度・加速度・方向)の相関関係

キャラクターの移動計算をシンプルに定義すると、「どの方向に(方向ベクトル)」「どのくらいの速さで(速度)」「どのくらいの時間(Time.deltaTime)」動かすかを掛け合わせる処理になります。
等速運動の計算
等速運動では、速度が一定で、加速度は0です。
移動距離は「速度 × 時間」で計算できますね。
Unityでは、Time.deltaTimeを使って、前フレームからの経過時間を取得し、移動量を計算します。
等加速度運動の計算
等加速度運動では、速度が加速度によって変化します。
速度の更新式は「新しい速度 = 現在の速度 + 加速度 × 時間」です。
位置の更新式は「新しい位置 = 現在の位置 + 速度 × 時間」です。
方向ベクトルの正規化
方向ベクトルは、必ず正規化(長さを1にすること)します。
正規化すれば、速度の値が直接移動速度を表すようになります。
Unityでは、Vector3.Normalizeやnormalizedプロパティを使って正規化できます。
⚠️ 重要なポイント
- 移動距離は「方向ベクトル × 速度 × 時間」で計算する
- 等速運動では加速度が0、等加速度運動では加速度が存在する
- 方向ベクトルは必ず正規化して、速度を直接制御できるようにする
- Time.deltaTimeを使って、フレームレートに依存しない移動を実現する
Unityで実装する際の注意点(代表例)

Unityでキャラクター移動計算を実装する場合の注意点を見ていきましょう。
基本的な等速移動
入力に応じて、方向ベクトルを取得し、等速で移動させる実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class CharacterMovement : MonoBehaviour { public float moveSpeed = 5f; // 移動速度 void Update() { // 入力方向を取得 float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); // 方向ベクトルを作成 Vector3 direction = new Vector3(horizontal, 0, vertical); direction.Normalize(); // 正規化 // 移動量を計算して位置を更新 Vector3 movement = direction * moveSpeed * Time.deltaTime; transform.position += movement; } } |
加速度を使った移動
加速度を使って加速・減速を実現する実装です。
|
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 |
public class CharacterMovement : MonoBehaviour { public float acceleration = 10f; // 加速度 public float maxSpeed = 5f; // 最大速度 private Vector3 velocity = Vector3.zero; // 現在の速度 void Update() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); Vector3 direction = new Vector3(horizontal, 0, vertical); direction.Normalize(); // 加速度を加える velocity += direction * acceleration * Time.deltaTime; // 最大速度を制限 if (velocity.magnitude > maxSpeed) { velocity = velocity.normalized * maxSpeed; } // 位置を更新 transform.position += velocity * Time.deltaTime; } } |
Rigidbodyを使った物理演算
Unityの物理エンジンを使った移動実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class CharacterMovement : MonoBehaviour { public float moveSpeed = 5f; private Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); } void Update() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); Vector3 direction = new Vector3(horizontal, 0, vertical); direction.Normalize(); // Rigidbodyを使って移動 rb.velocity = direction * moveSpeed; } } |
CharacterControllerを使った移動
CharacterControllerコンポーネントを使った移動実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class CharacterMovement : MonoBehaviour { public float moveSpeed = 5f; private CharacterController controller; void Start() { controller = GetComponent<CharacterController>(); } void Update() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); Vector3 direction = new Vector3(horizontal, 0, vertical); direction.Normalize(); // CharacterControllerを使って移動 Vector3 movement = direction * moveSpeed * Time.deltaTime; controller.Move(movement); } } |
Time.deltaTimeの重要性
Time.deltaTimeを使うことで、フレームレートに関係なく一定の速度で移動できますね。
Time.deltaTimeを使わないと、フレームレートが高い環境では速く、低い環境では遅く移動してしまいます。
必ずTime.deltaTimeを使って移動量を計算しましょう。
方向ベクトルの正規化
方向ベクトルを正規化しないと、斜め方向の移動が速くなってしまいます。
例えば、(1, 0, 1)というベクトルの長さは√2(約1.41)なので、正規化しないと横方向の1.41倍の速度で移動してしまいます。
正規化すれば、どの方向でも同じ速度で移動できますね。

まとめ

この記事では、キャラクターの移動計算について見てきました。
重要なポイントをおさらいします。
重要なポイント:
- キャラ移動計算は、速度・加速度・方向ベクトルを使って位置を更新する処理
- 移動距離は「方向ベクトル × 速度 × 時間」で計算する
- 等速運動では加速度が0、等加速度運動では加速度が存在する
- 方向ベクトルは必ず正規化して、速度を直接制御できるようにする
- Time.deltaTimeを使って、フレームレートに依存しない移動を実現する
キャラクターの移動計算は、ゲーム開発で最も基本的な技術の一つです。
速度、加速度、方向ベクトルを理解すれば、様々な移動パターンを実現できます。
物理法則に基づいた計算を行うことで、自然な動きを実現できます。
実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、キャラ移動計算を含む物理演算を、実際のゲーム実装とともに体系的に学べます。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント