今回は、タイムアウトやKO等の勝利判定を説明します。
まずは、バトル中の時間をカウントしている処理として、ウィジェットブループリント「Widget Fighting」のイベントTickに繋がっている、ノード「Count Time」を説明します。
ノード「Count Time」では、変数”Begin Battle”でバトルが始まったことを確認したら、変数”Text Time”が有効で、変数”Int of Time”の値が0になっていないことを確認し、関数「Delay」を使用して、1秒をカウントしています。
次に、変数”P01 KO”や”SP Flag”の状態を確認して、Trueであればカウントを一時停止しています。
その後、ゲームがポーズ中ではないか、確認後、変数”Int of Time”から1を引いて、0以下であれば、カスタムイベント「Time Out」の処理を開始します。
カスタムイベント「Time Out」では、変数”Begin Battle”の初期化と変数”Time Over”や”Round Reset”をTrueにし、カスタムイベント「Guard OFF」を使用して、ガードを解除します。
その後、変数”P01 Life”と”P02 Life”の値を比較して、”P01 Life”の値が大きければ、変数”P01 KO Count”に1を足して、変数”King of Round Win”に1を代入します。
“P02 Life”の値が大きければ、変数”P02 KO Count”に1を足して、変数”King of Round Win”に2を代入します。
変数”P01 Life”と”P02 Life”の値が同じであれば、変数”P01 KO Count”と”P02 KO Count”に1を足して、変数”King of Round Win”に0を代入し、最後にカスタムイベント「Judgement of Winner」の処理を開始します。
カスタムイベント「Judgement of Winner」では、マクロ「Controller ID Single」でどちらのプレイヤーによる入力であるか確認後、変数”P01 KO Count”と”P02 KO Count”の値を確認して、変数”Kind of Gameset”に0から3までの値を代入し、Round2かFinal Roundかゲームセットなのかを決定しています。
変数”Round Reset”がTrueになると、ウィジェットブループリント「Widget Fighting」のイベントTickに繋がっている、ノード「Round&Game Result」の処理が開始されるので説明します。
ノード「Round&Game Result」では、変数”Round Reset”がTrueになると、ノード「Do Once」を使用して処理を継続し、変数”Kind of Gameset”の値が1以上であれば、ゲーム終了となるため、バトルミュージックを6秒間で消音します。
その後は、変数”Input Possible For P01″と”Input Possible For P02″をFalseにして、処理している間は、メニュー画面での入力を禁止しており、変数”Kind Of Round Win”の値に応じた処理を行います。
ここでは、例として変数”Kind Of Round Win”の値が1だった場合の処理を説明します。
まずは、関数「Play Animation Time Range」を使用して、Timeupのアニメーションを再生し、2秒後にタイムアップの音声を再生します。
それから、関数「Delay」を使用した1秒後に、変数”P01 KO Count”の値に応じて、HPバー上のVマークを出現させるアニメーションを再生します。
変数”Round Reset”がTrueになった場合は、ウィジェットブループリントだけではなく、アニメーションブループリント「Char01_AnimBP」のイベント「Blueprint Update Animation」に繋がった処理も開始するので説明します。
変数”Round Reset”がTrueになると、ノード「Do Once」を使用して、カスタムイベント「P01 Round-Result」の処理を開始します。
イベント「P01 Round-Result」では、関数「Delay」を使用した3.5秒後に、変数”Kind of Round Win”の値に応じた処理を行っており、例えば変数”Kind of Round Win”の値が1だった場合は、PlayMontageにより、勝利ポーズを再生します。
この時、P02側は、敗北ポーズを再生しています。
その後は、変数”Kind of Gameset”の値に応じた処理を行いますが、1であれば、引き分けとして 、勝敗ポーズのアニメーションを停止し、2であれば、キャラクターの向きを調整して、勝利宣言のアニメーションを再生します。
それから、ウィジェットブループリントの処理に戻り、関数「Delay」を使用した1秒後に、変数”Kind of Gameset”の値に応じた処理を行いますが、0であれば、勝敗が決まっていないため、カスタムイベント「Next Round」の処理を開始します。
次に1であれば、引き分けとしてDrawのアニメーションと音声の再生後に、カスタムイベント「Pause For End-Game」の処理を開始します。
さらに、2か3であれば、Player1か2のどちらかが勝利したことになるので、勝利したキャラクター名を変数”Img-Winner-name”にセット後、カスタムイベント「End-Game」の処理を開始します。
カスタムイベント「Next Round」では、変数”Int of Round”に1を足して、画面全体を黒くするアニメーションを再生後の0.5秒後に、変数”Int of Time”に99をセットすることで、初期化を行っています。
さらに、カスタムイベント「Reset Stun-Anim」でスタンアニメーションの初期化を行い、カスタムイベント「Reset Round」でキャラクターの各変数や位置の初期化を行った1.5秒後に、画面を黒くしていたアニメーションを逆再生して、画面を見えるようにし、変数”Input Possible for P01」をTrueにして入力を許可しています。
それから1.0秒後に、変数”Int of Round”の値に応じて、Round2かFinal Roundのアニメーションと音声を再生しています。
次に、カスタムイベント「Pause For End-Game」では、変数”Pause Menu for Game End”をTrueにして、ゲーム終了のポーズメニューであることを参照できるようにし、変数”Pause Battle”をTrueにするのと、カスタムイベント「Pause of Battle」の処理を開始して、変数”Game-set”をFalseにしています。
さらに、関数「Play Animation Time Range」を使用して、ポーズメニューを表示するアニメーション再生後の1.0秒後に、変数”End Game”をTrueにして、ゲーム終了であることを参照できるようにし、変数”Kind of Gameset”の値に応じて、入力を許可するPlayerを設定しています。
次に、カスタムイベント「End-Game」では、画面を黒くするアニメーション再生の1.0秒後に、画面に表示しているHPやSPゲージを、関数「Set Visibility」のHiddenを使用して見えないようにしています。
それから、変数”Game-set”をTrueにして、ゲームが終了したことを参照できるようにし、カスタムイベント「Reset Position」でキャラクターの位置を初期化した1.5秒後に、画面を黒くしていたアニメーションを逆再生して、画面を見えるようにしてから、勝利宣言のメッセージアニメーションを再生後に、先程説明したカスタムイベント「Pause For End-Game」の処理を開始し、ポーズメニューが表示されます。
次にKOした場合の処理を説明します。
KOの判定は「BP_Common_Controller」のカスタムイベント「Hit&Damage」の最後の処理で、変数”P01 Life”の値を確認しており、0以下であれば、ノード「Do Once」を使用して、変数”P01 KO”をTrueに設定した後、カスタムイベント「KO」の処理を開始します。
カスタムイベント「KO」では、変数”P01 Life”と”P02 Life”の値を比較して、”P01 Life”の値が大きければ、変数”P01 KO Count”に1を足して、変数”King of Round Win”に4を代入します。
“P02 Life”の値が大きければ、変数”P02 KO Count”に1を足して、変数”King of Round Win”に5を代入します。
変数”P01 Life”と”P02 Life”の値が同じであれば、変数”P01 KO Count”と”P02 KO Count”に1を足して、変数”King of Round Win”に3を代入し、最後に変数”Round Reset”にTrueを代入するのと、カスタムイベント「Judgement of Winner」の処理を開始し、関数「Set Global TIme Dilation」の値を0.25に設定して、KO時のスローモーションを再生し、変数”Begin Battle”を初期化した1.5秒後に再生速度を元へ戻します。
カスタムイベント「Judgement of Winner」の処理以降は、先ほど説明した処理と同様です。
以上で説明は終了です。
今回で、このプロジェクトのプログラム解説は終了し、これからバージョンアップの作業を行います。
バージョンアップでは、マイナーバグの修正やコンボカウント等の機能追加を予定しています。
バージョンアップが完成したらTwitterやこのブログでお知らせします。
コメントを残す