【実践記事】Unityで「アイテムキャッチゲーム」を作ってみた|初心者がハマった所、全部見せます

初心者向け実践開発

対応バージョン:Unity 6.3 LTS(6000.3系) この記事はUnity 6.3 LTSの画面・メニュー名に合わせています。古いバージョン(Unity 2021/2022など)では一部のメニュー名や挙動が異なる場合があります。

これまでのSTEP1〜7では、企画の立て方からエンジン選び、環境構築、実装の考え方、デバッグ、公開、宣伝までを順番に解説してきました。今回はその総まとめとして、実際にUnityで簡単なゲームを1本、最初から最後まで作ってみます。

ただ手順を並べるだけでなく、筆者が実際に手を動かしながら「あ、動かない」「なんでこうなった」とつまずいた瞬間もそのまま記事にしています。同じところで詰まったときの安心材料にしてもらえたら嬉しいです。

目次

  • 今回作るもの
  • 準備:プロジェクトとシーンの下ごしらえ
  • 第1関門:プレイヤーが「カクカク」動く
  • 第2関門:アイテムがすり抜けて落ちていく
  • 第3関門:キャッチしても反応しない
  • 第4関門:スコアが表示されない
  • 仕上げ:ゲームオーバーと難易度調整
  • 完成して振り返って分かったこと
  • 次にやること

今回作るもの

画面上部からランダムにアイテムが降ってきて、プレイヤーが左右に動くカゴ(プレイヤーオブジェクト)でキャッチするだけのシンプルなゲームです。

  • 左右キーでカゴを操作する
  • アイテムをキャッチするとスコアが増える
  • アイテムを3回逃すとゲームオーバー

要素としては「入力」「移動」「オブジェクトの生成」「当たり判定」「UI表示」「ゲーム終了処理」と、2Dゲームの基本がひと通り詰まっています。STEP3で紹介した環境構築が終わっている前提で進めます。

完成したゲームのプレイ画面

準備:プロジェクトとシーンの下ごしらえ

新規2Dプロジェクトを作成し、シーンに以下を配置するところから始めました。

  • Player(プレイヤーのカゴ):白い四角のスプライトをアタッチしたGameObject
  • Spawner(アイテムを生成する役):空のGameObject
  • Item(降ってくるアイテム):丸いスプライトをプレハブ化したもの

ここまでは特に詰まらず順調でした。問題はこのあとです。

🔧 詳しい手順

  1. Unity Hubを開き、左メニューの「Projects」→「New project」をクリックする
  2. 「Editor version」で導入済みの Unity 6.3 LTS(6000.3.x)を選択する
  3. テンプレート一覧は「Core」「Sample」「Learning」のタブに分かれている。「Core」タブの中から「Universal 2D」を選択する(URP=Universal Render Pipelineを使う2Dテンプレート。同じ並びにある「2D(Built-in Render Pipeline)」は旧式のレンダリングパイプラインなので、今回は選ばない)。初回はテンプレートのダウンロードが必要な場合があるので「Download template」をクリックして待つ
  4. 「Project name」にプロジェクト名(例:ItemCatchGame)を入力し、保存先を確認したら「Create project」をクリックする
  5. プロジェクトが開いたら、メニューの File → Save As Scene… でシーンに名前を付けて保存する(例:MainScene)
  6. Playerを作る:Hierarchyウィンドウの空いている場所で右クリック→「2D Object」→「Sprites」→「Square」を選択。作られたオブジェクトの名前をInspector上部で「Player」に変更し、Transformの Position を (0, -4, 0) くらいに設定する
  7. Spawnerを作る:Hierarchyで右クリック→「Create Empty」を選択。名前を「Spawner」に変更し、Position を (0, 6, 0) くらいに設定する
  8. Itemを作る:Hierarchyで右クリック→「2D Object」→「Sprites」→「Circle」を選択。名前を「Item」に変更する
  9. Itemにタグを付ける:Itemを選択した状態でInspector左上の「Tag」のドロップダウン→「Add Tag…」→「+」ボタンで「Item」という名前のタグを新規作成し、保存。もう一度ItemオブジェクトのTagドロップダウンから今作った「Item」を選び直す
  10. Itemをプレハブ化する:Projectウィンドウで Assets フォルダ内に右クリック→「Create」→「Folder」で「Prefabs」フォルダを作成。HierarchyのItemオブジェクトを、このPrefabsフォルダにドラッグ&ドロップする(アイコンが青くなればプレハブ化成功)。Hierarchy上のItemは、シーンに残しておいてもこのあと上書きされるので消さなくてOK
