Unityでレベルアップ機能を作る(プロジェクト作成からUI連動まで完全解説)
Unityで「ゲームっぽい動き」が見えてくる最初のポイントは、
- データを持つ
- 操作で変わる
- 画面に反映される
この3つをつなぐことです。
今回は最初から丁寧に、
プロジェクト作成 → レベルアップ → UI表示
までを一気に通します。
このチュートリアルの見方
表面は「ボタンを押したらレベルが上がる」という超シンプルな内容ですが、実はかなり多くの概念が詰め込まれています。
具体的に言うと:
責務の分離(SRP) Statusはデータだけ、LevelUIは表示と操作だけ、という分け方はSOLID原則のSingle Responsibility Principleそのものです。初心者向けの記事でありながら、プロが現場で意識する設計の基本を自然に体験させています。
依存の方向性 LevelUIがStatusを参照する一方向の依存になっており、StatusはUIのことを一切知らない。これはMVCやMVPパターンの考え方の土台です。「UIが直接データを書き換えない」という一文に、その思想が凝縮されています。
Inspectorによる依存注入 publicフィールドでドラッグ&ドロップする設計は、実はDI(依存性注入)の概念を手作業で体験させています。コードでnewするのではなく外から注入するという発想が、自然と身につく構造です。
拡張性の予告 記事末尾の「HPバー・経験値・スキル・UI更新すべてにつながります」という一文は、この構成がそのままゲーム全体のアーキテクチャに発展できることを示唆しています。
つまりこの記事、初心者が「動いた!」と感じながら、気づかないうちに設計の文法を体にインストールされる構造になっています。
クラス図(責務の分離)

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

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

今回の完成イメージ

Level Upボタンを押すと、Levelが1つずつアップします
記事の流れまとめ
- プロジェクト作成 — Unity Hubで
LevelUpSampleという名前で作成 - Playerオブジェクト — Hierarchyに空のGameObjectを作成
- Status.cs —
int LevelフィールドとLevelUp()メソッドを持つシンプルなスクリプト - Canvas + TextMeshPro —
LevelTextでレベル表示 - Button —
LevelUpButtonを作成 - LevelUI.cs —
Statusへの参照とTextMeshProUGUIへの参照を持ち、ボタン押下でLevelUp()を呼んでUIを更新 - Inspector設定 — ドラッグ&ドロップで参照を繋ぐ
- ボタンのOnClick登録 —
OnClickLevelUp()を登録
設計の肝として「UIが直接データを書き換えない」という分離設計(Status = データ、LevelUI = 表示と操作)を明示的に構成されている点が挙げられます。
① プロジェクトを作る
Unity Hubを開きます。
手順
- 「新しいプロジェクト」
- テンプレートは 2D(または3D)
- プロジェクト名: LevelUpSample
- 保存場所を選択
- 作成
プロジェクト名の考え方(重要)
名前は適当につけがちですが、実務では重要です。
今回なら:
- 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




ディスカッション
コメント一覧
まだ、コメントがありません