1. はじめに
みなさん、こんにちは!今回は Unityで2D無限ランアクションゲーム を作る方法を紹介します。
「無限ランゲーム」とは、プレイヤーが自動で走り続け、障害物を避けながら進んでいくシンプルながらも楽しいゲームです。
「Temple Run」や「Flappy Bird」のように、反射神経を試すゲームジャンルとして人気があります。
この記事では、Unityの2D Tilemap機能やアニメーションを使いながら、基本的な無限ランゲームの仕組みを作っていきます!
スクリプトもシンプルにするので、初心者でも安心して作れますよ。
使用するアセット
今回のプロジェクトでは、Unity Asset Store にある 「Sunny Land」 を使います。
このアセットには可愛いドット絵のキャラクターや背景、アニメーションが含まれているので、初心者でもすぐにゲームが作れます!
ゲームの基本仕様
今回作る無限ランゲームの基本仕様は以下の通りです:
- プレイヤーは自動で前に進む
- スペースキーを押すとジャンプできる
- 地面に接触しているときだけジャンプ可能
- 障害物に当たるとゲームオーバー
- シンプルなアニメーション(走る・ジャンプ・落下)を実装
このように、基本的な仕組みを押さえながらゲームを作っていきます。
さっそく、地面の配置から始めていきましょう! 🚀
Unityを使えば2D無限ランアクションゲームを簡単に作ることができます。
この記事では一から作る方法を解説しますが、「もっと手軽に無限ランゲームを作りたい!」という方には、2D+3D Infinite Runner Engine という便利なアセットもあります!
2. 床(地面)の配置
無限ランアクションゲームでは、プレイヤーが走るための床(地面)を作成する必要があります。Unityでは Tilemap を使うことで、広範囲の地面を簡単に配置できます。ここでは、Tilemapを使って地面を設置し、プレイヤーが正しく動作するための設定を行います。
1. Tilemapを使って床を作成する
まず、Unityの Tilemap 機能を使って、床となるオブジェクトを作成します。
① Tilemapを作成する
- ヒエラルキー(Hierarchy)ウィンドウ で 右クリック し、
2D Object
→Tilemap
→Rectangular
を選択。 - ヒエラルキーウィンドウ に
Grid
オブジェクトが作成され、その子オブジェクトとしてTilemap
が追加される。 Tilemap
の名前をFloor
に変更。
② Tilemapにタイルを配置する
- Tile Palette ウィンドウ を開く。(
Window
→2D
→Tile Palette
) Create New Palette
をクリックし、新しいタイルパレットを作成。- アセットストアからダウンロードした「Sunny Land」アセット のタイルをTile Paletteにドラッグ&ドロップ。
- Tilemapエディタ(Brush Tool) を使って、シーン上にタイルを敷き詰める。

2. タグとレイヤーの設定
プレイヤーが床と接触する処理を行うために、Floor
に専用の タグ と レイヤー を設定します。

① タグの作成
Floor
を選択し、インスペクター(Inspector)ウィンドウ でTag
をクリック。Add Tag...
を選択し、+
ボタンをクリック。- 新しいタグ
Floor
を追加し、Floor
オブジェクトに適用。
② レイヤーの作成
Layer
をクリックし、Add Layer...
を選択。User Layer
にFloor
を追加し、Floor
オブジェクトに適用。
3. 床に当たり判定を付ける
プレイヤーが床の上を走れるようにするため、Floor
にコライダーを設定します。
① Tilemap Collider 2D の追加
Floor
を選択。- インスペクター の
Add Component
をクリック。 Tilemap Collider 2D
を追加。
② Composite Collider 2D の追加
タイルの継ぎ目がバラバラにならないように、Composite Collider 2D
を追加します。
Floor
にComposite Collider 2D
を追加。Tilemap Collider 2D
の Used by Composite にチェックを入れる。
③ Rigidbody 2D の設定
Composite Collider 2D
を使用すると、自動で Rigidbody 2D が追加されます。物理的な影響を受けないように、以下の設定を変更します。
- Gravity Scale を
0
に変更。 - Body Type を
Kinematic
に設定。
4. ここまでのまとめ
✅ Tilemap
を使って床を作成した
✅ Tile Palette
でタイルを配置した
✅ Floor
の タグ と レイヤー を設定した
✅ Tilemap Collider 2D
と Composite Collider 2D
で当たり判定を追加した
✅ Rigidbody 2D
の設定を変更し、重力の影響を無効化した
より多彩な地形を作りたい場合は、2D Retro Pixel Art Platformer Pack に含まれるTilemap素材を活用すると、よりレトロな雰囲気のランゲームを作れます!
👉 アセットをチェック

