2DアクションUnityゲームの作り方メモ

【Unity】2D無限ランアクションゲームの作り方

2Dアクション

1. はじめに

みなさん、こんにちは!今回は Unityで2D無限ランアクションゲーム を作る方法を紹介します。
「無限ランゲーム」とは、プレイヤーが自動で走り続け、障害物を避けながら進んでいくシンプルながらも楽しいゲームです。
「Temple Run」や「Flappy Bird」のように、反射神経を試すゲームジャンルとして人気があります。

この記事では、Unityの2D Tilemap機能やアニメーションを使いながら、基本的な無限ランゲームの仕組みを作っていきます!
スクリプトもシンプルにするので、初心者でも安心して作れますよ。

使用するアセット

今回のプロジェクトでは、Unity Asset Store にある 「Sunny Land」 を使います。
このアセットには可愛いドット絵のキャラクターや背景、アニメーションが含まれているので、初心者でもすぐにゲームが作れます!

🛒 Sunny Landのダウンロードはこちら

ゲームの基本仕様

今回作る無限ランゲームの基本仕様は以下の通りです:

  • プレイヤーは自動で前に進む
  • スペースキーを押すとジャンプできる
  • 地面に接触しているときだけジャンプ可能
  • 障害物に当たるとゲームオーバー
  • シンプルなアニメーション(走る・ジャンプ・落下)を実装

このように、基本的な仕組みを押さえながらゲームを作っていきます。
さっそく、地面の配置から始めていきましょう! 🚀

Unityを使えば2D無限ランアクションゲームを簡単に作ることができます。
この記事では一から作る方法を解説しますが、「もっと手軽に無限ランゲームを作りたい!」という方には、2D+3D Infinite Runner Engine という便利なアセットもあります!




2. 床(地面)の配置

無限ランアクションゲームでは、プレイヤーが走るための床(地面)を作成する必要があります。Unityでは Tilemap を使うことで、広範囲の地面を簡単に配置できます。ここでは、Tilemapを使って地面を設置し、プレイヤーが正しく動作するための設定を行います。


1. Tilemapを使って床を作成する

まず、Unityの Tilemap 機能を使って、床となるオブジェクトを作成します。

① Tilemapを作成する

  1. ヒエラルキー(Hierarchy)ウィンドウ右クリック し、
    2D ObjectTilemapRectangular を選択。
  2. ヒエラルキーウィンドウGrid オブジェクトが作成され、その子オブジェクトとして Tilemap が追加される。
  3. Tilemap の名前を Floor に変更。

