i-school - 2DタイルマップRPG 手順26
 引き続き、探索イベントの実装を行っていきます。
この手順では、探索イベントの獲得情報を一時的に保持する処理を実装します。
この手順を用意することにより、次のセーブとロードの処理を実装出来るようになります。


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

手順26 ー獲得した探索イベントの一時保持ー
46.GameData スクリプトと DialogController スクリプトを修正し、探索イベントの情報を保持できるように処理を追加する



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

 ・List.Contains メソッド



46.GameData スクリプトと DialogController スクリプトを修正し、探索イベントの情報を保持できるように処理を追加する

1.設計


 探索イベントが発生した場合、その情報は1回限りのゲームであれば、イベントの発生情報を記録する必要はあまり多くありません。
ですが、ゲーム時間の長いゲームの場合、データをセーブして、次回はその情報を利用してゲームを再開する、という方式で進めていくようになります。

 このセーブやロードの対象として、探索イベントが発生しているかどうか ー今回であれば宝箱を開けているかどうかー という情報はセーブするようにしないと
ゲームを再開した際に、再度同じ宝箱を獲得出来るようになってしまいます。

 この手順ではその前準備として、探索イベントの発生状況を一時的に保持できるようにします。
保持する場所は GameData クラスを想定しています。これは、このクラスがシングルトンクラスであり、
どのスクリプトからでも自由に参照することが容易であることから、一時保持する機能を有しておくことに適しているためです。
 


 以前にも説明しているように、プログラムには、処理の内容が記述されているメソッドと、そのメソッドを呼び出す処理によって構成されています。
電話帳に、電話をしたい相手先が登録されていなければ電話をかけることは出来ないのと同じで、メソッドを適切なタイミングで呼び出すためには、
事前に処理を記述したメソッドを用意しておく必要があります

 これまでの処理の作成手順を再度見直してみていただければわかりますが、すべて、メソッドを用意してから、そのメソッドを呼び出す処理を記述するようになっています。

 今後、自分で処理を考えて構築していくに際しても同様に組み立てていくと作りやすくなりますので、
どういった処理が、どのような場面で必要になるのかをイメージし、最初に処理をまとめたメソッドを用意してから、
その処理を実行したい場面(処理のタイミング)でメソッドの呼び出しをするようにしてみてください。

 今回も同様の手順で作成しています。【教材に書いてある順番通りに書けばいい】ではなく、【どうして教材ではそのような順番で処理を記述しているのか】、
そういった部分に注目をして進めていくようにすると理解を深めることが出来ます。


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


 GameData クラスに、探索イベントの発生状況を一時的に保持するための変数を List 型にて用意しておきます。
これは外部のクラスより命令を受けることで、発生しているイベントの番号を保持するように利用します。
つまり、アイテムの追加・削除と同じように利用する前提です。

 この List に実際に探索イベントの番号を追加するためのメソッドを用意します。
外部のクラスはこのメソッドを実行することによって、GameData クラスに用意してある List に、探索したイベントの番号を追加できる仕組みです。

 GameData クラスにこれらの情報を用意しているのは、どのスクリプトからでも探索イベントの一時保持の命令を受けられることを想定しています。
シングルトンクラスであるため、変数への代入が不要ですぐに処理を実行することができるためです。


GameData.cs

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


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


3.<List.Contais メソッド>


 引数に指定した要素が、指定した List 内に存在しているかどうかを判断するメソッドです。
戻り値は bool 型で、存在している場合には true、存在していない場合には false を戻します。

<GameData.cs AddSearchEventNum メソッド内>
  // 引数の探索イベントの番号が List に登録されていない場合(このチェックで重複登録を防いでいる)
  if (!getSearchEventNumsList.Contains(searchEventNum)) {

 今回のケースでは、List である getSearchEventNumsList 変数内を検索して、searchEventNum 変数の値が含まれているかを判定しています。
List の型は int 型、引数の型も int 型と、どちらも int 型であるため、このメソッドによる処理が成立しています。

 判定の結果、false の場合、つまり、List 内に searchEventNum 変数の値が含まれていない場合には、if 文の条件が成立し、List への追加処理が実行されています。

 そのため Contains メソッドは、重複する値の有無を判定するために利用すると便利な機能になります。


参考サイト
MicroSoft
List<T>.Contains(T) メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system...
SamuraiEngineerBlog 様
【C#入門】Containsで値が含まれるか調べる方法(文字列/配列/List)
https://www.sejuku.net/blog/41745
陰干し中のゲーム開発メモ 様
【C#,LINQ】Contains〜配列やリストの中で指定した要素があるかを判定したいとき〜
https://www.urablog.xyz/entry/2018/06/10/070000


 

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


 GameData クラスに探索イベントの一時保持の変数と、その変数に探索イベントの番号を追加するメソッドを準備しました。
あとはこの仕掛けを作動させるために、適切なタイミングで、探索イベントの番号を追加するメソッドを呼び出す必要があります。

 このメソッドの呼び出しに適してる場所を考えてみてください。
教材を見る前に、TODO 機能を参考にし、実際に呼び出し命令を書いてみるといいでしょう。

 探索イベントの発生に合わせて処理を実行することで、探索イベントが発生済として List に登録することが出来れば、
その情報を活用することにより、再度、探索イベントの発生を行わないという処理を実装することも可能になります。


DialogController.cs

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


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


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


 すべての手順が終了しました。処理の制御内容を確認した上でゲームを実行してデバッグしていきます。
獲得した宝箱の treasureEventNo 変数の値が、GameData クラスに用意した List 型の getSearchEventNumsList 変数に追加されれば制御成功です。


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


 このデータは一時的に保持はされていますが、セーブはされていませんので、ゲームを終了すると失われてしまいます。
次の手順ではこのデータをセーブとロードを行い、ゲームを再開した際に、獲得している宝箱の場合にはゲームに表示されない、あるいは画像が開封済の状態になる制御を実装します。


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

 次は 手順27 ー獲得した探索イベントのセーブとロード機能の実装ー です。