UnityUnityの使い方

Unityで簡単2Dゲームを作る方法!初心者向けチュートリアル

Unity

1. はじめに

この記事では、Unityを使ってシンプルな2Dゲームを作る方法を解説します!「ゲームを作ってみたいけど、何から始めたらいいのかわからない」という方にぴったりの内容です。Unityは初心者にもやさしいツールがそろっていて、コードを書くのが初めてでも楽しくゲームを作ることができます。

今回のゴールは、障害物を避けながら進むアクションゲームを完成させることです。このゲームではキャラクターを自由に動かせるようにし、障害物を追加して少しずつ難易度を上げる仕組みを作ります。シンプルな内容なので、短時間で完成させることができますよ!

Unityを使うと、以下のようなことが簡単にできます:

  • 2Dゲーム用のテンプレートを使ってスムーズにスタート。
  • オブジェクトをドラッグ&ドロップで配置。
  • スクリプトを使ってキャラクターに動きを追加。
  • ゲームのスコアや難易度を管理。

この記事を読み進めるだけで、Unity初心者でも基礎的なゲーム開発の流れを理解できるはずです!作ったゲームは友達に見せたり、次のステップとしてアレンジを加えたりして遊びの幅を広げられます。さあ、一緒にゲーム開発の第一歩を踏み出しましょう!




2. Unityプロジェクトのセットアップ

Unityでゲームを作るには、まず新しいプロジェクトを作成する必要があります。ここでは、プロジェクトの作成手順と基本的なUnityエディタの使い方を解説します。


1. Unity Hubで新しいプロジェクトを作成する

  1. Unity Hubを開く
    Unity Hubは、Unityプロジェクトの管理ツールです。まだインストールしていない場合は、Unity公式サイトからダウンロードしてください。
  2. 新規プロジェクトを作成
    • Unity Hubを開いたら、「New Project」ボタンをクリックします。
    • 「2D Core」を選択します。これは2Dゲームに適した設定があらかじめ用意されたテンプレートです。
    • プロジェクト名を「Simple2DGame」など分かりやすい名前に設定します。
    • 保存場所を選び、「Create Project」をクリックすると、Unityエディタが起動します。

2. Unityエディタの基本画面を理解する

Unityエディタは、ゲームを作成するためのさまざまなツールがひとまとめになった画面です。最初は少し複雑に見えるかもしれませんが、主に以下の4つの部分を覚えておけば大丈夫です。

  1. ヒエラルキー(Hierarchy)ウィンドウ
    • ゲーム内にあるすべてのオブジェクト(キャラクター、背景など)がリストで表示されます。
    • ここでオブジェクトを追加・整理します。
  2. シーン(Scene)ビュー
    • ゲームのステージを作る画面です。背景やキャラクターを配置する作業を行います。
    • 画面をクリックしたりドラッグしたりして、オブジェクトを移動できます。
  3. ゲーム(Game)ビュー
    • 実際にプレイヤーが見る画面をプレビューできます。
    • シーンビューで配置したオブジェクトがどのように見えるか確認できます。
  4. プロジェクト(Project)ウィンドウ
    • 画像やスクリプト、音楽など、ゲームで使うすべてのファイルを管理する場所です。
    • 必要なファイルをここに追加して、オブジェクトとして使用します。
  5. インスペクター(Inspector)ウィンドウ
    • 選択したオブジェクトの設定を変更できます。たとえば、サイズや色、スクリプトを追加する作業を行います。

3. 簡単なプロジェクトチェック

  • プロジェクトが無事作成できたら、シーンビューを確認してみましょう。
  • デフォルトで「Main Camera」と「Directional Light」という2つのオブジェクトがあるはずです。
    • Main Cameraはゲームのプレイヤー視点のカメラです。
    • Directional Lightはゲームに光を当てるライトです(今回は2Dゲームなのでライトは必要ないことが多いです)。

これでUnityのプロジェクトセットアップは完了です!
次は、実際にゲームのステージを作成していきます。背景や地面、キャラクターを配置して、ゲームらしい見た目を作っていきましょう。




3. ゲームのステージを作成

