Unityでレベルアップ機能を作る(プロジェクト作成からUI連動まで完全解説)

広告


Unityで「ゲームっぽい動き」が見えてくる最初のポイントは、

  • データを持つ
  • 操作で変わる
  • 画面に反映される

この3つをつなぐことです。

今回は最初から丁寧に、

プロジェクト作成 → レベルアップ → UI表示

までを一気に通します。


このチュートリアルの見方

表面は「ボタンを押したらレベルが上がる」という超シンプルな内容ですが、実はかなり多くの概念が詰め込まれています。

具体的に言うと:

責務の分離(SRP) Statusはデータだけ、LevelUIは表示と操作だけ、という分け方はSOLID原則のSingle Responsibility Principleそのものです。初心者向けの記事でありながら、プロが現場で意識する設計の基本を自然に体験させています。

依存の方向性 LevelUIStatusを参照する一方向の依存になっており、StatusはUIのことを一切知らない。これはMVCやMVPパターンの考え方の土台です。「UIが直接データを書き換えない」という一文に、その思想が凝縮されています。

Inspectorによる依存注入 publicフィールドでドラッグ&ドロップする設計は、実はDI(依存性注入)の概念を手作業で体験させています。コードでnewするのではなく外から注入するという発想が、自然と身につく構造です。

拡張性の予告 記事末尾の「HPバー・経験値・スキル・UI更新すべてにつながります」という一文は、この構成がそのままゲーム全体のアーキテクチャに発展できることを示唆しています。

つまりこの記事、初心者が「動いた!」と感じながら、気づかないうちに設計の文法を体にインストールされる構造になっています。

クラス図(責務の分離)

ボタン押下時のシーケンス図

この設計が「将来どう拡張できるか」を示す構造図

今回の完成イメージ

Level Upボタンを押すと、Levelが1つずつアップします


記事の流れまとめ

  1. プロジェクト作成 — Unity HubでLevelUpSampleという名前で作成
  2. Playerオブジェクト — Hierarchyに空のGameObjectを作成
  3. Status.cs — int LevelフィールドとLevelUp()メソッドを持つシンプルなスクリプト
  4. Canvas + TextMeshPro — LevelTextでレベル表示
  5. Button — LevelUpButtonを作成
  6. LevelUI.cs — Statusへの参照とTextMeshProUGUIへの参照を持ち、ボタン押下でLevelUp()を呼んでUIを更新
  7. Inspector設定 — ドラッグ&ドロップで参照を繋ぐ
  8. ボタンのOnClick登録 — OnClickLevelUp()を登録

設計の肝として「UIが直接データを書き換えない」という分離設計(Status = データ、LevelUI = 表示と操作)を明示的に構成されている点が挙げられます。

① プロジェクトを作る

Unity Hubを開きます。

手順

  1. 「新しいプロジェクト」
  2. テンプレートは 2D(または3D)
  3. プロジェクト名: LevelUpSample
  4. 保存場所を選択
  5. 作成

プロジェクト名の考え方(重要)

名前は適当につけがちですが、実務では重要です。

今回なら:

  • LevelUpSample
  • PlayerStatusSample
  • UILearning_LevelUp

など、目的が分かる名前にします。


② Playerを作る

Hierarchyで右クリック:

  • Create Empty
  • 名前:Player

③ Statusスクリプトを作る

Projectビューで:

  • Create → MonoBehaviour Script
  • 名前:Status

Status.cs

using UnityEngine;

public class Status : MonoBehaviour
{
    [Header("基本ステータス")]
    [Tooltip("プレイヤーの現在のレベル")]
    public int Level = 1;

    public void LevelUp()
    {
        Level++;
    }
}

これを Playerにアタッチします。

④ Canvasを作って、レベル表示を作る

Hierarchyで右クリック:

  • UI(Canvas) → Text – TextMeshPro
  • 名前:LevelText

(EventSystemも自動生成されます)

表示内容

Level : 1

⑤ ボタンを作る

  • Canvas右クリック
  • UI(Canvas) → Button – TextMeshPro
  • 名前:LevelUpButton

ボタンの文字:

Level Up

LevelUIスクリプトを作る

  • Create → MonoBehaviour Script
  • 名前:LevelUI

LevelUI.cs

using TMPro;
using UnityEngine;

public class LevelUI : MonoBehaviour
{
    [Header("参照設定")]
    [Tooltip("レベルを持っているプレイヤー")]
    public Status playerStatus;

    [Tooltip("レベル表示用テキスト")]
    public TextMeshProUGUI levelText;

    void Start()
    {
        UpdateLevelText();
    }

    public void OnClickLevelUp()
    {
        playerStatus.LevelUp();
        UpdateLevelText();
    }

    void UpdateLevelText()
    {
        levelText.text = "Level : " + playerStatus.Level;
    }
}

⑧ Canvasにアタッチ

  • Canvasを選択
  • LevelUIをアタッチ

⑨ Inspectorで参照設定(最重要)

playerStatus

→ Playerをドラッグ

levelText

→ LevelTextをドラッグ


⑩ ボタンに処理を登録

LevelUpButtonを選択:

  • On Click() に追加
  • Canvasをドラッグ
  • LevelUI → OnClickLevelUp()

+ボタンで、イベントを追加します

イベントハンドラ(メソッド)を持っているオブジェクトを選択

CanvasにLevelUIコンポーネント(スクリプト)がアタッチされているので、それをヒエラルキーからドラッグ&ドロップします

ボタンイベントにイベントハンドラを登録

① Canvasゲームオブジェクトをヒエラルキーからドラッグ&ドロップ(すでに上記で終えています)
② No Funtionを選択
③ LevelUI(コンポーネント(スクリプト))を選択
④ ③のスクリプトでpublicのアクセス修飾子がついているイベントハンドラ(メソッド)が表示されるので選択


動作確認

再生してボタンを押します。

→ レベルが増えて表示も変われば成功


仕組みの理解

データ

public int Level = 1;

プレイヤーが持つ状態


処理

Level++;

レベルを変更する


表示

levelText.text = "Level : " + playerStatus.Level;

画面に反映する


なぜ分けるのか

今回の構成:

  • Status → データ
  • LevelUI → 表示と操作

これはとても重要です。

UIが直接データを書き換えない

という設計の第一歩です。


よくあるつまずき

ボタンが動かない

→ OnClick未設定


エラーが出る

→ 参照未設定(playerStatus / levelText)


表示が変わらない

→ UpdateLevelText未呼び出し


この教材の意味

この構成が理解できると、

  • HPバー
  • 経験値
  • スキル
  • UI更新

すべてにつながります。


参考:各オブジェクトのサンプル

Player

Canvas

LevelText

LevelUpButton

LevelUpButton-Text

訪問数 34 回, 今日の訪問数 34回

広告

Unity

Posted by hidepon