現場レベルのゲーム制作が、すべてここで学べます。
この記事はノンフィールドRPGの作り方講座の第6回です。
前回はダンジョンシーンのオブジェクト配置とプレイデータ管理用のクラス作成を行いました。
前回の記事:

第6回ではダンジョンでの前進処理やUI表示の処理を実装していきます。前回までに作ったパーツを組み合わせて実際にUnity上で動くようにしていきましょう!
プレイデータを作成してGameManagerで管理する
前回作成したゲームプレイデータを表現するPlayRecordクラスを作成しました。このクラスを使ってGameManagerで実際にゲームプレイデータを管理してみましょう。
ゲームのプレイデータをGameManagerクラス内で作成しておきます。このゲームではセーブ・ロード機能を実装することになりますが、ここではまず仮のデータを作成しています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
using UnityEngine; using UnityEngine.SceneManagement;// ここに追加 public enum SceneCode { Title, Dungeon, Battle, End, Start } public class GameManager : MonoBehaviour { public static GameManager Instance;// 静的な変数 public PlayRecord PlayRecord;// プレイデータ // Startメソッドより先に呼び出される private void Awake() { if (Instance == null) { Instance = this;// 実体化されたらいつでもアクセス可能 DontDestroyOnLoad(gameObject);// シーンをまたいでもオブジェクトは消えない PlayRecord = new PlayRecord();// プレイデータを作成しておく(仮) PlayRecord.InitStatus();// プレイデータの初期化 } else { Destroy(gameObject);// すでに存在していたら削除 } } // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { } // Update is called once per frame void Update() { } public static void LoadScene(SceneCode sceneCode) { SceneManager.LoadScene(sceneCode.ToString()); } } |
これでプレイデータ(実体化されたPlayRecordクラス)にはGameManager.Instance.PlayRecordからアクセスすることができます。
ダンジョンシーンの処理を行うスクリプトとオブジェクト
ダンジョンシーン全体の処理を行うDungeonDirectorスクリプトを作成し、このスクリプトをアタッチするためのオブジェクトを作成します。


Hierarchyビューを右クリックして、[Create Empty]をクリックして空のオブジェクトを作成します。オブジェクトの名前は「Director」とします。

HierarchyビューにあるDirectorオブジェクトを選択してInspectorビューを表示します。

一番下にある[Add Component]をクリックし、検索バーに”Dungeon”と入力します(”DungeonDirector”まで入力しても可)。表示される一覧の中に「Dungeon Director」が表示されるのでクリックしてアタッチします。
スクリプトの中身は後ほど作成します。
ステータスウィンドウの処理を行うスクリプトを新規作成
ステータスウィンドウに主人公の状態を表示するためのスクリプトを作成します。


HierarchyビューにあるCanvasオブジェクトの子オブジェクトになっているStatusオブジェクトを選択してInspectorビューを表示します。

一番下にある[Add Component]をクリックし、検索バーにStatusWindowと入力します。表示される一覧の中に「Status Window Controller」が表示されるのでクリックしてアタッチします。
ステータスウィンドウの更新処理-レベル・HP・階層・食糧の数値変化をUIに反映させる機能-を実装
ステータスウィンドウにLevel、HP、階層、残りの食料を表示する処理を実装します。文字列補間を使って文字列を置き換えて表示します。
文字列補完とは文字列中に変数や式を埋め込む便利な機能です。以下のような書き方をします。
|
1 |
$"テキスト {変数} または {式}" |
スクリプトの可読性が高まる書き方なのでここでマスターしておきましょう。
StatusWindowController.cs
以下のようにスクリプトの中身を記述します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
using UnityEngine; using TMPro;// TextMeshProの機能を使うために必要 public class StatusWindowController : MonoBehaviour { public TextMeshProUGUI LevelText; public TextMeshProUGUI HPText; public TextMeshProUGUI FloorText; public TextMeshProUGUI FoodText; // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { } // Update is called once per frame void Update() { } // キャラクターのステータス情報を更新する public void UpdateUnitStatus(UnitStatus unitStatus) { if (LevelText != null)// アタッチされていなかったら処理しない { LevelText.text = $"LV {unitStatus.Level}";// レベルの表示 } if (HPText != null) { HPText.text = $"HP {unitStatus.HP} / {unitStatus.GetMaxHP()}";// HPと最大HPの表示 } } // ダンジョンのステータス情報を更新する public void UpdateDungeonStatus(DungeonStatus dungeonStatus) { if (FloorText != null) { FloorText.text = $"{dungeonStatus.Floor}F"; } if (FoodText != null) { FoodText.text = $"食料{dungeonStatus.Food}"; } } } |
このスクリプトでは、ゲームのUI(ユーザーインターフェース)にキャラクターおよびダンジョンのステータス情報を表示・更新する処理を実装しています。
例えば戦闘で攻撃を受けたり、ダンジョン探索で食料が減ったりしたときに、ここで実装したメソッドを呼び出せば数値の変化をUIに反映させることができます。
最初にusing文で使用するライブラリの定義を行います。TextMeshProを操作するときはTMProをusingします。
次に、キャラクターとダンジョンのステータス情報更新処理を実装しています。
構造はほぼ同じでTextMeshProオブジェクトにちゃんとコンポーネントをアタッチできているかのチェックを行い、ちゃんとオブジェクトがアタッチされていれば文字列表示処理を行うようにしています。
if (LevelText != null) { ~(実際の処理)~ }
こうした書き方をnullチェックといいます。UnityのインスペクターでUIコンポーネントの紐づけミスを事前に防いでくれます。
ステータスウィンドウのテキストオブジェクトをアタッチする
StatusWindowControllerの変数とUIオブジェクトを接続するためにアタッチします。

HierarchyビューにあるStatusオブジェクトをクリックしてInspetorビューを表示します。

各テキストオブジェクトをStatusWindowControllerスクリプトに、ドラッグアンドドロップでアタッチします。
ステータスウィンドウをプレハブにする
ステータスウィンドウはバトルシーンでも使うため、ここでプレハブにしておきます。
Canvasの子オブジェクトになっているStatusオブジェクトを、[Assets/Prefabs]フォルダにドラッグアンドドロップします。
プレハブ化できるとHierarchyビューのStatusオブジェクトの文字が青色になります。

ダンジョンを管理するスクリプトDungeonDirector.csを実装しよう
DungeonDirectorクラスはダンジョンシーンを管理するクラスです。
このゲームでは前提としてタイトル画面から始まるようになっていて初期化などもタイトル画面で行います。
そのため、Unityでの開発中の処理としてGameManagerクラスが実体化されていない、すなわちタイトル画面から始まっていない場合はタイトル画面に遷移するようにします。
Updateメソッドを使用する予定がないためコメントアウトしておきます。削除しても良いのですが、今後演出などで使用する可能性があるので念のためコメントアウトしておきます。
DungeonDirector.cs
まとめ

今回はダンジョンシーンのUIステータス更新処理とダンジョンの前進処理の実装を行いました。前進ボタンを押すことでダンジョンの階層を進み、食料が減る機能も制作できました。
次回はさらにダンジョンシーンでの機能実装を進めていきます。休憩ボタンの処理や前進したときにカメラを移動させる演出面を強化する処理を実装します。
次の記事:

現場レベルのゲーム制作が、すべてここで学べます。






コメント