Hierarchyに配置したPlayer・Spawner・Item

第1関門:プレイヤーが「カクカク」動く

まずはプレイヤーを左右に動かすスクリプトを書きました。Update()の中で位置をそのまま動かすと、フレームレートに動きの速さが左右されてしまうため、最初からTime.deltaTimeを使う形で書いています。

🔧 詳しい手順

  1. Projectウィンドウの Assets フォルダ内に右クリック→「Create」→「Folder」で「Scripts」フォルダを作成する
  2. Scriptsフォルダ内で右クリック→「Create」→「MonoBehaviour Script」を選択し、名前を「PlayerMover」にする(ファイル名とクラス名は一致させる必要があるので、あとから名前を変えないこと)
  3. PlayerMoverをダブルクリックして開く(Visual StudioやVisual Studio Codeなど、Unityに紐づいたエディタが起動する)
  4. 下のコードを参考に、class PlayerMover : MonoBehaviour の中身を書き換えて保存する
using UnityEngine;

public class PlayerMover : MonoBehaviour
{
    public float speed = 5f;

    void Update()
    {
        float input = Input.GetAxis("Horizontal");
        transform.position += new Vector3(input * speed * Time.deltaTime, 0, 0);
    }
}

ところが保存してUnityに戻ると、Consoleに赤字でこんなエラーが出ました。

Assets\Scripts\PlayerMover.cs(22,6): error CS1513: } expected

原因は、解説サイトのコード例にはUpdate()の中身だけが書かれていて、using UnityEngine;public class PlayerMover : MonoBehaviour { ... }というクラス全体の枠組みまでは書かれていなかったことでした。テンプレートにもとから入っていたStart()メソッドなどを消したときに、対応する閉じかっこ}まで一緒に消してしまい、かっこの数が合わなくなっていたのです。

}の数を1つ追加してクラス全体を正しい形に直すと、エラーは消えました。エラーメッセージの数字(22,6)は「22行目の6文字目」という意味で、最初は怖く見えますが、慣れると「だいたいこのへんでかっこが足りない」と当たりをつけられるようになります。

⚠️ Unity 6特有の注意点 Input.GetAxisInput.GetKeyは従来の「Input Manager(旧)」という仕組みのAPIです。コンパイルが通って再生しても、Consoleに次のような実行時エラーが出て動かないことがあります。

InvalidOperationException: You are trying to read Input using the UnityEngine.Input class, but you have switched active Input handling to Input System package in Player Settings.

これは Edit → Project Settings → Player → Active Input Handling が「Input System Package (New)」のみになっている場合に起こります。ドロップダウンを「Both」(または「Input Manager (Old)」)に変更し、Unityエディタの再起動を求められたら再起動してください。「Both」にしておくと、新旧どちらの書き方のコードも動くので迷ったらこちらがおすすめです。今回のコードはすべて旧Input Managerの書き方で統一しています。

ここまで直すと、矢印キーでカゴが左右にスムーズに動くようになりました。なお、もしTime.deltaTimeを掛け忘れて「1フレームにつき1ずつ」動かすコードを書いてしまうと、PCの性能によってはものすごい速さで画面外に吹き飛んでいくことがあります。今回は最初からTime.deltaTime付きで書いたので体験しませんでしたが、これも初心者がよく踏む定番のバグなので頭の片隅に置いておくと安心です。

🔧 詳しい手順(スクリプトの取り付けと確認)

  1. HierarchyでPlayerオブジェクトをクリックして選択する
  2. Inspector下部の「Add Component」ボタン→検索欄に「PlayerMover」と入力→候補をクリックしてコンポーネントを追加する(もしくはProjectウィンドウのPlayerMoverスクリプトを、HierarchyのPlayerオブジェクトに直接ドラッグ&ドロップしてもよい)
  3. InspectorにPlayerMoverのSpeedという項目が出ていれば成功。デフォルトの5のままでOK
  4. 画面上部の再生ボタン(▶)をクリックし、Gameビューを見ながら左右キーを押してPlayerが動くか確認する
  5. 確認できたら、もう一度▶ボタンを押して再生を止める(再生中に直した内容は保存されないので注意)
左右キーでスムーズに動くようになったプレイヤー

第2関門:アイテムがすり抜けて落ちていく

次にアイテムを降らせる処理です。Spawnerに一定間隔でItemプレハブを生成するコードを書きました。

