Unityに関連する記事です

 引き続き、探索イベントの実装を行っていきます。
この手順では、探索イベントの獲得情報をセーブとロードの処理を実装出来るようになります。

 セーブとロードについては考え方が異なりますので、それぞれに手順を分けて実装を行っていきます。
またロードの方は関連する処理が多くなりますので、どの部分に影響を及ぼすのかを考えて設計していく必要があります。


<実装動画 セーブ ヽ容世靴進箱が消えないで画像が切り替わるパターン>
動画ファイルへのリンク


<実装動画 セーブ◆ヽ容世靴進箱が消えるパターン>
動画ファイルへのリンク


<実装動画 ロード ヽ容世靴進箱が消えないで画像が切り替わるパターン>
動画ファイルへのリンク


<実装動画 ロード◆ヽ容世靴進箱が消えるパターン>
動画ファイルへのリンク



手順27 ー獲得した探索イベントのセーブとロード機能の実装ー
47.GameData スクリプト、DialogController スクリプトを修正し、探索イベントの情報をセーブする処理を追加する
48.DataBaseManager スクリプト、GameData スクリプト、TreasureBox スクリプトを修正し、GameManager スクリプトを作成して、探索イベントの情報をロードする処理を追加する



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

 ・シーン遷移時の注意点



47.GameData スクリプト、DialogController スクリプトを修正し、探索イベントの情報をセーブする処理を追加する

1.設計

 前回の手順で GameData クラスに準備をした獲得した探索イベントの番号のリスト(getSearchEventNumsList 変数)の情報をセーブする機能を実装します。

 セーブしたい情報は判明していますので、この値を実際にセーブするための処理をメソッドにまとめ、そのメソッドを適宜なタイミングで呼び出す処理を考えていきましょう。

 


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


 セーブ用の Key (名前を付けて保存するためのラベル)と、セーブ用の処理をメソッドとして追加します。
終了した探索イベントを1つずつ指定してセーブするメソッドと、終了している探索イベントをまとめてセーブするメソッドの2つを準備しておきます。


GameData.cs

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


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


 

3.DialogController スクリプトを修正する


 獲得した宝箱の通し番号の情報を GameData クラスに用意したメソッドを利用して、セーブを行うようにします。
合わせて、獲得したアイテムのインベントリの情報も一緒にセーブするようにします。

 どちらも TODO で記述してありますので、まずは自分で処理を記述できるか挑戦してください。
どのメソッドを実行すれば、それぞれの情報のセーブが行えるのか、GameData クラスを確認しながら書いてみましょう。


DialogController.cs

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


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


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


 処理の全容をしっかりつかんでから、どの部分をデバッグするのか把握した上でゲームを実行して確認を行っていきましょう。
最初に観ている動画は完成しているセーブ動画ですが、今はまだ画像の差し替え処理はありませんので、ここまでの実装では宝箱を獲得しても画像は変わりませんし、消えません。


<実装動画>
動画ファイルへのリンク


 どのような処理があれば、獲得した宝箱の画像が変わるようになるのか、そういった部分も考えていただくと学習が深まります。
実装できた、動いた、では学習になりませんので、繰り返し処理を読み解いて、自分の中で理解をしていくことが大切です。
先に進むことは重要ではありません。


48.DataBaseManager スクリプト、GameData スクリプト、TreasureBox スクリプトを修正し、GameManager スクリプトを作成して、探索イベントの情報をロードする処理を追加する

1.設計


 3つの手順に分かれていますので、順番に実装していきます。

 GameData クラスにセーブされている List の値をロードする処理をメソッドとして用意します。
ロードにあたり、ゲーム内にいくつの EventData の情報が登録されているのかを判断する必要があり、
登録されている数は、EventDataSO スクリプタブル・オブジェクトの要素数の最大値と同じです。

 ただし、現在はまだその情報を参照するためのメソッドがありません。

 EventDataSO スクリプタブル・オブジェクトは DataBaseManager クラス内で管理されていますので、GameData クラスでのセーブ処理を記述するための準備として、
DataBaseManager クラスに EventDataSO スクリプタブル・オブジェクトの要素数の最大値を参照するためのゲッター・メソッドを作成します。

 このメソッドがあることによって GameData クラス内に DataBaseManager クラスにある EventDataSO スクリプタブル・オブジェクトの要素数の最大値を参照できるようになりますので、
ここで始めて、この情報を用いてセーブ用のメソッドを記述できるようになります。

 ここまでが1つの手順です。
この処理を実装することによって、ロード用のメソッドを呼び出すことで、獲得している探索イベントの番号の List をロードすることが出来ます。



 つづいてもう1つの手順としては、このロード用のメソッドを呼び出す処理を記述するスクリプトの場所を検討します。
この処理はいずれのスクリプトに記述してもよいのですが、それだと明確な設計になりません

 今回はゲーム全体の管理者として GameManager スクリプトを作成して、そのスクリプト内で実行するように設計します。
今後はこの GameManager スクリプトがゲーム内のメインの流れを形作っていくように考えてください

 ロードを行う場所についてはゲーム全体の管理者としての位置づけの GameManager スクリプトに決まりました。
ここで3つ目の手順が必要になります。



 ゲームを実行したり、あるいは、別のシーンから再度、フィールドのシーンを新しく読み直すと、その都度、シーンに配置されている宝箱の情報は初期状態に戻ります
