ゲーム開発でキャラクターを動かそうとすると、様々な計算が必要になります。
「キャラクターをどうやって動かすの?」
「速度と位置の関係は?」
「入力から移動を計算するには?」
そんな疑問を抱えている方に向けて、キャラクター移動の計算について、初心者でも理解できるように解説します。
\読むだけで終わらせない!実際にゲームを作って実力をつけよう/
トレンド×入門に最適
Unity ノンフィールドRPG
+スレスパ風JRPG講座
Unity6対応・スマホ化対応の最新カリキュラム。今もっとも人気のデッキ構築型ゲームをJRPGと組み合わせて実装。初心者が最初に選ぶ一本として最適です。
王道アクションに挑戦
Unity 2Dアクションゲーム
の作り方講座(ロックマン風)
ロックマン風の本格横スクロールACTをスマホ化・広告実装まで対応。7ステージ+ラスボスという市販ゲームに近い本格構成で、リリースまで見据えて作れます。
3D入門に最適
ゼルダ風3Dアクションゲーム
の作り方講座
ゼルダの伝説・モンハン・原神のような3Dアクションをスマホ対応で作れる入門講座。初心者でも全16回でしっかり3D開発の基礎を習得できます。
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
キャラクター移動の基本
キャラクター移動とは、キャラクターの位置を時間とともに更新していく技術です。
ゲームでは、毎フレームキャラクターの位置を計算して、新しい位置に移動させることで、動きを実現しています。
基本的な計算式は、新しい位置 = 現在の位置 + 移動量という形になります。
移動の基本概念
キャラクター移動を実現するには、以下の要素が必要になります。
- 位置(Position):キャラクターがどこにいるか
- 速度(Velocity):キャラクターがどの速さで動いているか
- 方向(Direction):キャラクターがどの方向に向いているか
- 時間(Time):移動に経過した時間
移動計算の種類
ゲームで使われる主な移動計算には、以下のようなものがあります。
- 等速移動:一定の速度で移動
- 加速度移動:速度が変化しながら移動
- 物理演算による移動:物理エンジンを使った移動
- 入力に基づく移動:プレイヤーの入力に応じた移動
- 位置を時間とともに更新していく技術
- 速度と方向から移動量を計算する
- Time.deltaTimeを使って、フレームレートに依存しない移動を実現
- 入力処理と組み合わせて、プレイヤー制御を実現
位置の更新計算
キャラクターの位置を更新する基本的な計算から見ていきましょう。
基本的な位置更新
最もシンプルな位置更新は、移動量を加算する方法です。
|
1 2 3 4 5 6 |
void Update() { Vector3 movement = new Vector3(1, 0, 0); // 移動量 transform.position += movement * Time.deltaTime; } |
Time.deltaTimeを掛けることで、フレームレートに依存しない移動が可能になります。
速度を使った位置更新
速度ベクトルを使って位置を更新する方法です。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
public float speed = 5.0f; // 移動速度 public Vector3 direction = Vector3.forward; // 移動方向 void Update() { // 速度 = 方向 * 速さ Vector3 velocity = direction * speed; // 位置の更新 = 現在の位置 + 速度 * 時間 transform.position += velocity * Time.deltaTime; } |
新しい位置 = 現在の位置 + 速度 × 時間という計算式が基本になります。
Rigidbodyを使った位置更新
物理エンジンを使う場合は、Rigidbodyのvelocityを設定します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public float speed = 5.0f; public Vector3 direction = Vector3.forward; private Rigidbody rb; void Start() { rb = GetComponent(); } void Update() { Vector3 velocity = direction * speed; rb.velocity = velocity; } |
物理エンジンを使う場合、位置の更新は自動的に行われます。
速度と加速度の計算
キャラクターの移動をより自然にするため、速度と加速度の計算を見ていきましょう。
等速移動
速度が一定の等速移動です。
|
1 2 3 4 5 6 7 8 9 |
public float speed = 5.0f; public Vector3 direction = Vector3.forward; void Update() { Vector3 velocity = direction * speed; transform.position += velocity * Time.deltaTime; } |
加速度を使った移動
速度を時間とともに変化させることで、より自然な動きを実現できます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public float maxSpeed = 5.0f; public float acceleration = 10.0f; public Vector3 direction = Vector3.forward; private Vector3 currentVelocity = Vector3.zero; void Update() { // 目標速度を計算 Vector3 targetVelocity = direction * maxSpeed; // 現在の速度を目標速度に向けて加速 currentVelocity = Vector3.MoveTowards( currentVelocity, targetVelocity, acceleration * Time.deltaTime ); // 位置を更新 transform.position += currentVelocity * Time.deltaTime; } |
Vector3.MoveTowardsを使うことで、速度を滑らかに変化させられます。
減速の実装
入力がなくなった時に、速度を減らしていく処理です。
|
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 |
public float maxSpeed = 5.0f; public float acceleration = 10.0f; public float deceleration = 15.0f; private Vector3 currentVelocity = Vector3.zero; private bool isMoving = false; void Update() { // 入力に基づいて移動するか判定 isMoving = /* 入力があるかどうか */; if (isMoving) { // 加速 Vector3 targetVelocity = direction * maxSpeed; currentVelocity = Vector3.MoveTowards( currentVelocity, targetVelocity, acceleration * Time.deltaTime ); } else { // 減速 currentVelocity = Vector3.MoveTowards( currentVelocity, Vector3.zero, deceleration * Time.deltaTime ); } transform.position += currentVelocity * Time.deltaTime; } |
これにより、入力がなくなった時に自然に停止する動きになります。
方向ベクトルの計算
キャラクターを特定の方向に移動させるための計算を見ていきましょう。
正規化ベクトル
方向ベクトルは、正規化(長さを1にする)する必要があります。
|
1 2 3 |
Vector3 direction = new Vector3(1, 0, 1); direction = direction.normalized; // 正規化(長さを1に) |
正規化することで、どの方向でも同じ速度で移動できます。
カメラの向きを基準とした方向
カメラの向きを基準に、キャラクターを移動させる方法です。
|
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 Transform cameraTransform; public float speed = 5.0f; void Update() { // カメラの前方と右方向を取得 Vector3 cameraForward = cameraTransform.forward; Vector3 cameraRight = cameraTransform.right; // Y軸成分を0にして、水平方向のみにする cameraForward.y = 0; cameraRight.y = 0; cameraForward.Normalize(); cameraRight.Normalize(); // 入力に基づいて方向を計算 float horizontal = Input.GetAxis("Horizontal"); // A/Dキー float vertical = Input.GetAxis("Vertical"); // W/Sキー Vector3 direction = (cameraForward * vertical + cameraRight * horizontal).normalized; // 移動 transform.position += direction * speed * Time.deltaTime; } |
これにより、カメラの向きに関係なく、プレイヤーの入力に応じて移動できます。
Transformの向きを使った方向
キャラクター自体の向きを基準に移動させる方法です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public float speed = 5.0f; void Update() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); // 入力に基づいて方向を計算 Vector3 inputDirection = new Vector3(horizontal, 0, vertical).normalized; // キャラクターの向きを基準に変換 Vector3 worldDirection = transform.TransformDirection(inputDirection); worldDirection.y = 0; // Y軸成分を0に worldDirection.Normalize(); // 移動 transform.position += worldDirection * speed * Time.deltaTime; } |
Transform.TransformDirectionを使うことで、ローカル座標をワールド座標に変換できます。
入力処理と移動の組み合わせ
プレイヤーの入力から移動を計算する方法を見ていきましょう。
基本的な入力処理
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public float speed = 5.0f; void Update() { // 入力を取得 float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); // 方向ベクトルを計算 Vector3 direction = new Vector3(horizontal, 0, vertical).normalized; // 移動 transform.position += direction * speed * Time.deltaTime; } |
Input.GetAxisで入力値を取得し、方向ベクトルを計算して移動します。
ジャンプの実装
Y軸方向の移動を追加して、ジャンプを実装します。
|
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 41 42 43 44 |
public float speed = 5.0f; public float jumpForce = 10.0f; public float gravity = -20.0f; public bool isGrounded = false; private Vector3 velocity; private CharacterController controller; void Start() { controller = GetComponent(); } void Update() { // 地面にいるかチェック isGrounded = controller.isGrounded; if (isGrounded && velocity.y < 0) { velocity.y = -2f; // 地面に押し付ける } // 水平移動 float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); Vector3 direction = new Vector3(horizontal, 0, vertical).normalized; Vector3 move = direction * speed; // ジャンプ if (Input.GetButtonDown("Jump") && isGrounded) { velocity.y = Mathf.Sqrt(jumpForce * -2f * gravity); } // 重力の適用 velocity.y += gravity * Time.deltaTime; move.y = velocity.y; // 移動 controller.Move(move * Time.deltaTime); } |
CharacterControllerを使うことで、簡単にジャンプと重力を実装できます。
入力のスムージング
入力値を滑らかにすることで、より自然な動きを実現できます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public float speed = 5.0f; public float inputSmoothing = 5.0f; private Vector3 smoothedInput = Vector3.zero; void Update() { // 入力値を取得 float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); Vector3 rawInput = new Vector3(horizontal, 0, vertical); // 入力を滑らかにする smoothedInput = Vector3.Lerp(smoothedInput, rawInput, inputSmoothing * Time.deltaTime); // 移動 Vector3 direction = smoothedInput.normalized; transform.position += direction * speed * Time.deltaTime; } |
これにより、入力の急な変化が緩和され、滑らかな動きになります。
Unityでの実装例(C#コード)
Unityでキャラクター移動を実装する具体的な例を見ていきましょう。
基本的な移動コントローラー
|
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
using UnityEngine; public class BasicMovementController : MonoBehaviour { [Header("移動設定")] public float speed = 5.0f; public float acceleration = 10.0f; public float deceleration = 15.0f; [Header("カメラ参照")] public Transform cameraTransform; [Header("ジャンプ設定")] public float jumpForce = 10.0f; public float gravity = -20.0f; private CharacterController controller; private Vector3 currentVelocity; private Vector3 velocity; private bool isGrounded; void Start() { controller = GetComponent(); } void Update() { // 地面にいるかチェック isGrounded = controller.isGrounded; if (isGrounded && velocity.y < 0) { velocity.y = -2f; } // 入力を取得 float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); // カメラの向きを基準に方向を計算 Vector3 direction = Vector3.zero; if (cameraTransform != null) { Vector3 cameraForward = cameraTransform.forward; Vector3 cameraRight = cameraTransform.right; cameraForward.y = 0; cameraRight.y = 0; cameraForward.Normalize(); cameraRight.Normalize(); direction = (cameraForward * vertical + cameraRight * horizontal).normalized; } else { direction = new Vector3(horizontal, 0, vertical).normalized; } // 速度を計算 Vector3 targetVelocity = direction * speed; if (direction.magnitude > 0.1f) { // 加速 currentVelocity = Vector3.MoveTowards( currentVelocity, targetVelocity, acceleration * Time.deltaTime ); } else { // 減速 currentVelocity = Vector3.MoveTowards( currentVelocity, Vector3.zero, deceleration * Time.deltaTime ); } // ジャンプ if (Input.GetButtonDown("Jump") && isGrounded) { velocity.y = Mathf.Sqrt(jumpForce * -2f * gravity); } // 重力の適用 velocity.y += gravity * Time.deltaTime; // 移動 Vector3 move = currentVelocity; move.y = velocity.y; controller.Move(move * Time.deltaTime); } } |
このクラスでは、基本的な移動、加速・減速、ジャンプを実装しています。
- Time.deltaTimeを掛けることで、フレームレートに依存しない移動になる
- CharacterControllerを使う場合、重力は手動で適用する必要がある
- 方向ベクトルは必ず正規化する
- Y軸方向の移動は、水平移動とは別に管理する
キャラクター移動の実装手順
※この順番を守らずに作り始めると、だいたい後で全部作り直すことになります。
- STEP1基本的な位置更新を実装
速度とTime.deltaTimeを使って、位置を更新する基本コードを実装します。transform.position += velocity * Time.deltaTimeの計算を実装しましょう。
- STEP2入力処理の追加
Input.GetAxisを使って、プレイヤーの入力を取得します。入力値から方向ベクトルを計算しましょう。
- STEP3方向ベクトルの計算
入力から方向ベクトルを計算します。カメラの向きを基準にする場合は、カメラの前方と右方向を使いましょう。
- STEP4加速度と減速の追加
速度を滑らかに変化させるため、加速と減速を追加します。Vector3.MoveTowardsを使って、速度を変化させましょう。
- STEP5ジャンプと重力の実装
必要に応じて、ジャンプと重力を実装します。CharacterControllerを使うと、実装が簡単になります。
よくある問題と解決方法
キャラクター移動を実装する際によくある問題と、その解決方法を紹介します。
移動速度がフレームレートに依存する
Time.deltaTimeを掛けていない場合、移動速度がフレームレートに依存してしまいます。
|
1 2 3 4 5 6 |
// ✅ 正しい実装 transform.position += direction * speed * Time.deltaTime; // ❌ 間違った実装 transform.position += direction * speed; // フレームレートに依存 |
斜め方向の移動速度が速くなる
方向ベクトルを正規化していない場合、斜め方向の移動速度が速くなってしまいます。
|
1 2 3 4 5 6 |
// ✅ 正しい実装 Vector3 direction = new Vector3(horizontal, 0, vertical).normalized; // ❌ 間違った実装 Vector3 direction = new Vector3(horizontal, 0, vertical); // 正規化されていない |
カメラの向きが影響する
カメラの向きを基準に移動させたい場合は、カメラの前方と右方向を使います。
|
1 2 3 4 5 6 7 8 9 10 |
Vector3 cameraForward = cameraTransform.forward; Vector3 cameraRight = cameraTransform.right; cameraForward.y = 0; cameraRight.y = 0; cameraForward.Normalize(); cameraRight.Normalize(); Vector3 direction = (cameraForward * vertical + cameraRight * horizontal).normalized; |
重力が適用されない
CharacterControllerを使う場合、重力は手動で適用する必要があります。
|
1 2 3 4 |
velocity.y += gravity * Time.deltaTime; move.y = velocity.y; controller.Move(move * Time.deltaTime); |
- 移動速度がおかしい → Time.deltaTimeを掛ける、方向ベクトルを正規化する
- 斜め方向が速い → 方向ベクトルを必ず正規化する
- カメラの向きが影響する → カメラの前方と右方向を使う
- 重力が効かない → CharacterControllerを使う場合は手動で適用する
キャラクター移動の学習を深めるには
キャラクター移動の基礎を理解した後は、さらに深く学んでいくことが大切です。
Unity入門の森では、ゲーム開発に必要な知識を体系的に学べる環境が整っています。
特に、2Dアクションゲーム講座では、キャラクター移動の実践的な使い方を学べます。
また、永久会員チケットでは、ゲーム開発全般に関する知識を幅広くカバーしているため、キャラクター移動以外にも応用できる知識が身につきます。
キャラクター移動の基礎から応用まで、実際のコードと紐付けて学べるので、理解が深まりやすいはずです。
- キャラクター移動の基本的な概念と計算
- 位置の更新方法(速度とTime.deltaTime)
- 速度と加速度の計算方法
- 方向ベクトルの計算と正規化
- Unityでの実装例(C#コード)
記事を読んで「作ってみたい!」と思ったら!人気ゲームを題材にした講座で実力をつけよう
知識を読むだけで終わらせるのはもったいない。実際に手を動かしてゲームを1本完成させることで、理解が一気に深まります。人気タイトルをモデルにした講座で、ゲーム開発の第一歩を踏み出しましょう。
Unity ノンフィールドRPG+スレスパ風JRPG講座【Unity6対応!トレンドのデッキ構築×JRPGをスマホ向けに作れる!】

- Unity6対応・スマホ化対応で最新環境のゲーム開発が学べる
- Slay the Spire風のデッキ構築システム×JRPGの組み合わせを実装
- 初心者でも取り組みやすい丁寧な解説構成
- ノンフィールドRPGとデッキ構築JRPGの2つを合わせて学ぶのがおすすめ
Unity ノンフィールドRPGの作り方講座+Slay the Spire風デッキ構築JRPGの作り方講座は、今もっともトレンドのデッキ構築型ゲームシステムをJRPGと組み合わせて実装する方法を学べる講座です。
Unity6対応・スマホ化対応の最新カリキュラムで、コラムやTIPSで読んで「なるほど」と思った知識を、実際に動くゲームとして形にする体験ができます。
「Slay the Spireみたいなゲームを自分でも作ってみたい!」という人の最初の一歩として最適な講座です。
Unity6対応・スマホ化対応の最新カリキュラム
トレンドのデッキ構築×JRPGを最速で実装しよう
→ スレスパ風デッキ構築JRPG講座を見てみる
スマホ対応の最新環境で、ゲーム開発の第一歩を踏み出そう!
Unity 2Dアクションゲームの作り方講座(ロックマン風)【全16回!スマホ化・広告実装まで対応した本格横スクロールACTを作れる!】

- ロックマン・マリオ・カービィのような横スクロールACTをゼロから開発
- 7ステージ+ラスボスステージの市販ゲームに近い本格的なゲーム設計
- スマホ化・AdMob広告実装まで対応してリリースまで見据えた構成
- 敵AI15体・多彩なマップギミック・武器システムを完全実装
- 完全オリジナルゲームをアセット不使用で素材提供付きで制作
Unity 2Dアクションゲームの作り方講座(ロックマン風)は、ロックマン・スーパーマリオ・星のカービィのような2D横スクロールアクションゲームを開発できるようになる本格的な講座です。
TIPSやコラムで学んだ当たり判定・物理挙動・敵AIの知識を、実際のゲームコードとして実装する体験が全16回に凝縮されています。スマホ化・広告実装まで対応しているため、作って終わりではなくリリースまで見据えた実践スキルが身につきます。
「読んで理解した知識を、動くゲームとして形にしたい」という人に強くおすすめの一本です。
スマホ化・広告実装まで対応した本格横スクロールACT
ロックマン風の2Dアクションゲームをリリースまで作り上げよう
→ 2Dアクションゲームの作り方講座を見てみる
広告収益まで視野に入れた実践スキルを今すぐ手に入れよう!
ゼルダ風3Dアクションゲームの作り方講座【全16回!初心者でも3Dアクションがスマホ対応で作れる!】

- ゼルダの伝説・モンハン・原神のような3Dアクションをゼロから開発
- 初心者でも取り組みやすい丁寧な解説構成
- スマホ化対応で実機で動かせるゲームが完成
- アセットを使った実践的なゲーム開発手法が身につく
- 画像・動画・全ソースコード公開の充実したサポート
ゼルダ風3Dアクションゲームの作り方講座は、ゼルダの伝説・モンハン・原神のような本格的な3Dアクションゲームを作りたい人におすすめの入門講座です。
コラム・TIPSで「3Dゲームはなんとなく難しそう」と感じていた人でも、全16回の丁寧な解説で確実に完成まで到達できます。スマホ化対応で実機で動かせるため、作った達成感がひときわ大きい講座です。
「3Dゲームの仕組みを理解した次は、実際に自分で作ってみたい」という人の最初の一歩として最適です。
初心者でも3Dアクションがスマホ対応で完成する
ゼルダ風3Dアクションゲームで3D開発の第一歩を踏み出そう
→ ゼルダ風3Dアクションゲームの作り方講座を見てみる
3D開発の壁を一気に突破!スマホで動くオリジナルゲームを完成させよう!
まとめ

この記事では、キャラクター移動の計算方法について解説しました。
キャラクター移動は、新しい位置 = 現在の位置 + 速度 × 時間という基本的な計算式から始まります。
Time.deltaTimeを使うことでフレームレートに依存しない移動を実現し、方向ベクトルを正規化することで、どの方向でも同じ速度で移動できます。
「キャラクター移動って難しそう💧」と感じる方もいるかもしれませんが、基本的な計算式を理解すれば実装できます。
まずはシンプルな等速移動から始めて、徐々に加速・減速やジャンプなどの機能を追加していきましょう。
- 新しい位置 = 現在の位置 + 速度 × 時間が基本の計算式
- Time.deltaTimeを掛けることで、フレームレートに依存しない移動になる
- 方向ベクトルは必ず正規化する(どの方向でも同じ速度にするため)
- 加速と減速を実装することで、より自然な動きになる
- CharacterControllerを使うと、ジャンプと重力の実装が簡単になる
まずは基本的な実装から始めて、徐々に応用的な機能に挑戦していきましょう。
Unity入門の森では、キャラクター移動の基礎から応用まで、実践的な知識を体系的に学べる環境が整っています。
疑問があれば、ぜひ活用してみてください。
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。





コメント