🔧 詳しい手順(落下用コンポーネントの準備)

  1. ProjectウィンドウのPrefabsフォルダにあるItemプレハブをダブルクリックして編集モードで開く
  2. Inspector下部の「Add Component」→「Rigidbody 2D」を追加する(Gravity Scaleはデフォルトの1のままにしておく)
  3. 続けて「Add Component」→「Circle Collider 2D」を追加する
  4. 追加したCircle Collider 2DのInspector内にある「Is Trigger」のチェックボックスにチェックを入れる(これを忘れると物理的にぶつかってしまい、すり抜けずに変な動きをする)
  5. 左上の「<」(戻る矢印)またはHierarchy上の余白をクリックして、プレハブ編集モードを抜ける
public GameObject itemPrefab;
public float spawnInterval = 1.5f;

void Start()
{
    InvokeRepeating(nameof(SpawnItem), 1f, spawnInterval);
}

void SpawnItem()
{
    float x = Random.Range(-4f, 4f);
    Vector3 spawnPos = new Vector3(x, 6f, 0);
    Instantiate(itemPrefab, spawnPos, Quaternion.identity);
}

アイテム側にはRigidbody2Dを付けて重力で落とすようにしたのですが、再生してみるとアイテムが画面下までスルスル落ち続けて消えませんでした。Colliderを付け忘れていたわけではなく、付けてはいたのですが「Is Trigger」のチェックを外し忘れていたせいで、地面のColliderと衝突した瞬間に変な跳ね方をするという別の問題も発生しました。

ℹ️ 補足:Unity 6.3 LTSではBox2D v3をベースにした新しい低レベル2D物理APIが追加されていますが、これは既存のRigidbody2D/Collider2Dの仕組みと並行して使えるオプション機能です。今回のような小さなゲームでは、これまで通りInspectorからRigidbody2DとCollider2Dを追加する方法で問題ありません。

最終的には次のように整理しました。

  • Itemには Rigidbody2D(Gravity Scaleは1のまま)と Circle Collider 2D(Is Trigger オン)
  • 画面外(Y座標が-6を下回ったら)に出たアイテムは自動でDestroyする監視スクリプトを追加

🔧 詳しい手順(SpawnerにItemSpawnerスクリプトを設定する)

  1. Scriptsフォルダ内で新しいMonoBehaviour Scriptを作成し、「ItemSpawner」という名前にする
  2. 上のコードを参考にItemSpawnerの中身を書いて保存する
  3. HierarchyでSpawnerオブジェクトを選択し、Add ComponentからItemSpawnerを追加する
  4. InspectorにItem Prefabという空欄が出てくるので、ProjectウィンドウのPrefabsフォルダにあるItemプレハブをその欄にドラッグ&ドロップする(ここを空欄のままにすると、再生してもアイテムが一切生成されないので要注意)
  5. 続けて、画面外に出たアイテムを消すスクリプトも用意する。Scriptsフォルダに「ItemDestroyer」という名前でMonoBehaviour Scriptを作成し、下のコードを書いて保存する
  6. ProjectウィンドウのPrefabsフォルダからItemプレハブをダブルクリックして編集モードに入り、Add ComponentでItemDestroyerを追加してから編集モードを抜ける(プレハブに追加すれば、Spawnerが生成するすべてのItemに自動で付与される)
void Update()
{
    if (transform.position.y < -6f)
    {
        // 逃したアイテムとしてカウントする処理をここに足す(後述)
        Destroy(gameObject);
    }
}

「物理エンジンに任せる部分」と「自分でロジックを書く部分」の線引きが最初は曖昧で、ここで一番時間を使いました。

第3関門:キャッチしても反応しない

プレイヤーとアイテムが重なってもまったく反応がありませんでした。原因を切り分けるのに地味に時間がかかったのですが、最終的に2つのミスが重なっていたことが分かりました。

1つ目は、OnTriggerEnter2Dを使うには衝突する片方のRigidbody2Dが必須という点を見落としていたこと。Itemには付けていましたが、Player側には付けていませんでした。

2つ目は、関数名のタイポでOnTriggerEnter2DOnTiggerEnter2Dと書いていたことです。コンパイルエラーにはならず、ただ呼ばれないだけだったので発見が遅れました。

