現場レベルのゲーム制作が、すべてここで学べます。
この記事はUnityとC#でノンフィールドRPGを作る講座の第14回です。
前回はゲームオーバー時のリザルトシーンを作成しました。
前回の記事:

第14回ではプレイデータのオートセーブシステムやロード処理を作ります。
また、キャラクター強化画面の作成を行います。今回でノンフィールドRPGは一旦完成するのであと一息です!がんばっていきましょう!
ゲームプレイデータのセーブ・ロードシステムを作る
このゲームはスマホで遊べるハクスラ周回型のノンフィールドローグライクRPGです。
キャラクター強化した結果を保存するためでもありますが、スマホでプレイする現代人はいつでもプレイをやめて気軽に再開したいものです。
ここでは、そうしたゲームプレイの進行状況をセーブ(保存)・ロード(読込)する機能をGameManagerに実装します。
GameManager.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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
using UnityEngine; using UnityEngine.SceneManagement;// ここに追加 public enum SceneCode { Title, Dungeon, Battle, Result, // Endから変更。Sceneファイル名に合わせました。 //Start 不要(この行は削除してもらっても構いません) } public class GameManager : MonoBehaviour { public static GameManager Instance;// 静的な変数 public PlayRecord PlayRecord;// プレイデータ public EnemyData EnemyData;// 敵キャラデータ // 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()); } // 戦闘に勝利したら呼び出す public void BattleWon() { PlayRecord.EnemyStatus = null; LoadScene(SceneCode.Dungeon); } // 戦闘に敗北したら呼び出す public void BattleLost() { PlayRecord.EnemyStatus = null; LoadScene(SceneCode.Result); } public void Save() { string json = JsonUtility.ToJson(PlayRecord);// PlayRecordをシリアライズする PlayerPrefs.SetString(Application.productName, json);// アプリ名をキーにして保存する } public void Load() { string json = PlayerPrefs.GetString(Application.productName);// 保存している文字列を取得 if (string.IsNullOrEmpty(json)) { // 文字列がnullか空白の場合は保存データがない(新規プレイ) PlayRecord = new PlayRecord(); PlayRecord.InitStatus(); } else { // 文字列を取得できたらPlayRecordクラスにデシリアライズしてPlayRecordに代入する PlayRecord = JsonUtility.FromJson<PlayRecord>(json); } } } |
セーブについて
JsonUtility.ToJsonはC#のオブジェクト(実体化されたクラスなど)をJSON形式の文字列に変換するために使われます。
また、PlayerPrefs.SetStringはキーと値のペアでデータを端末に保存するために使われます。
今回はUnityに登録しているアプリ名(Application.productName)をキーとして、PlayRecord変数の内容を文字列にして保存しています。
ロードについて
PlayerPrefs.GetStringはキーを指定して端末に保存されている文字列データを読み込むために使われます。
JsonUtility.FromJsonは、JSON形式の文字列をC#のオブジェクトに変換するために使われます。
今回はUnityに登録しているアプリ名(Application.productName)をキーとして、文字列を取得し、PlayRecordクラスに変換してGameManagerのPlayRecord変数に代入しています。
タイトルシーンにステータス強化UIを作成する
ここからはキャラクターステータス強化UIを作成していきます。[Assets]→[Scenes]にある[Title]をダブルクリックしてタイトルシーンを開きます。
タイトルシーンからスタートしたとき、ポイントを取得していた場合に表示する主人公強化UIを作成します。
HierarchyビューにあるCanvasオブジェクトを右クリックし、[UI]→[Panel]をクリックします。
名前を「Point」に変更します。

PointオブジェクトのImageコンポーネントのSource Imageを[Asset/Gui_parts/bar_ready]に変更し、Colorのアルファ値を255に変更して不透明にします。

