1. はじめに
Unityを使って2Dアクションゲームを作ってみたいけど、「どうやってプレイヤーを動かすの?」と思っていませんか?この記事では、Unity初心者向けにプレイヤーの移動やジャンプ、敵を倒す仕組みをわかりやすく解説します。
2Dアクションゲームでは、プレイヤーがスムーズに動けることが大切です。今回の記事では、以下のアクションを実装していきます。
✅ プレイヤーの移動(キーボード入力で動かせるようにする)
✅ ジャンプ(スペースキーでジャンプできるようにする)
✅ 敵を倒す(敵を踏むと倒せる仕組みを作る)
✅ ダメージを受ける(敵に当たったときにHPを減らす)
✅ 敵を踏んだときに跳ねる(スーパーマリオのようなジャンプを実装)
また、Unityの**新しい入力システム(Input System)**を使って、キーボードやコントローラーの操作を簡単に設定する方法も紹介します。
この記事を読めば、2Dアクションゲームの基本的なプレイヤー操作をスムーズに作れるようになります!
それでは、さっそくプレイヤーを動かしてみましょう!
2. プレイヤーを移動させる
まずは、プレイヤーがキーボード入力で左右に動けるようにしていきましょう。
Unityの新しい入力システム 「Input System」 を使うと、簡単にキーボードやコントローラーの操作を設定できます。
2-1. Input Systemを導入する
Unityには 「旧入力システム (Input.GetAxis)」 と 「新入力システム (Input System)」 の2種類がありますが、今回は新しい Input System を使います。
このシステムを導入することで、キーボードやゲームパッドの入力を柔軟に設定できます。
① Input Systemをインストールする
- Unityのメニューから
Window
→Package Manager
を開きます。 Unity Registry
を選択し、検索ボックスにInput System
と入力します。Input System
パッケージを見つけたらInstall
をクリックします。- インストールが完了したら、Unityを再起動してください。
② PlayerオブジェクトにPlayerInputを追加する
Hierarchy
(ヒエラルキー) でPlayer
オブジェクトを選択します。Inspector
(インスペクター) でAdd Component
をクリックし、PlayerInput
を追加します。PlayerInput
のCreate Actions
ボタンをクリックします。InputAction
の保存先を指定し、新しくActions
フォルダを作成して保存します。
これで、キーボードやコントローラーの入力を受け取る準備ができました!
2-2. 移動スクリプトを作成する
次に、プレイヤーが WASDキー で移動できるように、スクリプトを作成していきます。
① スクリプトを作成する
Project
(プロジェクト)ウィンドウ を開きます。Assets
フォルダ内で 右クリック →Create
→C# Script
を選択します。- スクリプトの名前を
Player
に変更します。 - 作成した
Player
スクリプトを Playerオブジェクトにドラッグ&ドロップ してアタッチします。

② スクリプトを編集する
Player
スクリプトを開き、以下のコードを入力してください。
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField, Header("移動速度")]
public float moveSpeed = 5f;
// 入力された方向を格納する変数
private Vector2 inputDirection;
// 移動用のRigidbody2D
private Rigidbody2D rigid;
void Start()
{
// PlayerのRigidbody2Dコンポーネントを取得する
rigid = GetComponent<Rigidbody2D>();
}
void Update()
{
Move();
}
private void Move()
{
// プレイヤーが入力した方向に移動速度分の力を加える
rigid.velocity = new Vector2(inputDirection.x * moveSpeed, rigid.velocity.y);
}
public void OnMove(InputAction.CallbackContext context)
{
// 移動方向の入力情報を取得
inputDirection = context.ReadValue<Vector2>();
}
}
2-3. PlayerInputの設定
スクリプトを実装したら、Unity側の PlayerInput
の設定を行いましょう。
① Behaviorの設定
Player
オブジェクトを選択します。Inspector
でPlayerInput
を探し、Behavior
の項目をInvoke Unity Events
に変更します。

② イベントの設定
PlayerInput
のEvents
タブ を開きます。Move
のところにPlayer
オブジェクトをドラッグ&ドロップ します。No Function
→Player
→OnMove
を選択します。