🔧 詳しい手順(Player側にコンポーネントを追加する)

  1. HierarchyでPlayerオブジェクトを選択する
  2. Add Component→「Rigidbody 2D」を追加する。InspectorのBody Typeを「Dynamic」から「Kinematic」に変更する(重力で落ちてしまわないようにするため)
  3. Add Component→「Box Collider 2D」を追加し、Is Triggerにチェックを入れる
  4. Scriptsフォルダに「PlayerCatcher」という名前でMonoBehaviour Scriptを新規作成し、下のコードを参考に中身を書いて保存する
  5. HierarchyのPlayerに、Add ComponentでPlayerCatcherを追加する

最終的なキャッチ判定はこうなりました。

using UnityEngine;

public class PlayerCatcher : MonoBehaviour
{
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Item"))
        {
            Debug.Log("キャッチ!");
            Destroy(other.gameObject);
        }
    }
}

ここで一度「実は最初からスコア加算のコードまで書こうとしていた」という別の失敗にも触れておきます。本来ならキャッチした瞬間にScoreManager.Instance.AddScore(10);のようにスコアを増やしたいのですが、ScoreManagerクラスはまだこのあとの第4関門で作る予定でした。存在しないクラスを先に呼び出そうとしてCS0103: The name 'ScoreManager' does not exist in the current contextというコンパイルエラーが出てしまったのです。

そこで一旦Debug.Log("キャッチ!")で「当たり判定そのものは動いているか」だけを確認し、スコア計算は次の章でScoreManagerを作ってから繋ぐ、という順番に変更しました。「動く最小単位を確認してから、次の機能を足す」という、デバッグの基本を再確認させられた場面でした。

タグを使った判定にしたことで、後から「特定のアイテムだけ得点を変える」といった拡張もしやすくなりました。

プレイヤーがアイテムをキャッチした瞬間

第4関門:スコアが表示されない

スコアを管理するシングルトンクラスを作り、UI Textで表示しようとしたところ、数値はコンソール上では増えているのに画面には反映されないという状態になりました。

原因は単純で、Canvas内に置いたTextオブジェクトへの参照をInspector上でドラッグし忘れていただけでした。スクリプトのpublic変数は、書いただけでは何も繋がらず、Unityエディタ側で手動でアサインしないと動かないという、初心者が一度は通る典型的なつまずきでした。

🔧 詳しい手順(スコア表示用UIを作る)

  1. Hierarchyで右クリック→「UI」→「Text – TextMeshPro」を選択する。初回は「TMP Importer」というダイアログが出るので「Import TMP Essentials」をクリックする(このとき自動的に親としてCanvasとEventSystemも作られる)
  2. 作られたテキストオブジェクトの名前を「ScoreText」に変更する
  3. Hierarchyで右クリック→「Create Empty」を選択し、名前を「GameManager」に変更する(このオブジェクトにスコアやゲームオーバーなど、ゲーム全体を管理するスクリプトをまとめてアタッチしていく)
  4. Scriptsフォルダに「ScoreManager」という名前でMonoBehaviour Scriptを作成し、下のコードを参考に中身を書いて保存する
  5. GameManagerにAdd ComponentでScoreManagerを追加する
  6. InspectorにScore Textという空欄が出てくるので、HierarchyのScoreTextオブジェクトをドラッグ&ドロップして接続する(この接続を忘れるとコード上は動いていても画面には何も表示されない)
  7. なお、TextMeshProを使う場合はスクリプトの先頭に using TMPro; を追加し、変数の型を Text ではなく TMP_Text にする必要がある点に注意(標準のUI.Textを使う場合は using UnityEngine.UI; のままでよい)
using UnityEngine;
using TMPro;

public class ScoreManager : MonoBehaviour
{
    public static ScoreManager Instance;
    public TMP_Text scoreText;
    private int score = 0;

    void Awake()
    {
        Instance = this;
    }

    public void AddScore(int amount)
    {
        score += amount;
        scoreText.text = "Score: " + score;
    }
}

合わせて、TextMeshProと標準のTextが混在していてエラーが出たこともありました。新規プロジェクトではTextMeshProが標準になっているため、古い解説記事のコードをそのまま貼るとusing UnityEngine.UIusing TMProの食い違いでハマりやすい、という点も学びでした。

参照を接続できたら、第3関門で仮置きしていたPlayerCatcherのDebug.Log("キャッチ!");を、本来やりたかった処理に書き換えます。

ScoreManager.Instance.AddScore(10);

再生してアイテムをキャッチすると、Consoleの代わりに画面上のスコアが増えるようになりました。

ここでさらにもう一つ、見た目のつまずきがありました。新しく作ったScoreTextは、デフォルトの状態だとCanvasのちょうど真ん中に配置されてしまいます。これは、TextMeshProを新規作成したときのRect Transformのアンカーが中央基準になっているためでした。