つまり、獲得している探索イベントの番号の List をロードしただけでは、これらの宝箱の情報とは紐づいていないため、ここまでの処理だけでは
シーンの宝箱の状態は初期状態から変化しません

 獲得している宝箱の情報はロード出来ている状態ですので、あとは、シーン内にある宝箱の通し番号の情報と、獲得している宝箱の通し番号の情報とを照合することが出来れば、
通し番号を元に、すでに獲得している宝箱なのか、まだ獲得していない宝箱なのかを判断出来るようになります。

 この情報を照合することによって宝箱の開封状態の判断ができる理由は、
List に登録されている通し番号の情報が開封した宝箱の通し番号の値であるためです。セーブの処理を見直してみてください。



 現在の所、ヒエラルキーにある宝箱の情報はどのスクリプトも管理していません。
この通し番号の照合の処理を行うためには、シーンにある宝箱の情報を管理することも考える必要があります。
これをゲームの管理者である GameManager スクリプトに管理させるようにしましょう。
 
 GameManager スクリプトが、シーンにある宝箱の情報の管理することができれば、獲得している探索イベントの番号の List をロードする場所も GameManager スクリプトになりますので、
必要なデータをロードした後で、そのデータと、GameManager スクリプトが管理している宝箱の情報とを1つずつ照合していくことによって、
ゲームがスタートしたときや再開したときに、セーブしてある獲得している探索イベントの番号の List を基準にして、宝箱の情報を制御することが可能になります。

 この一連の処理をこの手順ではすべて実装します。


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


 処理の内容を考えながら修正を行っていってください。


DataBaseManager.cs

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


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


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


 DataBaseManager スクリプトに新しく追加した GetEventDataSOCount メソッドを利用して、スクリプタブル・オブジェクトのデータ数を取得して処理を実装しています。


GameData.cs

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


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


4.TreasureBox スクリプトを修正し、宝箱の状態を切り替える制御処理を追加する


 獲得済の状態の宝箱である場合には、プレイヤーキャラが行動ボタンを押しても反応せず、
また画面上の画像が開封済の宝箱に変更するか、宝箱自体を非表示の状態になるように制御を行います。

 この開封済の宝箱の状態については両方用意してありますが、どちらの処理を実装しても構いません。
開封済の宝箱の画像に変更したい場合には、EventData の EventSprite 変数に、開封状態の宝箱の画像を登録しておいてください。
ここに登録している画像を差し替えるように制御を行っているためです。
差し替える処理を実装した際に、EventData に画像を登録していないと、何もない画像(None)が設定されますので注意してください。


EventDataSO スクリプタブル・オブジェクト インスペクター画像



開封済の宝箱の画像



 この処理を実装するため、TreasureBox クラスの SetUpTreasureBox メソッドは、外部のクラスより呼び出し命令を受けて実行するように変更します。
そのため、Start メソッドで実行していた処理はコメントアウトするか、削除してください。(Start メソッドごとでも構いません)


TreasureBox.cs

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


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


5.GameManager スクリプトを作成し、獲得済の探索イベントのロードを行い、宝箱の状態を制御する処理を追加する




GameManager.cs

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


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


6.GameManager ゲームオブジェクトを作成し、GameManager スクリプトをアタッチして設定を行う


 ヒエラルキーの空いている場所で右クリックをしてメニューを開き、Create Empty を選択します。
新しいゲームオブジェクトが1つ作成されますので、名前を GameManager に変更します。

 インスペクターを確認し、Transform コンポーネントの Position の値をすべて 0 にします。(はじめから 0 なら処理は不要です。)


ヒエラルキー画像



 
 作成した GameManager スクリプトをドラッグアンドドロップしてアタッチします。

 インスペクターを確認し、treasureBoxesList 変数の Size を現在ヒエラルキーに用意してある宝箱のゲームオブジェクトの数に設定します。
その後、Element にそれらの宝箱のゲームオブジェクトをヒエラルキーより、ドラッグアンドドロップしてアサインしてください。


インスペクター画像



 以上で設定は完了です。


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


 ゲームを実行した際に、セーブした情報がゲーム内の宝箱に反映されるか確認します。
獲得している宝箱の画像が変更(あるいは非表示)になれば制御成功です。

 セーブした情報を削除して再度セーブから確認したい場合には、Unity Editor の左上のメニューより
Edit => Clear All PlayerPrefs を選択してセーブデータを削除してください。
この場合、アイテムのインベントリーのデータも一緒に削除されます。


<実装動画 ロード ヽ容世靴進箱が消えないで画像が切り替わるパターン>
動画ファイルへのリンク


<実装動画 ロード◆ヽ容世靴進箱が消えるパターン>
動画ファイルへのリンク


 宝箱を獲得した時点でセーブされているため、バトルシーンへ遷移した場合であっても、
再度メインシーんへ遷移すると、ゲームを再開した場合と同じようにセーブされている情報がゲームに反映されます。


<実装動画 ロード バトルシーンから再度メインシーンへ遷移した場合にもチェックされて、獲得している宝箱は開封済みの状態になる>
動画ファイルへのリンク


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

 次は 手順28 ー固定型の会話ウインドウの表示の準備ー です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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