このセクションでは、Unityを使ってゲームのステージを作っていきます。具体的には、背景を設定し、キャラクターが動ける地面を作ります。操作は簡単なので安心してください!


1. 背景を追加する

まずはゲーム画面に背景を設定しましょう。以下の手順で進めてください。

  1. 背景用のスプライトを追加する
    • ヒエラルキーウィンドウで右クリックし、「2D Object」→「Sprite」→「Square」を選択します。
    • 作成されたオブジェクトの名前を「Background」に変更します(分かりやすい名前にしておくと便利です)。
  2. 背景画像を設定する
    • プロジェクトウィンドウに背景用の画像(.pngや.jpg)をドラッグ&ドロップします。
      ※背景画像は無料素材サイトで探すか、自分で用意してください。
    • 「Background」オブジェクトを選択し、インスペクターの「Sprite Renderer」の「Sprite」欄にドラッグ&ドロップで画像を設定します。
  3. 背景のサイズを調整する
    • シーンビューで「Background」オブジェクトを選択し、画面全体を覆うように位置やサイズを調整します。
      ※スケールを変更する場合は、インスペクターで「Scale」プロパティを使いましょう。


2. 地面を作成する

次に、キャラクターが移動できる地面を作ります。

  1. 地面用のスプライトを追加する
    • 再びヒエラルキーウィンドウを右クリックし、「2D Object」→「Sprite」→「Square」を選択します。
    • 作成されたオブジェクトの名前を「Ground」に変更します。
  2. 地面画像を設定する
    • 地面用の画像をプロジェクトウィンドウにドラッグ&ドロップします。
      例: シンプルな長方形の画像を用意すると良いです。
    • 「Ground」オブジェクトを選択し、インスペクターの「Sprite Renderer」の「Sprite」欄に画像を設定します。
  3. 地面の位置とサイズを調整する
    • シーンビューで「Ground」をドラッグして画面下部に配置します。
    • 横幅を広げて画面全体を覆うようにスケールを調整します。
  4. 地面に当たり判定をつける
    キャラクターが地面に立てるようにするため、当たり判定(コライダー)を追加します。
    • 「Ground」オブジェクトを選択し、インスペクターの「Add Component」をクリックします。
    • 「Box Collider 2D」を検索して追加します。
    • 設定は自動的に適用されるので、このままでOKです。



3. 簡単な確認

ここまでで、背景と地面が設定できました。ゲーム画面がどう見えるか確認してみましょう。

  1. プレイモードで確認
    • Unityエディター上部の「▶」(再生ボタン)を押して、ゲーム画面を確認します。
    • 背景と地面が正しく表示されていれば成功です。

ポイント

  • 背景や地面に使う画像は、2Dゲームでは「Pixel Perfect」にすると見た目が綺麗に仕上がります。
    • 設定方法: カメラを選択し、インスペクターで「Pixel Perfect Camera」を追加してください。

これでゲームのステージが完成です!次は、プレイヤーキャラクターを配置して動きをつけていきましょう!




4. プレイヤーキャラクターを作成

ここでは、ゲーム内で動かせるプレイヤーキャラクターを作成します。背景や地面を用意したら、いよいよゲームの主役を配置しましょう!


1. キャラクターの配置

  1. ヒエラルキーウィンドウを右クリックします。
  2. 2D Object」→「Sprite」→「Square」を選択します。
  3. 新しく作成された「Sprite」オブジェクトを選択して、名前を「Player」に変更します。
  4. プロジェクトウィンドウに用意したキャラクター画像をドラッグ&ドロップして、Playerオブジェクトの「Sprite Renderer」の「Sprite」欄にセットします。これでキャラクター画像が表示されます。
  5. キャラクターの位置を調整して、地面の上に配置します。

2. プレイヤーキャラクターに動きをつける

キャラクターをキーボードで操作できるように、スクリプトを追加します。

  1. プロジェクトウィンドウを右クリックし、「Create」→「C# Script」を選択します。
  2. 新しいスクリプトの名前を「PlayerController」に設定します。
  3. スクリプトをダブルクリックして開き、以下のコードを記述します:
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed = 5f; // キャラクターの移動速度

    void Update()
    {
        // キーボード入力の取得
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        // キャラクターを移動させる
        Vector3 movement = new Vector3(horizontal, vertical, 0f);
        transform.position += movement * speed * Time.deltaTime;
    }
}



