Unityに関連する記事です

 以下の内容で順番に実装を進めていきます。

手順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 メソッド

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




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

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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