これでPointパネルが表示されてる間はタイトルシーンの後ろの画面が表示されなくなりました。
このPointパネルをステータス強化画面にしていきます。
初期レベルを上げるUIを作成
このゲームではレベルが上がるとHPや攻撃力などが上がります。初期レベルが高いとそれだけ冒険を有利に進められます。ここではそんな初期レベルの強化を行うためのUIを作成します。
Pointオブジェクトを右クリックし、[UI]→[Image]をクリックします。名前を「Level」に変更します。

下の画像のとおり変更します。ImageコンポーネントのSource Imageは[Asset/Gui_parts/button_frame]に変更します。

Levelオブジェクトを右クリックし、[UI]→[Text – TextMeshPro]をクリックしてテキストオブジェクトを2つ作成します。名前はそれぞれ「Caption」と「Value」にします。

それぞれのInspectorウィンドウを開き、下の画像のとおり変更します。

ここまで設定できると以下のような画面になっているはずです。

それでは続いてステータス強化UIを作っていきます。
強化ボタンの作成
Levelオブジェクトを右クリックし、[UI]→[Button – TextMeshPro]をクリックします。

Buttonオブジェクトをクリックして、Inspectorビューを開き下の画像のとおり変更します。
ImageコンポーネントのSource Imageは[Asset/Gui_parts/button]に変更します。

さらにButtonオブジェクトを展開して、子オブジェクトのText(TMP)のInspectorビューを開き、下の画像のとおり変更します。

ここまで設定すると以下のような画面になります。

初期の食料保有量を強化するUIを作成
この食料がダンジョン内進行や戦闘時の行動回数になります。そのため、初期の食料が多いとそれだけ多く行動を行え、深い階層まで進行することができます。
さきほど作成した初期レベル強化UIをコピーして、初期の食料保有量を強化UIも作成します。
Levelオブジェクトを右クリックし、[Duplicate]をクリックして複製し、名前を「Food」に変更します。

FoodオブジェクトのInspectorビューを開いて、下の画像のとおり変更します。

Foodオブジェクトを展開して、CaptionオブジェクトのTextMeshProコンポーネントを下の画像のとおり変更します。

所有ポイントの表示UI
最後に冒険で取得したポイントの残りを表示するUIを作成します。これもFoodオブジェクトを複製して作成します。
Foodオブジェクトを右クリックし、[Duplicate]をクリックして複製し、名前を「Point」に変更します(後で気付きましたが親のPanelオブジェクトもPointになっていました。名称が被っていてややこしくて申し訳ないです)。

PointオブジェクトのInspectorビューを開いて、下の画像のとおり変更します。
ImageコンポーネントのSource Imageは[Asset/Gui_parts/name_bar2]に変更します。

Pointオブジェクトを展開して、子オブジェクトのCaptionオブジェクトのTextMeshProコンポーネントを下の画像のとおり変更します。

同じく子オブジェクトのValueオブジェクトのTextMeshProコンポーネントを下の画像のとおり変更します。

探索開始ボタンに変更する
複製して作成したPointオブジェクトの子オブジェクトになっている、Buttonオブジェクトを下の画像のように変更します。
ImageコンポーネントのSource Imageは[Asset/Gui_parts/button_ready_on]に変更します

Buttonオブジェクトの子オブジェクトになっているTextMeshProコンポーネントを下の画像のとおり変更します。

ここまで設定を終えると以下のような画面になります。

タイトルシーンで強化UIの操作とデータのロード
ここではタイトルシーンで強化UIが表示されるようにします。
また、強化するときに使用する定数を追加します。
まとめ

今回はタイトルシーンでポイントを使って主人公を強化するUIを作成、そしてデータのセーブとロードを実装しました。
「HATENAKI DUNGEON」はこれで完成となります。
おめでとうございます!
今後またこの講座をさらに応用し、より本格的なゲームにしていく講座を追加していくかもしれませんが、ひとまず完成です。
最後まで読んでいただきありがとうございました。あなたのオリジナルRPG制作のお役に立ててたら幸いです。
現場レベルのゲーム制作が、すべてここで学べます。






コメント