🔧 詳しい手順(スコア表示の位置を直す)

  1. HierarchyでScoreTextを選択する
  2. Inspectorの「Rect Transform」コンポーネント左上にある四角いアイコン(アンカープリセット)をクリックする
  3. プリセット一覧の中から、Shiftキー+Altキーを押しながら左上のプリセットをクリックする(アンカーとピボットが同時に左上へ設定される)
  4. 表示が「Pos X / Pos Y / Pos Z」と「Width / Height」に切り替わるので、Pos Xを20、Pos Yを-20くらいに設定し、画面左上に少し余白を持たせて配置する

これで、ゲーム画面の左上にスコアが表示されるようになりました。

Inspectorで参照をアサインしてスコアが正しく表示された画面

仕上げ:ゲームオーバーと難易度調整

逃したアイテムをカウントし、3回逃したらゲームオーバーにする処理を追加しました。

🔧 詳しい手順(ゲームオーバー表示と難易度調整)

  1. Canvasの中で右クリック→「UI」→「Text – TextMeshPro」を選択し、名前を「GameOverText」にする。内容を「GAME OVER」などに変更し、文字を大きめにして画面中央に配置する
  2. GameOverTextを選択した状態で、Inspector左上のチェックボックス(オブジェクト名の横にある有効/無効のチェック)を外し、最初は非表示にしておく
  3. Scriptsフォルダに「GameOverManager」という名前でMonoBehaviour Scriptを作成し、ShowGameOver()の中でGameOverTextをSetActive(true)にする処理を書く
  4. GameManagerオブジェクトにAdd ComponentでGameOverManagerを追加し、InspectorでGameOverTextオブジェクトをドラッグ&ドロップして接続する
  5. 下のコードを参考に、ミスカウント用の処理をItemDestroyerスクリプト側に1か所だけ書く(PlayerCatcher側には書かないこと。両方に書くと1回逃しただけで2カウントされてしまう)
  6. 難易度調整として、ItemSpawnerのコードに「アイテムを生成するたびにspawnIntervalを少しずつ短くする」処理を追加する
using UnityEngine;

public class GameOverManager : MonoBehaviour
{
    public static GameOverManager Instance;
    public GameObject gameOverText;

    void Awake()
    {
        Instance = this;
    }

    public void ShowGameOver()
    {
        gameOverText.SetActive(true);
    }
}
using UnityEngine;

public class ItemDestroyer : MonoBehaviour
{
    private static int missCount = 0;
    private static int maxMiss = 3;

    void Update()
    {
        if (transform.position.y < -6f)
        {
            missCount++;
            if (missCount >= maxMiss)
            {
                GameOverManager.Instance.ShowGameOver();
            }
            Destroy(gameObject);
        }
    }
}

最初はミスをカウントする処理をItem側とPlayer側の両方に書いてしまい、1回逃しただけでミスが2カウントされるという不具合も発生しました。処理の責任をどちらか一方に寄せる、という基本的な設計の大切さを実感した場面でした。

ここでも見た目のつまずきがありました。GameOverTextに「GAME OVER」と入力したところ、文字が1行に収まらず縦にバラバラに折り返されてしまったのです。原因は、TextMeshProオブジェクトのRect TransformのWidth(横幅)が初期値のままで狭すぎたことでした。

🔧 詳しい手順(テキストの折り返しを直す)

  1. HierarchyでGameOverTextを選択する
  2. Inspectorの「Rect Transform」のアンカープリセットをクリックし、「Middle Center」(中央・引き伸ばしなし)を選ぶと「Pos X / Pos Y」と「Width / Height」が表示される
  3. Widthの値を300〜400程度に広げる
  4. それでも折り返される場合は、「TextMeshPro – Text (UI)」コンポーネントの「Extra Settings」を開き、「Wrapping」のチェックを外すと強制的に1行で表示できる

GAME OVERが正しく1行で表示できたところで再生して3回アイテムを逃すと、たしかに「GAME OVER」は表示されました。ところが、背後では降ってくるアイテムが止まらず動き続けているという、まさに「ゲームが終わった気がしないゲームオーバー画面」になっていました。

原因は単純で、ゲームオーバーになってもTime.timeScale(ゲーム内の時間の流れ)を変更していなかったからです。Time.deltaTimeを使った移動処理も、InvokeRepeatingによるアイテム生成も、すべてTime.timeScaleの影響を受けます。これを0にすれば、ゲーム全体を一時停止させられます。

