Unityに関連する記事です

 1回のプレイですべてのゲーム内容をクリアすることが難しいため、多くのゲームにはユーザー情報をセーブ・ロードする機能が備わっています。

 今回より3回の手順に分けて、ゲーム内で取得した必要な情報をセーブ・ロードするための機能 を実装します。
処理の実装にあたっては、Unity や C# の用意している機能を活用することで実装を行うように設計しています。



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



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

 ・PlayerPrefs クラスと各メソッド  Set〜 メソッド、Save メソッド、Get〜 メソッドー



1.設計


 繰り返しゲームをプレイしてクリアを目指すために、必要な情報を精査して、セーブ・ロードする対象の変数を決めておきます。

 今回は最初に、クリアポイント、すなわち、GameData クラスの totalClearPoint 変数の値をセーブしておいて、
ゲームを再開した際に、クリアポイントをロードして復元できるようにします。

 Unity にはセーブ・ロード機能を提供するための PlayerPrefs(プレイヤープレフス) クラスが用意されています。
セーブ・ロードの機能についてはオフライン(サーバーを利用しない)で、Unity Editor であれば PC 内、スマホの場合であれば端末内にセーブデータを保持するようにします。


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


 Unity の用意している PlayerPrefs(プレイヤープレフス) クラスを利用することで実装を行います。

 PlayerPrefs でセーブとロード機能を利用するためには、セーブ・ロードに利用する Key を設定する必要があります。
Key とはいわばラベル・保存用の名前のことです。これは string 型の情報で自由に作成します。
つまり、Key(名前)と変数をセットでセーブ しておいて、Key(名前)でセーブされているデータを検索してロードを行う 仕組みになっています。

 今回は、Key 用の変数と、クリアポイントをセーブ・ロードするメソッドを作成しています。
また、Awake メソッドを利用して、デバッグを行うように機能を実装しています。


GameData.cs

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


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


<PlayerPrefs クラスと各メソッド  Set〜 メソッド、Save メソッド、Get〜 メソッドー>


 Unity ではデータのセーブ・ロードを行うための PlayerPrefs クラスが用意されています。
PlayerPrefs クラスにはセーブ・ロード用のメソッドや、データの確認メソッド、削除用のメソッドなどが用意されていますので、
こちらを実装することで指定したデータをセーブしたり、ロードしたりすることが可能になっています。

 データの保存先は、Unity Editor や PC ゲームの場合には PC 本体のハードディスク、Web の場合はブラウザ内、スマホ端末の場合にはアプリ内のデータの場所内です。


<PlayerPrefs クラス>
https://docs.unity3d.com/ja/current/ScriptReferenc...


 2つのメソッドを利用してセーブを行います ので、順番に説明します。


1.Set〜 メソッド

 Key という文字列を保存する際の識別子として指定し、その名前を用いて指定された型の情報をセーブするための準備(予約)を行います。
Key とはいわばセーブ用のラベルであり、名前を付けて保存のことです。この Key の情報をロードする際にも利用します。

 PlayerPrefs クラスにはセーブの方法が3種類用意されており、Set 〜 で始まる命名規則になっています。今回利用している SetInt メソッドもその1つです。
SetInt という名前の通り、int 型の情報をセーブしておくことが出来ます。残る2つは SetString メソッド、SetFloat メソッドであり、これらもメソッド名と同名の型の情報をセーブします。

 今回セーブしたい情報は GameData クラスの int 型の totalClearPoint 変数です。
int 型の情報であれば SetInt メソッドを実行することで、セーブの準備(予約)ができます。

 PlayerPrefs.SetInt(CLEAR_POINT_KEY, totalClearPoint);

 SetInt メソッドの第1引数が Key になります。メソッドの引数で届いている key の情報をそのまま利用しています。

 SetInt メソッドの第2引数がセーブされる値(int 型)になります。

 Set 〜 で始まる3つのメソッドは、セーブを行う対象を設定しています。そのため セーブするための情報をセットして準備を行うメソッド です。
実際には次に解説する Save メソッドを実行することでデータがセーブされます。


参考サイト
Unity公式スクリプトリファレンス
PlayerPrefs.SetString
https://docs.unity3d.com/ja/current/ScriptReferenc...


2.Save メソッド

 Set 〜 メソッドによって準備された情報をセーブするメソッドです。
この処理が実行されて始めてデータがセーブされます

 Save メソッドよりも前に、複数の Set 〜 メソッドが実行されていた場合、この Save メソッドはそれらすべての Set 〜 メソッドのセーブを行います

  // セーブするための準備・セット
  PlayerPrefs.SetInt(CLEAR_POINT_KEY, totalClearPoint);

 // セーブ実行
 PlayerPrefs.Save();

 今回の場合には、int 型の整数の情報をセーブしています。


参考サイト
Unity公式スクリプトリファレンス
PlayerPrefs.Save
https://docs.unity3d.com/ja/current/ScriptReferenc...


