i-school - おはじきゲーム 手順11
 以下の内容で順番に実装を進めていきます。

手順11 −GameDataクラスを作成−
21.ゲームデータを管理するGameDataスクリプトをシングルトンとして作成する



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

・シングルトンデザインパターン
・DontDestroyOnLoadメソッド



21.ゲームデータを管理するGameDataスクリプトをシングルトンとして作成する

<シングルトンデザインパターン>


 シングルトンとは、数多くあるデザインパターンの1つです。そのクラスのインスタンスが必ず1つであることを保証するデザインパターンのことを言います。

 GameDataクラスでは、このシングルトンを採用しています。つまり、ゲーム中を通じて、このGameDataクラスが1つしか存在できないようになります。
実装例は複数ありますが、一番読みやすい方式で記述しています。

 このシングルトンによってインスタンスが1つか生成されないことが保証されますので、このGameDataクラスへの参照は、いずれのクラスからであっても変数を介さずに参照を行えるようになります。

 例えば、Enemyというクラスがあり、そのEmenyクラスを持つゲームオブジェクトが5つあった場合、「どの」Enemyクラスであるかを確定できないと、対象となるEnemyクラスへは参照できません。
そのため、Enemy型の変数を用意して、その変数へ参照したいEnemyクラスを代入することによって、はじめてEnemyクラスの情報を扱うことができるようになります。

 ですがシングルトンであるGameDataの場合には、このインスタンスは常に1つしかないことが保証されていますので、「どの」という指定の部分が不要になります。
つまり変数への代入が不要になります。GameDataという指定はすなわち、自動的にただ1つのGameDataへの参照が行われます。

 この機能を利用してGameDataスクリプトを作成しておくことで、どのクラスからでも参照しやすい設計にしておきます。


GameDataスクリプトを作成する


 宣言フィールドには、手球の残数を管理するための charaBallHp 変数を用意します。値はインスペクターから設定できるように public で宣言しておきます。

 static 変数として GameData 型の instance 変数を用意します。この中にGameDataクラス自身を代入出来るようにすることで、シングルトンにします。

 またDontDestroyOnLoadメソッドを一緒に活用することにより、シーン遷移しても破棄されないようにします。


GameData.cs

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



<DontDestroyOnLoadメソッド>


 新しいシーンをロードして遷移をするときに、引数で指定している対象のゲームオブジェクトについては破棄しないようにするメソッドです。
そのため次のシーンに遷移しても、このスクリプトがアタッチされているゲームオブジェクトは前のシーンから破棄されずに残り続けます。

 多くの場合、今回のようにシングルトンクラスで一緒に利用され、スクリプトがアタッチされているゲームオブジェクト自身を対象に取ります。(アタッチされているゲームオブジェクトが破棄されなくなる)

  DontDestroyOnLoad(gameObject);

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


GameDataゲームオブジェクトを作成し、GameDataスクリプトをアタッチする


 ヒエラルキーに空のゲームオブジェクトを1つ作成し、名前を GameData に変更します。このゲームオブジェクトはCanvasの外で問題ありません。


ヒエラルキー画像



 GameData ゲームオブジェクトに作成した GameData スクリプトをドラッグアンドドロップしてアタッチします。
GameData ゲームオブジェクトを選択してインスペクターで GameData スクリプトがアタッチされているかを確認します。


GameDataゲームオブジェクトのインスペクター画像 GameDataスクリプト


 
 CharaBallHp 変数が設定できます。この数がゲーム内での手球の残数になりますので、値を 0 => 3 に変更してください。


設定後のインスペクター画像



シングルトンクラスの参照


 変数への代入が不要でインスタンスへの参照ができるのがシングルトンクラスの特徴です。
呼び出す場合には次の書式で命令が出来ます。

 GameData.instance.charaBallHp;

 記法には規則があります。

  [class名].[classの代入されている public static 変数].public 変数/ public メソッド

 先ほどの命令文も、この記述に沿った規則でピリオドの位置ごとに命令されています。




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