2-4. 移動速度を調整する
最後に、移動速度を調整して、実際に動かしてみましょう。
Player
オブジェクトを選択します。Inspector
のPlayer
スクリプトのMove Speed
に値を設定します。(例:5
)Play
ボタンを押して、WASDキーで移動できるか確認しましょう!
2-5. 動作確認
✅ WASDキーを押すと、プレイヤーが移動するか?
✅ 速度を調整すると、移動スピードが変わるか?
✅ エラーが出ていないか?

以上の設定が完了すれば、プレイヤーがスムーズに移動できるようになります!
次は ジャンプ機能 を追加していきましょう!
3. プレイヤーをジャンプさせる
プレイヤーがジャンプできるようにして、アクションゲームらしくしていきましょう!
今回は スペースキーを押すとジャンプ できるようにしていきます。
3-1. ジャンプ用のアクションを追加する
まずは、Input System
にジャンプ用のアクションを設定します。
① InputActionを編集する
Project
ウィンドウで 前回作成した Input Action ファイル を開きます。Player
を選択し、Actions
の+
ボタンをクリックします。- 新しいアクションの名前を
Jump
に変更 します。
② キーを設定する
Jump
の下にあるNo Binding
を選択します。- 右側の
Path
のボタン(参画マーク) をクリックします。 - 一覧から
Keyboard
→By Location
→Space
を選択 します。 Save Asset
をクリックして保存 します。

これで、スペースキーがジャンプ用のボタンとして設定されました!
3-2. スクリプトにジャンプ処理を追加する
次に、プレイヤーがジャンプするスクリプトを作成していきます。
① ジャンプ用の変数を追加
Player
スクリプトを開き、以下のコードを Start
メソッドの上に追加します。
[SerializeField, Header("ジャンプ力")]
private float jumpSpeed = 10f;
jumpSpeed
の値を調整することで、ジャンプの高さを変更できます。
② ジャンプ用の関数を追加
次に、OnJump
という関数を作成し、プレイヤーがジャンプできるようにします。
public void OnJump(InputAction.CallbackContext context)
{
if (!context.performed)
{
return;
}
rigid.AddForce(Vector2.up * jumpSpeed, ForceMode2D.Impulse);
}
context.performed
で、ジャンプキーが押されたタイミングだけ処理を実行 します。rigid.AddForce(Vector2.up * jumpSpeed, ForceMode2D.Impulse);
で、上方向に力を加えてジャンプさせます。
3-3. PlayerInputの設定
スクリプトを書いたら、Unity側でジャンプのイベントを設定 します。
Player
オブジェクトを選択します。Inspector
のPlayerInput
のEvents
タブを開きます。Jump
の+
ボタンをクリックします。Player
オブジェクトをJump
の欄に ドラッグ&ドロップ します。No Function
→Player
→OnJump
を選択します。

これで、スペースキーを押したときに OnJump
関数が呼び出されるようになります!
3-4. ジャンプ速度を調整する
Player
オブジェクトを選択します。Inspector
でPlayer
スクリプトのJump Speed
に値を設定します。- 例えば
10
に設定すると、ちょうどよくジャンプできるはずです。

3-5. 動作確認
✅ スペースキーを押すと、プレイヤーがジャンプするか?
✅ ジャンプ速度を調整すると、高さが変わるか?
✅ エラーが出ていないか?