3. スクリプトをキャラクターにアタッチ

  1. ヒエラルキーウィンドウで「Player」オブジェクトを選択します。
  2. 作成した「PlayerController」スクリプトをドラッグ&ドロップして、Playerオブジェクトにアタッチします。
  3. インスペクターウィンドウで、スクリプトの「Speed」値を調整できます。最初は「5」くらいがおすすめです。

4. 動作確認

  1. 再生ボタン(▶)」をクリックしてゲームを実行します。
  2. キーボードの矢印キーやWASDキーでキャラクターが動くことを確認します。
  3. 動きが遅すぎる場合は、スクリプト内またはインスペクターでSpeed値を上げて調整します。

補足:キャラクターの当たり判定を追加

後でゲームの障害物と接触を判定するため、以下の設定を行いましょう。

  1. 「Player」オブジェクトを選択します。
  2. インスペクターウィンドウの「Add Component」ボタンをクリックします。
  3. Box Collider 2D」を追加します。
  4. 必要に応じてコライダーのサイズを調整して、キャラクターの形に合わせます。

これでプレイヤーキャラクターの作成が完了です!動くキャラクターを見るとテンションが上がりますよね。この先、さらにゲーム要素を加えていきましょう!




5. 障害物を追加

ここでは、ゲームに障害物を追加して、プレイヤーがそれを避ける仕組みを作ります。障害物は左から右へ自動的に動き、画面外に出たら消えるように設定します。


1. 障害物オブジェクトを作成する

  1. 障害物のスプライトを設定
    • ヒエラルキーウィンドウを右クリック→「2D Object」→「Sprite」を選択します。
    • 名前を「Obstacle」に変更しましょう。
    • プロジェクトウィンドウから障害物に使いたい画像をドラッグ&ドロップして設定します(例:四角い箱や岩など)。
    • 障害物の位置を調整し、画面右側(プレイヤーが出会う前の位置)に配置します。
  2. 当たり判定を追加
    • 障害物に「Box Collider 2D」をアタッチします。
      1. 「Inspector」ウィンドウの「Add Component」をクリック。
      2. 「Box Collider 2D」を検索して追加します。
    • 必要に応じて「Edit Collider」ボタンで当たり判定の範囲を調整します。
  3. 物理特性を設定
    • 障害物が動くようにするために「Rigidbody 2D」をアタッチします。
      • 「Add Component」から「Rigidbody 2D」を選択。
      • 以下の設定を行います:
        • Body Type を「Kinematic」に設定(障害物が自動的に動くだけで重力の影響は受けません)。



2. 障害物を動かすスクリプトを作成する

次に、障害物が左方向に自動的に動き、画面外に出たら消えるようにスクリプトを作成します。

  1. 新しいスクリプトを作成する
    • プロジェクトウィンドウで右クリック→「Create」→「C# Script」を選択。
    • スクリプトの名前を「ObstacleController」に変更します。
  2. スクリプトを記述する
    以下のコードを記述してください。
using UnityEngine;

public class ObstacleController : MonoBehaviour
{
    public float speed = 5f; // 障害物の移動速度

    void Update()
    {
        // 障害物を左に移動させる
        transform.Translate(Vector3.left * speed * Time.deltaTime);

        // 画面外に出たら削除する
        if (transform.position.x < -10f) // X座標が-10より小さくなったら
        {
            Destroy(gameObject);
        }
    }
}
  1. スクリプトを障害物にアタッチする
    作成したスクリプト「ObstacleController」をヒエラルキーウィンドウの「Obstacle」オブジェクトにドラッグ&ドロップしてアタッチします。
  2. スピードの調整
    • 「Obstacle」オブジェクトを選択し、Inspectorウィンドウで「Speed」値を調整します(例えば5.0f)。