これでプレイヤーが正しく床の上を走れる状態になりました!次は、プレイヤーキャラを配置して、動く仕組みを作っていきましょう! 🚀
3. プレイヤーキャラの配置
無限ランアクションゲームの主役となる プレイヤーキャラクター を配置し、適切な設定を行います。
ここでは Sunny Land のキャラクターを使い、アニメーションの適用や当たり判定の設定を進めていきます。
1. プレイヤーのスプライトを配置する
まず、Sunny Landアセット に含まれているキャラクターを シーン に追加します。
① キャラクター画像を配置
- プロジェクトウィンドウ で
Sunny Land
のRun
フォルダを開く。 player-run-1.png
を ヒエラルキーウィンドウ(Hierarchy) にドラッグ&ドロップ。player-run-1
を Player にリネーム。

② キャラクターの位置を調整
- シーンビュー(Scene) で
Player
を選択し、床の上 に配置。 - インスペクター(Inspector) の
Transform
でPosition
を(0, 0, 0)
に設定。
2. タグとレイヤーの設定
プレイヤーを他のオブジェクトと区別しやすくするために、タグ と レイヤー を設定します。

① タグを作成
Player
を選択し、インスペクター(Inspector) でTag
をクリック。Add Tag...
を選択し、+
ボタンをクリック。- 新しいタグ
Player
を作成し、Player
に適用。
② レイヤーを作成
Layer
をクリックし、Add Layer...
を選択。User Layer
にPlayer
を追加し、Player
に適用。
3. プレイヤーのアニメーションを設定
Sunny Landにはすでに 走るアニメーション が用意されているので、すぐに適用できます。

① Animatorコンポーネントを追加
Player
を選択し、インスペクター のAdd Component
でAnimator
を追加。- プロジェクトウィンドウ の
Animator
フォルダを開く。 player-run-1.controller
をPlayer
のAnimator
に ドラッグ&ドロップ。
4. プレイヤーの当たり判定を設定
ゲーム中に地面や障害物と正しく衝突するように Collider を設定します。
① Circle Collider 2D を追加
Player
を選択し、Add Component
からCircle Collider 2D
を追加。- 半径(Radius) をキャラのサイズに合わせて調整。
- Is Trigger にチェックを入れる(※後で変更の可能性あり)。
5. ここまでのまとめ
✅ Sunny Land
のキャラクターを配置した
✅ Player
の タグ と レイヤー を設定した
✅ Animator
を追加して、走るアニメーション を適用した
✅ Circle Collider 2D で 当たり判定 を追加した

これでプレイヤーキャラの基本設定が完了しました!次は プレイヤーのアニメーション(ジャンプ・落下) を設定していきます! 🚀
4. プレイヤーのアニメーション
プレイヤーキャラクターのアニメーションを設定して、ジャンプや落下の動きを自然に見せるようにします。ここでは、Animatorの設定を行い、ジャンプや落下のアニメーションが適切に切り替わるようにします。
① ジャンプと落下のアニメーションを作成する
まず、Sunny Landのアセットに含まれている「Jump」フォルダの画像を使って、新しいアニメーションを作成します。
- プロジェクトウィンドウで「jump」フォルダを開く
- 1枚の画像を選択し、ヒエラルキーの「Player」にドラッグ&ドロップ
- アニメーションウィンドウを開く(Window → Animation → Animation)
- 新しいアニメーションクリップを作成
- Animationウィンドウの左上にある「Create」ボタンを押す
Jump.anim
という名前を付けて保存
- アニメーションを作成
- 追加したジャンプ用の画像をアニメーションのフレームに設定
- 保存して完了
同じ手順で「Fall.anim」(落下アニメーション)も作成しておきましょう。
② Animatorの設定
次に、Animatorウィンドウでジャンプや落下のアニメーションが適切に切り替わるように設定します。
- Animatorウィンドウを開く(Window → Animation → Animator)
- Animatorにアニメーションを追加
- 既に設定されている「Run」アニメーションの横に、作成した「Jump」と「Fall」のアニメーションをドラッグ&ドロップで配置
- パラメータの追加
- Animatorウィンドウ内で「Parameters」タブを開く
- 「+」ボタンを押して以下のパラメータを追加
Jump
(Float)Run
(Bool)
③ アニメーションの遷移を設定
ジャンプや落下のアニメーションがスムーズに切り替わるように、遷移(トランジション)を設定します。