これで、プレイヤーがジャンプできるようになりました!
しかし、このままだと無限にジャンプができてしまうので、次は 「連続ジャンプを防止する」 方法を実装していきます!
4. 連続ジャンプを防止する
現状では、プレイヤーは空中でも何度でもジャンプできてしまいます。
これを防ぐために、「地面にいるときだけジャンプできる」ように制御を加えます。
4-1. フラグを使ってジャンプ回数を制限する
地面にいるかどうか を判定するために、bool
型の変数を使います。
① 変数を追加する
Player
スクリプトを開き、以下の変数を追加します。
private bool isGrounded;
この isGrounded
を true
にすると「地面にいる」、false
にすると「空中にいる」と判定します。
4-2. 地面にいるときだけジャンプできるようにする
① OnJump 関数を修正
次に、OnJump
関数を修正し、「isGrounded が true のときだけジャンプできる」ようにします。
public void OnJump(InputAction.CallbackContext context)
{
if (!context.performed || !isGrounded)
{
return;
}
rigid.AddForce(Vector2.up * jumpSpeed, ForceMode2D.Impulse);
isGrounded = false; // ジャンプしたら「空中にいる」状態にする
}
!isGrounded
の条件を追加することで、空中ではジャンプできなくなります。
4-3. 地面との接触を判定する
プレイヤーが地面に触れたら isGrounded
を true
にする処理を追加します。
① OnCollisionEnter2D
を追加
プレイヤーが Floor
タグのオブジェクトに触れたときに、isGrounded
を true
にします。
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Floor"))
{
isGrounded = true;
}
}
これで、プレイヤーが地面 (Floor
タグがついたオブジェクト) に着地したら、再びジャンプできるようになります。
4-4. 地面のオブジェクトにタグを設定する
このスクリプトを正しく動かすために、地面 (Floor
) に タグ
を設定します。
① Floor
にタグを追加する
Hierarchy
で地面のオブジェクトを選択します。(例:Ground
など)Inspector
でTag
をFloor
に設定 します。Tag
がない場合はAdd Tag...
から作成できます。
4-5. 動作確認
✅ スペースキーを押してジャンプできるか?
✅ 空中ではジャンプできないか?
✅ 地面に着いたら再びジャンプできるか?

これで、「地面にいるときだけジャンプできる」ようになりました!
次は 「敵を踏んで倒せるようにする」 仕組みを作っていきます!
5. 敵を踏んで倒せるようにする
アクションゲームでは、敵を踏んで倒す 仕組みがよくありますよね。
今回は、プレイヤーが敵を上から踏んだら倒せる ようにスクリプトを実装していきます。
5-1. 敵との接触を判定する
まず、プレイヤーが敵 (Enemy
タグのついたオブジェクト) に触れたことを判定できるようにします。
① OnCollisionEnter2D
を追加
Player
スクリプトに以下のコードを追加します。
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Floor"))
{
isGrounded = true;
}
if (collision.gameObject.CompareTag("Enemy"))
{
HitEnemy(collision.gameObject);
}
}
- 地面 (
Floor
) に触れたらジャンプ可能にする - 敵 (
Enemy
) に触れたらHitEnemy()
を呼び出す
5-2. 敵を踏んだかどうかを判定する
次に、プレイヤーが 敵を踏んだら倒せるようにする ための処理を追加します。
① HitEnemy
メソッドを作成
Player
スクリプトに以下のコードを追加します。
private void HitEnemy(GameObject enemy)
{
float playerBottom = transform.position.y - (transform.localScale.y / 2.0f);
float enemyTop = enemy.transform.position.y + (enemy.transform.localScale.y / 2.0f);
if (playerBottom >= enemyTop)
{
Destroy(enemy); // 敵を倒す
}
}
この処理のポイント
✅ プレイヤーの底 (playerBottom
) の座標を取得
✅ 敵の上 (enemyTop
) の座標を取得
✅ プレイヤーの底が敵の上より下であれば、敵を倒す (Destroy)
5-3. 敵のオブジェクトにタグを設定する
このスクリプトを正しく動かすために、敵 (Enemy
) にタグを設定 します。
① Enemy
にタグを追加する
Hierarchy
で敵のオブジェクト (Enemy
) を選択します。Inspector
でTag
をEnemy
に設定 します。Tag
がない場合はAdd Tag...
から作成できます。
5-4. プレイヤーが回転しないようにする
敵に触れた際に、プレイヤーが不自然に回転してしまうことがあります。
これを防ぐために、Rigidbody2D の回転を固定 します。
① Freeze Rotation
を設定する
Player
オブジェクトを選択します。Inspector
のRigidbody2D
を開きます。Freeze Rotation (Z)
にチェックを入れる。
5-5. 動作確認
✅ プレイヤーが敵を踏んだときに消えるか?
✅ 横からぶつかると倒せないか?
✅ プレイヤーが回転しないか?