3. 障害物をランダムに生成する

  1. 障害物を生成するためのスクリプトを作成
    次に、障害物を一定間隔でランダムな高さに生成するスクリプトを作成します。
    • プロジェクトウィンドウで右クリック→「Create」→「C# Script」を選択。
    • スクリプトの名前を「ObstacleSpawner」に変更します。
  2. スクリプトを記述
    以下のコードを記述してください。
using UnityEngine;

public class ObstacleSpawner : MonoBehaviour
{
    public GameObject obstaclePrefab; // 障害物のプレハブ
    public float spawnInterval = 2f;  // 生成間隔
    public float spawnHeight = 3f;    // 生成の高さの範囲

    void Start()
    {
        // 一定間隔で障害物を生成する
        InvokeRepeating("SpawnObstacle", 0f, spawnInterval);
    }

    void SpawnObstacle()
    {
        // ランダムな高さで障害物を生成
        float randomY = Random.Range(-spawnHeight, spawnHeight);
        Vector3 spawnPosition = new Vector3(10f, randomY, 0f);
        Instantiate(obstaclePrefab, spawnPosition, Quaternion.identity);
    }
}
  1. スクリプトを空のオブジェクトにアタッチ
    • ヒエラルキーウィンドウを右クリック→「Create Empty」で空のオブジェクトを作成。
    • 名前を「ObstacleSpawner」に変更します。
    • 作成した「ObstacleSpawner」スクリプトを空のオブジェクトにドラッグ&ドロップでアタッチします。
  2. 障害物のプレハブを設定
    • ヒエラルキーウィンドウの「Obstacle」をプロジェクトウィンドウにドラッグ&ドロップしてプレハブを作成します。
    • 「ObstacleSpawner」オブジェクトを選択し、Inspectorウィンドウの「Obstacle Prefab」にこのプレハブを設定します。

結果を確認する

  • ゲームを再生すると、障害物が画面右からランダムな高さで生成され、左に移動して画面外で削除されるようになります。これで障害物の追加が完了です!

ヒント

  • 障害物の速度や生成間隔を変えることで、難易度を簡単に調整できます。
  • 障害物の種類を増やしてバリエーションを追加することも可能です!

これで障害物の追加は完了です!




6. ゲームのスコアシステム

ここでは、ゲームのスコアシステムを作成します。障害物を避けた回数や時間経過に応じてスコアを増やし、画面上に表示する仕組みを作りましょう。初心者でもわかりやすいように、簡単なステップに分けて説明します。


1. UIを追加してスコアを表示する

スコアを表示するために、画面にテキストを追加します。

  1. スコア用のUIを作成
    • ヒエラルキーウィンドウを右クリック → 「UI」 → 「Text – TextMeshPro」を選択します。
    • 新しいテキストオブジェクトがヒエラルキーに追加されます。
  2. テキストの位置を調整
    • シーンビューでテキストをドラッグして画面の上部(例: 左上)に移動させます。
    • インスペクターで「Text」フィールドを「Score: 0」に設定します。
    • フォントサイズや色もお好みで調整しましょう。
  3. テキストの名前を変更
    • ヒエラルキーでテキストオブジェクトを右クリック → 「Rename」で「ScoreText」に名前を変更しておくと管理が簡単です。

2. スコアを更新するスクリプトを作成

スコアを計算し、UIに表示するためのスクリプトを作成します。

  1. 新しいスクリプトを作成
    • プロジェクトウィンドウを右クリック → 「Create」 → 「C# Script」を選択。
    • スクリプト名を「GameManager」と名付けます。
  2. スクリプトにコードを追加
    以下のコードを「GameManager」スクリプトに追加してください:
using UnityEngine;
using TMPro; // TextMeshPro用の名前空間

public class GameManager : MonoBehaviour
{
    public TextMeshProUGUI scoreText; // スコアを表示するテキスト
    private int score = 0;           // スコアを管理する変数

    void Start()
    {
        // ゲーム開始時にスコアを初期化
        UpdateScore();
    }

    public void AddScore(int points)
    {
        // スコアを増加
        score += points;
        UpdateScore();
    }

    void UpdateScore()
    {
        // スコアをテキストに反映
        scoreText.text = "Score: " + score.ToString();
    }
}