② Tilemapにタイルを配置する

  1. Tile Palette ウィンドウ を開く。(Window2DTile Palette
  2. Create New Palette をクリックし、新しいタイルパレットを作成。
  3. アセットストアからダウンロードした「Sunny Land」アセット のタイルをTile Paletteにドラッグ&ドロップ。
  4. Tilemapエディタ(Brush Tool) を使って、シーン上にタイルを敷き詰める。

2. タグとレイヤーの設定

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

① タグの作成

  1. Floor を選択し、インスペクター(Inspector)ウィンドウTag をクリック。
  2. Add Tag... を選択し、+ ボタンをクリック。
  3. 新しいタグ Floor を追加し、Floor オブジェクトに適用。

② レイヤーの作成

  1. Layer をクリックし、Add Layer... を選択。
  2. User LayerFloor を追加し、Floor オブジェクトに適用。



3. 床に当たり判定を付ける

プレイヤーが床の上を走れるようにするため、Floor にコライダーを設定します。

① Tilemap Collider 2D の追加

  1. Floor を選択。
  2. インスペクターAdd Component をクリック。
  3. Tilemap Collider 2D を追加。

② Composite Collider 2D の追加

タイルの継ぎ目がバラバラにならないように、Composite Collider 2D を追加します。

  1. FloorComposite Collider 2D を追加。
  2. Tilemap Collider 2DUsed by Composite にチェックを入れる。

③ Rigidbody 2D の設定

Composite Collider 2D を使用すると、自動で Rigidbody 2D が追加されます。物理的な影響を受けないように、以下の設定を変更します。

  1. Gravity Scale0 に変更。
  2. Body TypeKinematic に設定。

4. ここまでのまとめ

Tilemap を使って床を作成した
Tile Palette でタイルを配置した
Floorタグレイヤー を設定した
Tilemap Collider 2DComposite Collider 2D で当たり判定を追加した
Rigidbody 2D の設定を変更し、重力の影響を無効化した

より多彩な地形を作りたい場合は、2D Retro Pixel Art Platformer Pack に含まれるTilemap素材を活用すると、よりレトロな雰囲気のランゲームを作れます!
👉 アセットをチェック

これでプレイヤーが正しく床の上を走れる状態になりました!次は、プレイヤーキャラを配置して、動く仕組みを作っていきましょう! 🚀




3. プレイヤーキャラの配置

無限ランアクションゲームの主役となる プレイヤーキャラクター を配置し、適切な設定を行います。
ここでは Sunny Land のキャラクターを使い、アニメーションの適用や当たり判定の設定を進めていきます。


1. プレイヤーのスプライトを配置する

まず、Sunny Landアセット に含まれているキャラクターを シーン に追加します。

① キャラクター画像を配置

  1. プロジェクトウィンドウSunny LandRun フォルダを開く。
  2. player-run-1.pngヒエラルキーウィンドウ(Hierarchy) にドラッグ&ドロップ。
  3. player-run-1Player にリネーム。

② キャラクターの位置を調整

  1. シーンビュー(Scene)Player を選択し、床の上 に配置。
  2. インスペクター(Inspector)TransformPosition(0, 0, 0) に設定。

2. タグとレイヤーの設定

プレイヤーを他のオブジェクトと区別しやすくするために、タグレイヤー を設定します。

① タグを作成

  1. Player を選択し、インスペクター(Inspector)Tag をクリック。
  2. Add Tag... を選択し、+ ボタンをクリック。
  3. 新しいタグ Player を作成し、Player に適用。

② レイヤーを作成

  1. Layer をクリックし、Add Layer... を選択。
  2. User LayerPlayer を追加し、Player に適用。



3. プレイヤーのアニメーションを設定

Sunny Landにはすでに 走るアニメーション が用意されているので、すぐに適用できます。

① Animatorコンポーネントを追加

  1. Player を選択し、インスペクターAdd ComponentAnimator を追加。
  2. プロジェクトウィンドウAnimator フォルダを開く。
  3. player-run-1.controllerPlayerAnimatorドラッグ&ドロップ

4. プレイヤーの当たり判定を設定

ゲーム中に地面や障害物と正しく衝突するように Collider を設定します。

① Circle Collider 2D を追加

  1. Player を選択し、Add Component から Circle Collider 2D を追加。
  2. 半径(Radius) をキャラのサイズに合わせて調整。
  3. Is Trigger にチェックを入れる(※後で変更の可能性あり)。

5. ここまでのまとめ

Sunny Land のキャラクターを配置した
Playerタグレイヤー を設定した
Animator を追加して、走るアニメーション を適用した
Circle Collider 2D当たり判定 を追加した

これでプレイヤーキャラの基本設定が完了しました!次は プレイヤーのアニメーション(ジャンプ・落下) を設定していきます! 🚀




4. プレイヤーのアニメーション

プレイヤーキャラクターのアニメーションを設定して、ジャンプや落下の動きを自然に見せるようにします。ここでは、Animatorの設定を行い、ジャンプや落下のアニメーションが適切に切り替わるようにします。


① ジャンプと落下のアニメーションを作成する

まず、Sunny Landのアセットに含まれている「Jump」フォルダの画像を使って、新しいアニメーションを作成します。

  1. プロジェクトウィンドウで「jump」フォルダを開く
  2. 1枚の画像を選択し、ヒエラルキーの「Player」にドラッグ&ドロップ
  3. アニメーションウィンドウを開く(Window → Animation → Animation)
  4. 新しいアニメーションクリップを作成
    • Animationウィンドウの左上にある「Create」ボタンを押す
    • Jump.anim という名前を付けて保存
  5. アニメーションを作成
    • 追加したジャンプ用の画像をアニメーションのフレームに設定
    • 保存して完了

同じ手順で「Fall.anim」(落下アニメーション)も作成しておきましょう。


② Animatorの設定

次に、Animatorウィンドウでジャンプや落下のアニメーションが適切に切り替わるように設定します。

  1. Animatorウィンドウを開く(Window → Animation → Animator)
  2. Animatorにアニメーションを追加
    • 既に設定されている「Run」アニメーションの横に、作成した「Jump」と「Fall」のアニメーションをドラッグ&ドロップで配置
  3. パラメータの追加
    • Animatorウィンドウ内で「Parameters」タブを開く
    • 「+」ボタンを押して以下のパラメータを追加
      • Jump(Float)
      • Run(Bool)



③ アニメーションの遷移を設定

ジャンプや落下のアニメーションがスムーズに切り替わるように、遷移(トランジション)を設定します。

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

この設定によって、プレイヤーがジャンプすると自動的に「Jump」アニメーションに切り替わり、落下し始めると「Fall」アニメーションに遷移するようになります。

次のステップでは、これらのアニメーションをスクリプトで制御していきます!




5. プレイヤーの移動スクリプト

無限ランアクションゲームでは、プレイヤーキャラクターが自動で前に進むようにする必要があります。さらに、スペースキーを押したときにジャンプし、地面に着地したら再びジャンプできるようにします。これらの動きをスクリプトで実装していきます。


PlayerMoveスクリプトの作成

まず、プレイヤーの移動を制御するC#スクリプトを作成します。

スクリプト作成手順

  1. プロジェクトウィンドウを右クリック
  2. **「Create」→「C# Script」**を選択
  3. スクリプトの名前を 「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 というタグがついたオブジェクトに接触したら、isJumpingfalseして、再びジャンプできるようにします。

スクリプトを適用する

  1. PlayerMove スクリプトを プレイヤーオブジェクトにドラッグ&ドロップ してアタッチします。
  2. moveSpeedjumpForce の値を調整して、適切な速度で移動・ジャンプできるようにしましょう。
    • 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);
    }
}