- 「Run」から「Jump」へ遷移を作成
- 「Run」アニメーションを右クリック → 「Make Transition」
- 矢印を「Jump」アニメーションへつなげる
- 作成した矢印をクリックしてInspectorを開く
Has Exit Time
のチェックを外すTransition Duration
を0
にするConditions
をJump > 0.8
に設定(プレイヤーのY速度が0.8より大きいとき)
- 「Run」から「Fall」へ遷移を作成
- 「Run」アニメーションを右クリック → 「Make Transition」
- 矢印を「Fall」アニメーションへつなげる
- 作成した矢印をクリックしてInspectorを開く
Has Exit Time
のチェックを外すTransition Duration
を0
にするConditions
をJump < 0.8
に設定(プレイヤーのY速度が0.8より小さいとき)

この設定によって、プレイヤーがジャンプすると自動的に「Jump」アニメーションに切り替わり、落下し始めると「Fall」アニメーションに遷移するようになります。
次のステップでは、これらのアニメーションをスクリプトで制御していきます!
5. プレイヤーの移動スクリプト
無限ランアクションゲームでは、プレイヤーキャラクターが自動で前に進むようにする必要があります。さらに、スペースキーを押したときにジャンプし、地面に着地したら再びジャンプできるようにします。これらの動きをスクリプトで実装していきます。
PlayerMoveスクリプトの作成
まず、プレイヤーの移動を制御するC#スクリプトを作成します。
スクリプト作成手順
- プロジェクトウィンドウを右クリック
- **「Create」→「C# Script」**を選択
- スクリプトの名前を 「PlayerMove」 に変更
作成した PlayerMove
スクリプトを プレイヤーオブジェクト にアタッチしておきましょう。
スクリプトの実装
スクリプトを開き、以下のコードを入力してください。
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
// 移動速度とジャンプ力
[SerializeField] private float moveSpeed = 5f;
[SerializeField] private float jumpForce = 5f;
// Rigidbody2Dコンポーネント
private Rigidbody2D rb;
// 地面にいるか判定
private bool isJumping;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
private void Update()
{
Jump();
}
private void FixedUpdate()
{
MovePlayer();
}
// プレイヤーを自動的に前進させる
private void MovePlayer()
{
rb.velocity = new Vector2(moveSpeed, rb.velocity.y);
}
// ジャンプ処理
private void Jump()
{
if (Input.GetKeyDown(KeyCode.Space) && !isJumping)
{
isJumping = true;
rb.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);
}
}
// 地面との接触を検出する
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Floor"))
{
isJumping = false;
}
}
}
コードの解説
MovePlayer()
FixedUpdate()
内で呼び出され、常に前進するようにrb.velocity
を設定しています。Vector2(moveSpeed, rb.velocity.y)
にすることで、Y方向の速度を維持しながら、X方向に移動できます。
Jump()
Update()
内でJump()
を呼び出して、スペースキーが押されたらジャンプするようにしています。isJumping
変数を使って 地面にいるときだけ ジャンプできるように制御します。
OnCollisionEnter2D()
- プレイヤーが
Floor
というタグがついたオブジェクトに接触したら、isJumping
をfalse
にして、再びジャンプできるようにします。
- プレイヤーが
スクリプトを適用する
PlayerMove
スクリプトを プレイヤーオブジェクトにドラッグ&ドロップ してアタッチします。moveSpeed
とjumpForce
の値を調整して、適切な速度で移動・ジャンプできるようにしましょう。moveSpeed = 5
くらいがちょうどよいです。jumpForce = 5
くらいで、適度なジャンプができます。
動作確認
- プレイヤーが 自動で前進 しているか
- スペースキーを押したらジャンプ するか
- 地面に接触すると再びジャンプ可能 になるか
もし動作が意図した通りでない場合、スクリプトの isJumping
の判定や CompareTag("Floor")
が正しく設定されているか確認してみてください。