3.Get〜 メソッド

 PlayerPrefs クラスに用意されている、ロード用のメソッドです。Set 〜 メソッドに対応できるように、こちらにも3つのメソッドが用意されています。
今回は SetInt メソッドで int 型の情報をセーブしていますので、ロードする場合には、GetInt メソッドを利用して行います。

 Get 〜 メソッドの第1引数には、Key を指定します。
PlayerPrefs 内にセーブされている Key が存在しているかを検索・照合し、Key が存在している場合、その情報を指定した型で取得するメソッドです。
取得した値は戻り値として提供されます。そのため、Get 〜 メソッドを実行する場合には、左辺に戻り値を受け取るための変数を準備しておく必要があります
今回は、GetInt メソッドですので、セーブされている Key が存在している場合には、int 型で取得、つまりロードを行う処理になります。

 Get 〜 メソッドは第2引数を設定することで、もしも Key が存在しなかった場合には、第2引数に指定した値を Default 値として設定を行うことも出来ます。

 // Key を利用してロードを行い、戻り値を代入
  totalClearPoint = PlayerPrefs.GetInt(CLEAR_POINT_KEY, 0);

 GetInt メソッドで取得した情報は int 型ですので、その値が totalClearPoint 変数に代入されることで、ロード処理を完了しています。
第2引数に 0 を設定していますので、万が一、 Key の情報がセーブされていない場合には、 0 を代入する処理を行います。

参考サイト
Unity公式スクリプトリファレンス
PlayerPrefs.GetString
https://docs.unity3d.com/ja/current/ScriptReferenc...


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


 GameData クラスの Awake メソッド内のデバッグの処理を活用して、デバッグを行います。

 まずは最初に SaveClearPoint メソッドのコメントアウトを解除します。
ゲームを実行すると、このメソッドが動いてセーブが実行されますので、問題なくセーブが動作するかを確認してください。
SaveClearPoint メソッドが実行されると、メソッド内にある Dubug.Log メソッドが実行されます。
Console ビューにて、SaveClearPoint メソッド内の動作の確認を行いましょう。

 つぎに、SaveClearPoint メソッドをコメントアウトして、LoadClearPoint メソッドのコメントアウトを解除します。
ゲームを実行すると、セーブされている情報がある場合には、ロード処理が実行されて、ゲーム開始と同時に totalClearPoint 変数に値が代入されます。

 totalClearPoint 変数の値を変更して、何回もゲームの起動と終了を繰り返し、正常に動作しているかを確認しておきます



 一度セーブされると、その Key でのデータが保持されたままになりますので、
セーブデータのないフラットな状態からデバッグを開始したい場合には、Unity エディターの Edit => Clear All PlayerPrefs を選択してセーブデータを削除して試してください。

 デバッグを効率よく行うことは、ゲーム開発を行う上で重要な要素になります。
また処理の内容によってはゲーム画面上で確認できない情報があります。そういった情報に関しては、Debug.Log メソッドを活用して、処理が内部的に実行されているかどうかを確認することも大切です。


<考えよう!> セーブするタイミングを決めて、セーブを実行する処理の実装に挑戦する


 クリアポイントのセーブとロードの処理のデバッグが無事に終了したら、次は、どのタイミングでクリアポイントのセーブを行うのかを考えて、
その部分に SaveClearPoint メソッドを実行する処理を実装する必要があります。

 SaveClearPoint メソッドは GameData クラス内のメソッドですので、いずれのクラスからでもアクセスできます

 クリアポイントをセーブするタイミングを考えて、処理を実装してみてください。

 ヒントですが、クリアポイントは常時増減する値ではなくて、特定のタイミングで加算・減算を行う値です。
つまり、セーブを行うタイミングも、それに合わせることが出来ればいいのではないでしょうか。

 そのため、まずは、クリアポイントの加算・減算している処理の部分を見直してみましょう
逆に考えると、Update メソッドのような、常時動作を行っている部分にセーブの処理を実装する必要はないということにもなります。
毎フレーム、セーブを行っていたら、非常に動作の大変重い処理になってしまいます。

 こういった処理の実装には、いつも自分が遊んでいるゲームのセーブのタイミングなども参考になります。


<考えよう!> ロードするタイミングを決めて、ロードを実行する処理の実装に挑戦する


 セーブをするタイミングを設定、処理を実装することができたら、次はロードを行うタイミングも考えて実装に挑戦してください。

 こちらは、ゲーム開始のタイミングでよいと思われますので、あとは、どのクラスに処理を実装すれば管理が行いやすいかを検討して実装してみてください


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


 実際にセーブとロードが設定したタイミングで実行されるかを確認しましょう。
その場合には、GameData クラスの Awake メソッド内に記述したデバッグ用の処理はコメントアウトしてから、デバッグを行うようにしてください。



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

 次は 発展22 ーセーブ・ロード機能の実装◆ です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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