ハイスコア処理!(ハイスコア判定の方法!)

例えば、

1回目のプレイで、ゴールに10秒で着いたとする。

2回目のプレイで、ゴールに5秒で着いたら、10秒よりも早く着いたから「ハイスコア」ということになる。

 

今回はその

 

ハイスコア判定の方法

 

を紹介する。

 

「BP_Goal」を開こう。

変数を用意。

f:id:Free_Gamer:20180904214151p:plain

StageIDは、前回の記事で説明したから割愛。

SaveSlotNameArrayは、String型の配列変数だ。

 

デフォルト値は以下の通りに。

値(文字)は、個人の自由でいい。

ただ、この配列内の文字は「各ステージごとの名称」を表しているという事だけは言っておく。

f:id:Free_Gamer:20180904214324p:plain

 

イベントグラフ

f:id:Free_Gamer:20180903195927p:plain

BP_GoalのBoxコリジョンにオーバーラップしたら、まずこのステージのハイスコアを保存したセーブデータががあるかどうかを確認する。

f:id:Free_Gamer:20180904214843p:plain

DoesSaveGameExistノードは、SlotName名と一致するセーブデータが存在するかどうかを確認するためのノードだ。

存在していればTrue。存在してなければFalseを返す。

f:id:Free_Gamer:20180905182207p:plain

 

例えば、現在のステージが「Stage1」なら

f:id:Free_Gamer:20180904215210p:plain

SaveSlotNameArray内の、Index「0」にある「Stage1」という名のセーブデータがあるかどうかを確認する。といった感じだ。

 

なぜIndex「0」なのか??

「Stage1」のレベルBPで、StageIDが「0」にセットされてるからだ。

f:id:Free_Gamer:20180904181247p:plain

↓前回の記事でも書いたが、

f:id:Free_Gamer:20180904220012p:plain

StageIDは、「現在のステージがいくつ目なのかを示すための変数だ」ということ。

 

つまり、

 

現在プレイしているステージが「Stage1(StageID『0』)」なら、SaveSlotNameArray内のIndex「0」にある「Stage1」という名ののセーブデータがあるかどうかを確認する。

 

という流れだ。

 

「Stage1(StageID『0』)」の

f:id:Free_Gamer:20180905181324p:plain

 セーブデータがあるかを確認する。

f:id:Free_Gamer:20180904215451p:plain

 

だが初回プレイ、つまり1回目のプレイだから普通はセーブデータが存在しない。

だから、DoesSaveGameExistノードによって処理はFalseに流れる。

 

セーブデータが存在しなかった場合の処理

Sequenceノードで順番に処理を行っている。

f:id:Free_Gamer:20180905182724p:plain

 Then0・・・CreatSaveGameObjectノードで現在プレイしているステージのセーブデータを作成

f:id:Free_Gamer:20180905182852p:plain

 Then1・・・「MyGameInstance」から「分」と「秒」を参照。それを「SaveMinute」と「SaveSecond」に格納

f:id:Free_Gamer:20180905182947p:plain

 Then2・・・「MyGameInstance」の「分」と「秒」をハイスコア用の配列に格納

f:id:Free_Gamer:20180905200954p:plain

Then3・・・最後にセーブ。これで現在のスコアとハイスコアの保存が出来た。

f:id:Free_Gamer:20180905201205p:plain

 

2回目以降のプレイ。つまり現在のステージのセーブデータが存在してる場合の処理。ここでもSequenceで順番に処理を行っている。

f:id:Free_Gamer:20180905201331p:plain

Then0・・・現在のステージのセーブデータをロードし、それを変数に格納

f:id:Free_Gamer:20180905201454p:plain

Then1・・・現在クリアーしたタイムを変数に格納

f:id:Free_Gamer:20180905182947p:plain

下のセーブデータが存在しなかった場合の処理に無理やり繋げている。

f:id:Free_Gamer:20180905203529p:plain

Then2・・・ハイスコア判定。

「MyGameInstance(現在クリアーした時点でのタイム)」のスコアと「SaveScore」のハイスコアを比較。

「MyGameInstance」のタイムの方がハイスコアよりも早い場合、処理はTrueに流れる。

逆に、「MyGameInstance」のスコアがハイスコアよりも遅い場合はFalseに。

f:id:Free_Gamer:20180905201825p:plain

例えば、1回目のプレイを10秒でクリアーしたとする。

2回目のプレイを5秒でクリアーしたらハイスコア。(True)

逆に10秒よりも遅い20秒とかでクリアーした場合、ハイスコアではない。(False)となる。

ハイスコアだった場合Trueに処理が流れ、現在のスコアをハイスコアとして配列に上書きする。

ハイスコアじゃない場合は何もない。

f:id:Free_Gamer:20180905203657p:plain

Then3・・・セーブ。

f:id:Free_Gamer:20180905203845p:plain

 

これでプレイしてみよう。

まず1回目のプレイ。セーブデータが存在していない場合の処理

youtu.be

10秒でクリアーした。

分かりやすく左上に「クリアー!」という文字が出ているはずだ。

この時点で、10秒というスコアがハイスコアとして保存された。

 

2回目以降のプレイ。

15秒でクリアーしてみる。

 youtu.be

左上に「ハイスコアではない!」という文字が出てきたはずだ。

 

今度は8秒でクリアーしてみる。

youtu.be

左上に「ハイスコア!」と表示されていたはずだ。

この時点で、前回の「10秒」というハイスコアが「8秒」に上書きされた。

しっかりハイスコア判定がされているのが分かった。

 

かなり長くなってしまった為雑な説明があるかもしれない。

その際はぜひともコメント等で言ってほしい。

 

次回は、今回の引き続きのようなものだ。

 

それではまた!^^ノシ