コードの説明

  1. Awake() メソッドでAnimatorコンポーネントを取得します。
  2. PlayJump(float velY) メソッドでは、Jump というパラメーターにプレイヤーのY軸の速度を設定します。
    Y軸の速度が大きいと「ジャンプ」状態、小さいと「落下」状態になります。
  3. 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);
}

コードの説明

  1. PlayerAnimation 型の変数 playerAnimation を追加。
  2. Awake() メソッドで GetComponent<PlayerAnimation>() を使い、PlayerAnimationスクリプトを取得。
  3. FixedUpdate() 内で AnimatePlayer() を呼び出し、プレイヤーの移動ごとにアニメーションを更新。
  4. AnimatePlayer() メソッドで、
    • ジャンプアニメーションの制御 (PlayJump())
    • 走るアニメーションの制御 (Running())

まとめ

これで、プレイヤーがジャンプした際に適切なアニメーションが再生されるようになりました。

  • PlayerAnimation スクリプトAnimator を制御
  • PlayerMove スクリプト → アニメーションの更新処理を追加
  • Animatorでの設定Jump & Run のパラメーターでアニメーションを制御

次のステップでは、障害物の生成を実装し、プレイヤーと障害物の当たり判定を設定していきましょう!




7. 障害物の生成

無限ランゲームでは、プレイヤーが障害物を避けながら進むのが醍醐味です。ここでは、障害物を定期的に生成し、当たり判定を設定する方法を解説します。


① 障害物のプレハブ化

まず、障害物となるオブジェクトを作成し、それをプレハブ化します。

1. オブジェクトの配置

  1. ヒエラルキー(Hierarchy)ウィンドウで 「右クリック」 → 「2D Object」 → 「Sprite」 を選択し、新しいオブジェクトを作成します。
  2. インスペクター(Inspector)ウィンドウで「名前をObstacle」に変更 します。
  3. Sprite Renderer の「Sprite」に障害物用の画像を設定します(アセットに含まれるオブジェクトを使用可能)。
  4. TransformのScale(大きさ)を調整 し、適切なサイズに変更します。

2. 当たり判定(Collider)の設定

  1. 「Add Component」ボタンをクリック して Box Collider 2D を追加します。
  2. 「Is Trigger」にチェックを入れます(プレイヤーが接触したときにイベントを発生させるため)。
  3. 「Rigidbody 2D」を追加し、以下の設定を行います。
    • Body Type:Kinematic
    • Gravity Scale:0(重力を受けないようにする)
    • Collision Detection:Continuous(衝突判定を精密にする)

3. プレハブ化

  1. ヒエラルキーのObstacleオブジェクトをプロジェクト(Project)ウィンドウにドラッグ&ドロップ してプレハブ化します。
  2. プレハブ化したら、ヒエラルキー上のObstacleオブジェクトを削除 します。

② 一定間隔で障害物を生成するスクリプト

次に、障害物をランダムな間隔で自動生成するスクリプトを作成します。

1. スクリプトの作成

  1. プロジェクトウィンドウを右クリック して「Create」→「C# Script」を選択。
  2. スクリプト名を ObstacleSpawner に変更。
  3. 作成したスクリプトを 空の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. スクリプトの設定

  1. ヒエラルキーで「右クリック」→「Create Empty」 して「Spawner」オブジェクトを作成。
  2. 「ObstacleSpawner」スクリプトを「Spawner」にアタッチ。
  3. Inspectorウィンドウで「Obstacle Prefab」に作成した障害物プレハブを設定
  4. 「Spawn Point」の位置をカメラの右側(X座標を適度に調整)に設定



③ 当たり判定の設定(Game Over処理)

プレイヤーが障害物に当たったらゲームオーバーになるようにします。

1. プレイヤー側のスクリプト修正

  1. PlayerMoveスクリプトを開く
  2. 以下のコードを追加 して、障害物に衝突したときに処理を行う。
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Obstacle"))
{
Debug.Log("Game Over");
Time.timeScale = 0; // ゲームを停止
}
}

2. 障害物のタグ設定

  1. プロジェクトの「Tags & Layers」から新しいタグ「Obstacle」を作成
  2. Obstacleプレハブに設定(Inspectorの「Tag」から「Obstacle」を選択)。

まとめ

  • 障害物を作成し、プレハブ化。
  • 一定間隔で障害物を生成するスクリプトを作成。
  • プレイヤーが障害物に当たるとゲームオーバーになるように設定。

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




タイトルとURLをコピーしました