これで、敵を踏むと倒せるアクション が完成しました!
次は、敵に当たるとダメージを受けるようにする 仕組みを作っていきましょう!
6. 敵に当たったらダメージを受ける
アクションゲームでは、敵に当たるとプレイヤーがダメージを受ける 仕組みが重要です。
今回は、プレイヤーが 敵に接触したときにHPが減る処理 を実装していきます。
6-1. プレイヤーのHPを管理する
まず、プレイヤーに HP(体力) を持たせて、ダメージを受ける処理を追加します。
① HPの変数を追加
Player
スクリプトに以下の変数を追加します。
[SerializeField, Header("体力")]
private int hp = 10;
SerializeField
を使うことで、Inspector からHPの値を調整 できるようになります。
例えば、HPを 10 に設定すれば 10回ダメージを受けるとゲームオーバー になります。
6-2. ダメージを受ける処理を追加する
次に、プレイヤーが敵 (Enemy
タグ) に当たったときに HPを減らす メソッドを作成します。
① Damage
メソッドを追加
Player
スクリプトに以下のコードを追加します。
public void Damage(int damage)
{
hp = Mathf.Max(hp - damage, 0);
Debug.Log("残りHP: " + hp);
}
Mathf.Max(hp - damage, 0)
を使うことで、HPが0以下にならないように制御 しています。Debug.Log("残りHP: " + hp);
を追加すると、 Unity の Console に HP の減少が表示される ので、動作確認がしやすくなります。
6-3. 敵にぶつかったときにダメージを受ける
プレイヤーが敵 (Enemy
) に触れたら Damage
メソッドを呼び出す ようにします。
① HitEnemy
メソッドを修正
Player
スクリプトの HitEnemy
メソッドを修正し、敵の上から踏んだか、それ以外で当たったかを判定 します。
private void HitEnemy(GameObject enemy)
{
float playerBottom = transform.position.y - (transform.localScale.y / 2.0f);
float enemyTop = enemy.transform.position.y + (enemy.transform.localScale.y / 2.0f);
if (playerBottom >= enemyTop)
{
Destroy(enemy); // 敵を倒す
}
else
{
enemy.GetComponent<Enemy>().PlayerDamage(this);
}
}
- プレイヤーが敵を踏んだ場合 →
Destroy(enemy);
で敵を消す。 - 横や下からぶつかった場合 →
PlayerDamage(this);
でダメージを受ける。
6-4. 敵がプレイヤーにダメージを与える
敵 (Enemy
) にも 攻撃力の概念 を追加し、プレイヤーにダメージを与えられるようにします。
① Enemy
スクリプトを修正
Enemy
スクリプトを開き、以下のコードを追加します。
[SerializeField, Header("攻撃力")]
private int attack = 5;
public void PlayerDamage(Player player)
{
player.Damage(attack);
}
attack
の値を設定することで、敵の攻撃力を変更できる ようになります。PlayerDamage(Player player)
で プレイヤーのDamage()
メソッドを呼び出し、HPを減少 させます。
6-5. HPの値を設定する
スクリプトが完成したら、Inspector で HPや攻撃力を設定 します。
① プレイヤーのHPを設定
Player
オブジェクトを選択します。Inspector
のPlayer
スクリプト内でHP
の値を 10 に設定します。
② 敵の攻撃力を設定
Enemy
オブジェクトを選択します。Inspector
のEnemy
スクリプト内で攻撃力
の値を 5 に設定します。
6-6. 動作確認
✅ 敵を踏むと倒せるか?
✅ 横や下からぶつかると、HPが減るか?
✅ Console に「残りHP: ○」と表示されるか?
✅ HP が 0 になってもエラーが出ないか?