3. スクリプトをシーンに設定

  1. スクリプトをアタッチ
    • 空のGameObjectを作成(ヒエラルキーウィンドウを右クリック → 「Create Empty」)。
    • 作成したオブジェクトに「GameManager」スクリプトをドラッグ&ドロップでアタッチ。
  2. テキストオブジェクトをスクリプトに関連付け
    • アタッチした「GameManager」スクリプトを見ると、インスペクターに「Score Text」のフィールドがあります。
    • ヒエラルキーから「ScoreText」オブジェクトをドラッグして、このフィールドにセットします。

4. スコアを増やすタイミングを追加

スコアを加算するタイミングを設定します。たとえば、プレイヤーが一定時間生き延びた場合や障害物を避けた場合にスコアを増やします。

  • 時間経過でスコアを増やす場合
    「GameManager」スクリプトに以下のコードを追加します:
void Update()
{
    // 1秒ごとにスコアを増加
    if (Time.frameCount % 60 == 0)
    {
        AddScore(1);
    }
}
  • 障害物を避けたときにスコアを増やす場合
    障害物がプレイヤーを通過したらスコアを増加させます。障害物のスクリプトに以下を追加:
void OnBecameInvisible()
{
    // GameManagerのAddScoreを呼び出す
    FindObjectOfType<GameManager>().AddScore(1);
    Destroy(gameObject);
}

5. 動作確認

  • ゲームを実行して、スコアが正常に表示・加算されるか確認します。
  • 障害物を避けた場合や時間経過に応じてスコアが増えていれば成功です!

ポイント

  • スコアの加算ルールを自分で変更すると、ゲーム性を調整できます。
  • 見た目をカスタマイズして、さらに魅力的なUIに仕上げましょう!

これでシンプルなスコアシステムが完成です。スコア表示を改善したり、ランキング機能を追加するなど、さらにゲームを充実させていきましょう!




7. ゲームを完成させる

ここでは、ゲームを実際に動かして完成させるための重要な要素を追加します。「ゲームオーバー」の仕組みや、ゲームをビルドして遊べる形にするまでを解説します。


1. プレイヤーが障害物に当たったらゲームオーバーにする

プレイヤーが障害物に当たったらゲームオーバーにする方法を解説します。

スクリプトでゲームオーバーを実装

  1. 新しいスクリプトを作成します:
    • プロジェクトウィンドウを右クリック→「Create」→「C# Script」。
    • スクリプト名を「GameOverManager」とします。
  2. 以下のコードを追加します:
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameOverManager : MonoBehaviour
{
    // ゲームオーバー時に呼び出すメソッド
    public void GameOver()
    {
        Debug.Log("Game Over!");
        // シーンをリロードしてリスタート
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
}
  1. このスクリプトを空のGameObject(ヒエラルキーウィンドウ右クリック→「Create Empty」で作成)にアタッチし、名前を「GameManager」に変更します。
  2. 次に、プレイヤーが障害物に当たったことを検知する処理を「PlayerController」に追加します:
void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("Obstacle"))
    {
        FindObjectOfType<GameOverManager>().GameOver();
    }
}

障害物に「タグ」を設定

  • 障害物オブジェクトを選択し、インスペクターウィンドウの「Tag」ドロップダウンから「Add Tag…」を選択。
  • 新しいタグ「Obstacle」を作成し、障害物に設定します。

2. ゲームの難易度を調整する

障害物の生成頻度を増やす
障害物を一定間隔で生成する方法を追加します。

  1. 新しいスクリプト「ObstacleSpawner」を作成します:
using UnityEngine;

public class ObstacleSpawner : MonoBehaviour
{
    public GameObject obstaclePrefab;
    public float spawnInterval = 2f;

    void Start()
    {
        InvokeRepeating("SpawnObstacle", 1f, spawnInterval);
    }

    void SpawnObstacle()
    {
        float randomY = Random.Range(-3f, 3f);
        Vector3 spawnPosition = new Vector3(10f, randomY, 0f);
        Instantiate(obstaclePrefab, spawnPosition, Quaternion.identity);
    }
}
  1. ヒエラルキーウィンドウで空のGameObjectを作成し、「Spawner」と名前をつけます。
  2. このオブジェクトに「ObstacleSpawner」スクリプトをアタッチし、インスペクターで障害物のPrefabを割り当てます。