public void ShowGameOver()
{
    gameOverText.SetActive(true);
    Time.timeScale = 0f;
}

GameOverManagerのShowGameOver()にこの1行を足すと、GAME OVER表示と同時にプレイヤー・アイテム・スポナーのすべての動きがぴたりと止まるようになりました。

最後に、時間経過とともにspawnIntervalを少しずつ短くする処理を足して、ゲームらしい緩急をつけました。

using UnityEngine;

public class ItemSpawner : MonoBehaviour
{
    public GameObject itemPrefab;
    public float spawnInterval = 1.5f;
    public float minInterval = 0.5f;
    public float intervalDecreaseAmount = 0.05f;

    void Start()
    {
        InvokeRepeating(nameof(SpawnItem), 1f, spawnInterval);
    }

    void SpawnItem()
    {
        float x = Random.Range(-4f, 4f);
        Vector3 spawnPos = new Vector3(x, 6f, 0);
        Instantiate(itemPrefab, spawnPos, Quaternion.identity);

        if (spawnInterval > minInterval)
        {
            spawnInterval -= intervalDecreaseAmount;
            CancelInvoke(nameof(SpawnItem));
            InvokeRepeating(nameof(SpawnItem), spawnInterval, spawnInterval);
        }
    }
}

これで完成です。

アイテムを3回逃してゲームオーバーになった画面

完成して振り返って分かったこと

  • 解説記事のコードスニペットは「メソッドの中身だけ」が抜粋されていることが多く、そのまま貼ると波かっこ{ }の数が合わずCS1513のようなエラーになりやすい。using文からクラスの閉じかっこまで、ファイル全体の形を意識する
  • Unity 6ではプロジェクトの設定によってInput.GetAxisなどの旧Input Manager APIが実行時エラーになることがある。エラーメッセージに「Active Input handling」という単語が出てきたら、Project SettingsのPlayerタブを疑う
  • まだ作っていないクラス(今回で言うScoreManager)を先のスクリプトから呼び出そうとすると、コンパイルエラーになる。実装の順番通りに進められない時は、Debug.Logなどの仮処理で一旦動作確認だけ済ませ、あとから本処理に差し替えるとスムーズ
  • 新規作成したUI要素(TextMeshProなど)は初期状態でCanvasの中央に配置されることが多いので、アンカープリセットの意味(Shift+Altクリックでアンカーとピボットを同時設定できることなど)を理解しておくと配置で迷わない
  • 横幅が固定されたテキストは、文字数や言語によって折り返されることがある。RectTransformのWidthか、TextMeshProの「Wrapping」設定を疑う
  • 「動くには動くけど何かおかしい」の原因の多くは、Is Triggerの設定、Inspectorでの参照アサイン忘れ、Time.timeScaleの使い忘れの3つに集約された
  • エラーが出ない不具合(タイポによる無反応、参照漏れ、見た目だけの不具合)の方が、エラーメッセージが出る不具合より発見に時間がかかった
  • 1つの判定(ミスカウントなど)はできるだけ1箇所にまとめて書いた方が事故が少ない
  • ゲームオーバーやポーズなど「ゲーム全体を止める」処理は、Time.timeScaleのような一括で効く仕組みを使うと、個別のスクリプトを止めて回らずに済む

ゲーム自体はとても小さなものですが、移動・生成・当たり判定・UI・終了処理という、ゲーム作りの基本要素を一通り経験できました。STEP4で触れた「実装でつまずきやすいポイント」が、まさにこういう細かい設定漏れの積み重ねだったのだと実感しました。

次にやること

ここからさらに磨き込むなら、次のような方向が考えられます。

  • 効果音やパーティクルを足して、キャッチした瞬間の気持ちよさを強化する
  • STEP5で紹介したデバッグ・テストプレイの手順に沿って、第三者に遊んでもらいフィードバックを集める
  • STEP6の配信プラットフォーム比較を参考に、ふりーむ!やitch.ioへの公開を検討する

今回のような小さな1本を作り切る経験は、次のもう少し大きな企画に挑戦するときの自信にもつながります。まずは「最後まで形にする」ことを目標に、ぜひ自分なりのミニゲームに挑戦してみてください。

あわせて読みたいおすすめ書籍(PR)

今回のような「手を動かしながらUnityを覚える」スタイルが好きな方には、以下の書籍もおすすめです。

※リンクは仮のものです。実際のASIN・アフィリエイトタグに差し替えてください。

この記事を作成するにあたって参考にしたサイト

コメント

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