これでプレイヤーの基本的な動作(前進&ジャンプ)が完成しました!次は、ジャンプアニメーションの設定を行い、よりゲームらしく仕上げていきます。
6. ジャンプアニメーションのスクリプト
プレイヤーがジャンプしたとき、適切なアニメーションを再生するようにスクリプトを作成します。今回はPlayerAnimationスクリプトを作成し、Animatorと連携してアニメーションを制御します。その後、PlayerMoveスクリプトにアニメーションの処理を追加します。
① PlayerAnimationスクリプトの作成
まず、アニメーションを制御するためのスクリプトを作成します。
スクリプトの作成
プロジェクトウィンドウを右クリック → 「Create」 → 「C# Script」 を選択し、スクリプトの名前を PlayerAnimation
にします。
作成したスクリプトをプレイヤーのオブジェクトにアタッチしてください。
スクリプトの記述
作成した PlayerAnimation.cs
を開き、以下のコードを入力してください。
using UnityEngine;
public class PlayerAnimation : MonoBehaviour
{
private Animator animator;
private void Awake()
{
animator = GetComponent<Animator>();
}
// ジャンプ時のアニメーション処理
public void PlayJump(float velY)
{
animator.SetFloat("Jump", velY);
}
// 走るアニメーションの処理
public void Running(bool running)
{
animator.SetBool("Run", running);
}
}
コードの説明
Awake()
メソッドでAnimatorコンポーネントを取得します。PlayJump(float velY)
メソッドでは、Jump
というパラメーターにプレイヤーのY軸の速度を設定します。
→ Y軸の速度が大きいと「ジャンプ」状態、小さいと「落下」状態になります。Running(bool running)
メソッドでは、Run
というパラメーターをtrue
またはfalse
に設定し、走るアニメーションを制御します。
② PlayerMoveスクリプトにアニメーション処理を追加
次に、プレイヤーの移動処理を行う PlayerMove
スクリプトにアニメーション処理を追加します。
PlayerMoveスクリプトの修正
すでに作成した PlayerMove.cs
を開き、以下のコードを追加してください。
private PlayerAnimation playerAnimation;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
playerAnimation = GetComponent<PlayerAnimation>(); // 追加
}
private void FixedUpdate()
{
MovePlayer();
AnimatePlayer(); // 追加
}
// アニメーションを制御するメソッドを追加
private void AnimatePlayer()
{
playerAnimation.PlayJump(rb.velocity.y);
playerAnimation.Running(!isJumping);
}
コードの説明
PlayerAnimation
型の変数playerAnimation
を追加。Awake()
メソッドでGetComponent<PlayerAnimation>()
を使い、PlayerAnimationスクリプトを取得。FixedUpdate()
内でAnimatePlayer()
を呼び出し、プレイヤーの移動ごとにアニメーションを更新。AnimatePlayer()
メソッドで、- ジャンプアニメーションの制御 (
PlayJump()
) - 走るアニメーションの制御 (
Running()
)
- ジャンプアニメーションの制御 (
まとめ
これで、プレイヤーがジャンプした際に適切なアニメーションが再生されるようになりました。
PlayerAnimation
スクリプト →Animator
を制御PlayerMove
スクリプト → アニメーションの更新処理を追加- Animatorでの設定 →
Jump
&Run
のパラメーターでアニメーションを制御

次のステップでは、障害物の生成を実装し、プレイヤーと障害物の当たり判定を設定していきましょう!
7. 障害物の生成
無限ランゲームでは、プレイヤーが障害物を避けながら進むのが醍醐味です。ここでは、障害物を定期的に生成し、当たり判定を設定する方法を解説します。
① 障害物のプレハブ化
まず、障害物となるオブジェクトを作成し、それをプレハブ化します。
1. オブジェクトの配置
- ヒエラルキー(Hierarchy)ウィンドウで 「右クリック」 → 「2D Object」 → 「Sprite」 を選択し、新しいオブジェクトを作成します。
- インスペクター(Inspector)ウィンドウで「名前をObstacle」に変更 します。
- Sprite Renderer の「Sprite」に障害物用の画像を設定します(アセットに含まれるオブジェクトを使用可能)。
- TransformのScale(大きさ)を調整 し、適切なサイズに変更します。
2. 当たり判定(Collider)の設定
- 「Add Component」ボタンをクリック して Box Collider 2D を追加します。
- 「Is Trigger」にチェックを入れます(プレイヤーが接触したときにイベントを発生させるため)。
- 「Rigidbody 2D」を追加し、以下の設定を行います。
- Body Type:Kinematic
- Gravity Scale:0(重力を受けないようにする)
- Collision Detection:Continuous(衝突判定を精密にする)
3. プレハブ化
- ヒエラルキーのObstacleオブジェクトをプロジェクト(Project)ウィンドウにドラッグ&ドロップ してプレハブ化します。
- プレハブ化したら、ヒエラルキー上のObstacleオブジェクトを削除 します。
② 一定間隔で障害物を生成するスクリプト
次に、障害物をランダムな間隔で自動生成するスクリプトを作成します。
1. スクリプトの作成
- プロジェクトウィンドウを右クリック して「Create」→「C# Script」を選択。
- スクリプト名を ObstacleSpawner に変更。
- 作成したスクリプトを 空のGameObject(名前:Spawner)にアタッチ します。
2. スクリプトの編集
ObstacleSpawnerスクリプトを開いて、以下のコードを入力します。
using UnityEngine;
public class ObstacleSpawner : MonoBehaviour
{
public GameObject obstaclePrefab; // 障害物のプレハブ
public Transform spawnPoint; // 生成位置
public float spawnInterval = 2f; // 生成間隔
public float minY = -2f, maxY = 2f; // 障害物の高さ範囲
private void Start()
{
// 一定間隔で障害物を生成する
InvokeRepeating(nameof(SpawnObstacle), 1f, spawnInterval);
}
void SpawnObstacle()
{
// ランダムなY座標で障害物を生成
Vector3 spawnPosition = new Vector3(spawnPoint.position.x, Random.Range(minY, maxY), 0f);
Instantiate(obstaclePrefab, spawnPosition, Quaternion.identity);
}
}
3. スクリプトの設定
- ヒエラルキーで「右クリック」→「Create Empty」 して「Spawner」オブジェクトを作成。
- 「ObstacleSpawner」スクリプトを「Spawner」にアタッチ。
- Inspectorウィンドウで「Obstacle Prefab」に作成した障害物プレハブを設定。
- 「Spawn Point」の位置をカメラの右側(X座標を適度に調整)に設定。
③ 当たり判定の設定(Game Over処理)
プレイヤーが障害物に当たったらゲームオーバーになるようにします。
1. プレイヤー側のスクリプト修正
- PlayerMoveスクリプトを開く。
- 以下のコードを追加 して、障害物に衝突したときに処理を行う。
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Obstacle"))
{
Debug.Log("Game Over");
Time.timeScale = 0; // ゲームを停止
}
}
2. 障害物のタグ設定
- プロジェクトの「Tags & Layers」から新しいタグ「Obstacle」を作成。
- Obstacleプレハブに設定(Inspectorの「Tag」から「Obstacle」を選択)。
まとめ
- 障害物を作成し、プレハブ化。
- 一定間隔で障害物を生成するスクリプトを作成。
- プレイヤーが障害物に当たるとゲームオーバーになるように設定。

この仕組みを応用すれば、ゲームの難易度を調整したり、異なる種類の障害物を追加したりできます。