3. ゲームのUIを完成させる

ゲームオーバー時の「Game Over」表示を作成します。

  1. 「Game Over」テキストを作成
    • ヒエラルキーウィンドウを右クリック→「UI」→「Text – TextMeshPro」。
    • テキストを「Game Over」と設定し、画面中央に配置。
    • フォントサイズや色を調整して目立つようにします。
  2. 非表示にするスクリプトを作成
    初期状態でテキストを非表示にし、ゲームオーバー時に表示するスクリプトを作成します。
using UnityEngine;
using TMPro;

public class GameOverUI : MonoBehaviour
{
    public TextMeshProUGUI gameOverText;

    void Start()
    {
        gameOverText.gameObject.SetActive(false);
    }

    public void ShowGameOver()
    {
        gameOverText.gameObject.SetActive(true);
    }
}
  1. スクリプトをGameManagerに統合
    「GameOverManager」に以下のコードを追加して「Game Over」を表示させます。
public TextMeshProUGUI gameOverText;

public void GameOver()
{
    gameOverText.gameObject.SetActive(true);
    Debug.Log("Game Over!");
    Time.timeScale = 0; // ゲームを停止
}

4. ゲームをビルドする

最後に、完成したゲームを実際に遊べるようにビルドします。

ビルドの手順

  1. メニューから「File」→「Build Settings」を選択。
  2. プラットフォームを選択(例:PC, Mac, Linux Standalone)。
  3. 「Add Open Scenes」をクリックして現在のシーンを追加。
  4. 「Build」ボタンを押して保存場所を選択し、ビルドを開始。

これで「ゲームを完成させる」工程は終了です!完成したゲームを実際にプレイしてみましょう。
さらに発展させたい場合は、以下を試してみてください:

  • ゲームのBGMや効果音を追加
  • プレイヤーがアイテムを拾える仕組みを追加
  • 難易度の段階を設定

お疲れさまでした!




8. まとめ

お疲れさまでした!この記事の手順を通じて、Unityを使った簡単な2Dゲーム作りに挑戦しましたね。以下に今回学んだことを振り返ってみましょう。


今回学んだこと

  1. Unityの基本操作
    • プロジェクトの作成方法や、ヒエラルキーやシーンビューの使い方を学びました。
  2. 2Dゲームのステージ作成
    • 背景や地面の配置を行い、ステージを作成する基本を学びました。
  3. キャラクターの動きの実装
    • スクリプトを作成して、プレイヤーキャラクターを自由に動かせるようにしました。
  4. 障害物の追加と動きの設定
    • 障害物の動きや、画面外に消えた際の削除方法を学びました。
  5. スコアシステムの実装
    • ゲームにスコアを追加して、プレイの楽しさを高める方法を学びました。



次のステップ

このゲームをさらに魅力的にするために、次のようなステップに挑戦してみましょう!

  1. ゲームの難易度を上げる
    • 障害物の出現頻度や速度を調整して、ゲームの難易度を変えてみましょう。
  2. 音楽や効果音を追加
    • UnityのAudio Source機能を使って、ゲームに背景音楽や効果音を追加してみましょう。
  3. アニメーションを取り入れる
    • プレイヤーキャラクターにアニメーションを付けることで、動きにリアルさを加えることができます。
  4. ゲームオーバー画面を作成
    • プレイヤーが障害物にぶつかったときに、ゲームオーバー画面を表示して再挑戦できるようにしましょう。
  5. モバイル向けの最適化
    • スマホやタブレット向けに操作方法をタッチ操作に変更して、モバイルで遊べるゲームに進化させてみましょう。
  6. オンラインランキングの導入
    • スコアをネットで共有して、他のプレイヤーと競争できる仕組みを取り入れてみるのも面白いです。

あなたもクリエイター!

ゲーム作りは何度も挑戦してみることでスキルがどんどん上がります。今回作ったゲームをベースに、少しずつ機能を追加して、オリジナルの作品を完成させてみてください!

それでは、Unityで楽しいゲーム開発ライフをお楽しみください!