これで、プレイヤーが敵にぶつかるとダメージを受ける仕組み が完成しました!
次は 「敵を踏んだときに跳ねる」 仕組みを追加して、より楽しいアクションにしていきましょう!
7. 敵を踏んだときに跳ねる
敵を踏んで倒したとき、プレイヤーが少しジャンプする ようにすると、より気持ちの良いアクションになります。
「スーパーマリオ」のような、敵を踏んだら跳ねる仕組みを作っていきましょう!
7-1. 敵を踏んだときに跳ねる処理を追加する
まずは、敵を踏んだときに上方向へジャンプする処理 を追加します。
① HitEnemy
メソッドを修正
Player
スクリプトの HitEnemy
メソッドを修正し、敵を踏んだときに跳ねる処理を追加 します。
private void HitEnemy(GameObject enemy)
{
float playerBottom = transform.position.y - (transform.localScale.y / 2.0f);
float enemyTop = enemy.transform.position.y + (enemy.transform.localScale.y / 2.0f);
if (playerBottom >= enemyTop)
{
Destroy(enemy); // 敵を倒す
rigid.AddForce(Vector2.up * jumpSpeed, ForceMode2D.Impulse); // 跳ねる
}
else
{
enemy.GetComponent<Enemy>().PlayerDamage(this);
}
}
追加した処理のポイント
✅ プレイヤーの位置が敵の上かどうかを判定
✅ 敵を踏んだ場合 (Destroy(enemy)
) にプレイヤーを跳ねさせる
✅ 跳ねる処理 (rigid.AddForce(Vector2.up * jumpSpeed, ForceMode2D.Impulse);
) を追加
7-2. 跳ねる力を調整する
敵を踏んだときの 跳ねる高さ を調整できるように、bounceForce
という変数を作成 します。
① bounceForce
変数を追加
Player
スクリプトの Start
メソッドの上に以下を追加します。
[SerializeField, Header("踏んだ時の跳ねる力")]
private float bounceForce = 7f;
② HitEnemy
メソッドを修正
rigid.AddForce()
の jumpSpeed
を bounceForce
に変更します。
private void HitEnemy(GameObject enemy)
{
float playerBottom = transform.position.y - (transform.localScale.y / 2.0f);
float enemyTop = enemy.transform.position.y + (enemy.transform.localScale.y / 2.0f);
if (playerBottom >= enemyTop)
{
Destroy(enemy); // 敵を倒す
rigid.AddForce(Vector2.up * bounceForce, ForceMode2D.Impulse); // 跳ねる
}
else
{
enemy.GetComponent<Enemy>().PlayerDamage(this);
}
}
7-3. Inspector で bounceForce の値を調整する
スクリプトが完成したら、Inspector で bounceForce
の値を変更 できるようになります。
① bounceForce
を設定
Player
オブジェクトを選択します。Inspector
でPlayer
スクリプトの踏んだ時の跳ねる力 (bounceForce)
の値を調整します。- 7~10 くらいの値がおすすめ!
7-4. 動作確認
✅ 敵を踏むと倒せるか?
✅ 踏んだときにプレイヤーが跳ねるか?
✅ bounceForce
の値を変更すると、跳ねる高さが変わるか?
✅ 横から当たったときは跳ねないか?

