Unityに関連する記事です

 最後のセーブ・ロードの手順になります。

 ただし、すでにセーブ・ロードが必要な情報に関しての機能自体は完成していますので、この手順では前回の手順と合わせて、さらにワンランク上の応用処理の実装を目標としています
よって スクリプトを見直してリファクタリングする内容 になります。そのため、難しい処理が多く出てきますので、いますぐに実装を行わなくても問題ありません



発展24 ーセーブ・ロード機能の実装ぁ

 新しい学習内容は、以下の通りです。

 ・ローカル関数



1.設計


 先ほどの手順で作成した PlayerPrefsHelper クラスを活用し、セーブ用の情報を1つのクラスとして管理し、
それを JsonUtility クラスを活用してセーブとロードを行う処理にリファクタリングを行います。

 GameData クラス内に入れ子クラスとして、セーブしたい情報をまとめるためのクラスを作成し、セーブする前に new してクラスのインスタンスを作成します。
(入れ子クラスではなく、1つのクラスとして作成しても構いません)
その際に、クリアポイント、クリアしたステージの情報、所持している武器の情報などの、セーブしておきたい情報をクラス内に設定し、それを一括でセーブする対象とします。

 ロードも同様で、セーブしておきたい情報のクラスとしてロードを行い、その後、クラス内にあるクリアポイントなどの値を各変数に代入して設定します。


2.GameData スクリプトを修正する


 既存のセーブ・ロード関連の処理をコメントアウトして、新しい処理に書き替えます。
修正箇所や追加する箇所、新しい処理が多いので、ゆっくりと、処理の内容を理解しながら進めましょう。


GameData.cs

<= クリックすると開きます


 スクリプトを修正したらセーブを行います。


3.<ローカル関数>


 メソッド内には、修飾子を持たないメソッドを入れ子として宣言(作成)することができます。
このような 入れ子になっているプライベートなメソッドをローカル関数 といいます。

<参考サイト>
MicroSoft
ローカル関数(C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/pro...



 ローカル関数は、入れ子として宣言しているメソッド(親メソッド)内でのみ、呼び出しの命令が可能です。

 利用する主なケースとしては、クラス内での呼び出し命令が1つであるメソッド(1箇所からしか呼び出し命令がないメソッド)がローカル関数として宣言するメソッドの対象となります。
また、ローカル関数は処理を隠蔽することにもなりますので、通常のメソッドよりも内部的な処理を記述することができ、スコープが短くなることで、エラーの特定が早い段階で判断できるようになります。

 今回は、Initialize メソッドを Awake メソッド内に宣言して作成しています。
つまり、Awake メソッドが親メソッドInitialize メソッドが入れ子メソッドです。
そのため、この Initialize メソッドは、Awake メソッド内からのみ、呼び出し命令を行うことができます。

 本来 Initialize メソッドは、普通のメソッドのように記述できますが、すべての処理を書いてから精査した際、
呼び出し命令が Awake メソッドからしかないため、ローカル関数として宣言しています。

 ローカル関数は、呼び出し命令と、関数を宣言している場所が同じメソッド内にあるため、
より処理をコンパクトにまとめて、スコープを狭くすることで、見やすく、管理しやすいメソッドとして機能しています。


<ローカル関数>
void Awake() {

    if (instance == null) {
        instance = this;
        DontDestroyOnLoad(gameObject);
    } else {
        Destroy(gameObject);
    }

    //ユーザーデータの初期化(呼び出し命令のすぐ下に、呼び出されているローカル関数があるので、処理が追いやすい)
    Initialize();

    // ユーザーデータの初期化用のローカル関数
    void Initialize() {

        // SaveData がセーブされているか確認
        if (PlayerPrefsHelper.ExistsData(SAVE_KEY)) {
            // セーブされている場合のみロード
            GetSaveData();

        } else {
            // セーブされていなければ初期値設定
            totalClearPoint = 0;

            if (!clearStageNoList.Contains(0)) {
                clearStageNoList.Add(0);
            }

            if (!weaponDatasList.Contains(0)) {
                weaponDatasList.Add(0);
            }
        }
    }
}


4.ゲームを実行して動作を確認する


 セーブ・ロード処理のリファクタリングが終了しましたので、ゲームを実行して、セーブ・ロードを行ってみてください。
いままでと同じようにセーブ・ロードが行われていれば、リファクタリングは成功です。
 


 以上でこの手順は終了です。

 次は 発展25 ー照準器機能の追加− です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます