ハイスコア処理!(ハイスコア判定の方法!)
例えば、
1回目のプレイで、ゴールに10秒で着いたとする。
2回目のプレイで、ゴールに5秒で着いたら、10秒よりも早く着いたから「ハイスコア」ということになる。
今回はその
ハイスコア判定の方法
を紹介する。
「BP_Goal」を開こう。
変数を用意。
StageIDは、前回の記事で説明したから割愛。
SaveSlotNameArrayは、String型の配列変数だ。
デフォルト値は以下の通りに。
値(文字)は、個人の自由でいい。
ただ、この配列内の文字は「各ステージごとの名称」を表しているという事だけは言っておく。
イベントグラフ
BP_GoalのBoxコリジョンにオーバーラップしたら、まずこのステージのハイスコアを保存したセーブデータががあるかどうかを確認する。
DoesSaveGameExistノードは、SlotName名と一致するセーブデータが存在するかどうかを確認するためのノードだ。
存在していればTrue。存在してなければFalseを返す。
例えば、現在のステージが「Stage1」なら
SaveSlotNameArray内の、Index「0」にある「Stage1」という名のセーブデータがあるかどうかを確認する。といった感じだ。
なぜIndex「0」なのか??
「Stage1」のレベルBPで、StageIDが「0」にセットされてるからだ。
↓前回の記事でも書いたが、
StageIDは、「現在のステージがいくつ目なのかを示すための変数だ」ということ。
つまり、
現在プレイしているステージが「Stage1(StageID『0』)」なら、SaveSlotNameArray内のIndex「0」にある「Stage1」という名ののセーブデータがあるかどうかを確認する。
という流れだ。
「Stage1(StageID『0』)」の
セーブデータがあるかを確認する。
だが初回プレイ、つまり1回目のプレイだから普通はセーブデータが存在しない。
だから、DoesSaveGameExistノードによって処理はFalseに流れる。
セーブデータが存在しなかった場合の処理
Sequenceノードで順番に処理を行っている。
Then0・・・CreatSaveGameObjectノードで現在プレイしているステージのセーブデータを作成
Then1・・・「MyGameInstance」から「分」と「秒」を参照。それを「SaveMinute」と「SaveSecond」に格納
Then2・・・「MyGameInstance」の「分」と「秒」をハイスコア用の配列に格納
Then3・・・最後にセーブ。これで現在のスコアとハイスコアの保存が出来た。
2回目以降のプレイ。つまり現在のステージのセーブデータが存在してる場合の処理。ここでもSequenceで順番に処理を行っている。
Then0・・・現在のステージのセーブデータをロードし、それを変数に格納
Then1・・・現在クリアーしたタイムを変数に格納
下のセーブデータが存在しなかった場合の処理に無理やり繋げている。
Then2・・・ハイスコア判定。
「MyGameInstance(現在クリアーした時点でのタイム)」のスコアと「SaveScore」のハイスコアを比較。
「MyGameInstance」のタイムの方がハイスコアよりも早い場合、処理はTrueに流れる。
逆に、「MyGameInstance」のスコアがハイスコアよりも遅い場合はFalseに。
例えば、1回目のプレイを10秒でクリアーしたとする。
2回目のプレイを5秒でクリアーしたらハイスコア。(True)
逆に10秒よりも遅い20秒とかでクリアーした場合、ハイスコアではない。(False)となる。
ハイスコアだった場合Trueに処理が流れ、現在のスコアをハイスコアとして配列に上書きする。
ハイスコアじゃない場合は何もない。
Then3・・・セーブ。
これでプレイしてみよう。
まず1回目のプレイ。セーブデータが存在していない場合の処理
10秒でクリアーした。
分かりやすく左上に「クリアー!」という文字が出ているはずだ。
この時点で、10秒というスコアがハイスコアとして保存された。
2回目以降のプレイ。
15秒でクリアーしてみる。
左上に「ハイスコアではない!」という文字が出てきたはずだ。
今度は8秒でクリアーしてみる。
左上に「ハイスコア!」と表示されていたはずだ。
この時点で、前回の「10秒」というハイスコアが「8秒」に上書きされた。
しっかりハイスコア判定がされているのが分かった。
かなり長くなってしまった為雑な説明があるかもしれない。
その際はぜひともコメント等で言ってほしい。
次回は、今回の引き続きのようなものだ。
それではまた!^^ノシ