これで、「敵を踏んだときに跳ねるアクション」 が完成しました!
次は、「ゲームオーバーの処理」 や 「スコアシステム」 などを追加して、ゲームをさらに楽しくしていきましょう!
8. まとめ
この記事では、Unityで2Dアクションゲームのプレイヤーの基本アクション を実装しました!
プレイヤーの移動・ジャンプ・敵との接触処理を加えることで、よりアクションゲームらしくなりましたね。
今回実装した内容の振り返り
✅ プレイヤーの移動を実装(Input System
を使ってWASDキーで動けるようにした)
✅ プレイヤーのジャンプを実装(スペースキーでジャンプ可能)
✅ 連続ジャンプを防止(地面にいるときだけジャンプできるようにした)
✅ 敵を踏んで倒せるようにした(プレイヤーが敵より上にいる場合のみ倒せる)
✅ 敵に当たるとダメージを受けるようにした(HPを減少させ、ゲームの緊張感をUP)
✅ 敵を踏んだときに跳ねるようにした(スーパーマリオのようなアクションを実装)
これらの仕組みを組み合わせることで、よりスムーズで楽しいアクションゲームが作れるようになります。
次回の記事について
次の記事では、HPのUIやゲームオーバー処理 を追加して、ゲームとしての完成度を上げていきます!
例えば、次のような機能を実装していきます。
🎯 スコアを追加して、敵を倒すたびに加算する
🎯 HPが0になったらゲームオーバー画面を表示する
🎯 プレイヤーが画面外に落ちたらやり直しになる処理を追加する
引き続き、2Dアクションゲームを一緒に作っていきましょう!
これで、プレイヤーの基本的なアクションの実装は完了 です!
次回もお楽しみに! 🎮✨
おすすめのUnityアセット2Dアクションゲーム開発をもっと簡単に!
この記事で、2Dアクションゲームの基本的なプレイヤーの動きを実装 しましたが、実際にゲームを作っていくと、こんな悩みが出てきませんか?
❌ 「もっとスムーズなプレイヤーの動きを作りたい…」
❌ 「当たり判定やアニメーションの設定が面倒…」
❌ 「敵のAIや攻撃の仕組みを作るのが大変…」
そんなときにオススメなのが、「Corgi Engine – 2D + 2.5D Platformer」 です! 🎮✨
👉 Corgi Engine – 2D + 2.5D Platformer
Corgi Engine とは?
Corgi Engine は、Unityで本格的な 2Dアクションゲーム(プラットフォーマー) を素早く作れるアセットです。
すでに 動きの滑らかなキャラクターコントローラー や 敵のAI、武器、エフェクト などが組み込まれているので、コードをゼロから書かなくても プロ並みの2Dゲーム を作れます!
Corgi Engine を使うメリット
✅ 圧倒的にスムーズなプレイヤー操作
Corgi Engine には 緻密に調整されたプレイヤーコントローラー が含まれています。
移動・ジャンプ・ダッシュ・壁ジャンプ・はしご移動など、すぐに使えるアクション が豊富!
「キャラクターの動きがぎこちない…」という悩みが一気に解決します。
✅ 敵のAIや武器システムも簡単に実装
「敵の行動パターンを作るのが大変…」という方も安心!
Corgi Engineには、すでに敵AIや攻撃パターンが組み込まれているので、エディター上で調整するだけ で敵の動きを作れます。
銃や近接武器も設定可能なので、シューティング要素を追加するのも簡単です。
✅ 2Dだけでなく2.5Dゲームも作れる!
通常の2Dアクションだけでなく、2.5D(奥行きのあるアクション) にも対応。
「メトロイドヴァニア」や「探索型のプラットフォーマー」も手軽に開発できます!
✅ 豊富なデモシーンで学びながら開発できる
アセットには完成度の高いデモシーンが多数含まれており、「どう作ればいいの?」と迷ったときに参考になります。
デモをカスタマイズすれば、短時間でオリジナルのゲームを作ることも可能です!
こんな人におすすめ!
✔ ゼロから2Dアクションゲームを作るのは大変だと感じる人
✔ プロレベルのスムーズなキャラクター操作を実装したい人
✔ プレイヤー操作、敵AI、武器システムを素早く導入したい人
✔ コードを少なくして、エディター中心で開発したい人
今すぐ Corgi Engine を試してみよう!
Unityで2Dアクションゲームを作るなら、Corgi Engine を導入することで 開発スピードが大幅にアップ します!
アセットストアで詳細をチェックして、最高のアクションゲームを作りましょう!
👉 Corgi Engine – 2D + 2.5D Platformer をチェック 🎮✨
よくある質問(FAQ)
- QPlayerが動かないのですが、原因は何ですか?
- A
Input System
の設定やBehavior
の変更が正しく適用されているか確認してください。また、スクリプトがPlayer
オブジェクトにアタッチされているかもチェックしましょう。
- Qジャンプが無限にできてしまうのですが?
- A
OnCollisionEnter2D
でbJump
の状態を適切に更新しているか確認してください。また、地面のオブジェクトにFloor
タグを設定しているかもチェックしましょう。
- Q敵を踏んでも消えません。どうすればいいですか?
- A
HitEnemy
メソッドの条件分岐が正しいか確認してください。if (transform.position.y - (halfScaleY - 0.1f) >= enemy.transform.position.y + (enemyHalfScaleY - 0.1f))
の計算を見直すと改善するかもしれません。