格闘ゲームの作り方・プログラムの解説 その19

今回はキャラクター同士が衝突している場合の処理について説明します。

キャラクターの衝突を検知しているのは、ブループリント「BP_Char01」のCapsuleComponentのイベント「On Component Begin Overlap」で行っています。

CapsuleComponentのCollision設定は、Object TypeがWorldDynamicで、オブジェクト応答として、WorldDynamicがOverlap、WorldStaticがBlockとなっています。

CapsuleComponentがOverlapを検知すると、「BP_Common_Controller」のカスタムイベント「ON Overlap of Capsule」の処理が開始され、変数”Overlap of Capsule”をTrueに設定します。

変数”Overlap of Capsule”がTrueになると、「BP_Common_Controller」のイベントTickに繋がった処理が開始され、次に、変数”Pause Battle”、”P01 KO”、”P02 KO”、”Time Over”を確認し、Falseであれば処理を継続します。

次に、ノード「Sequence」で2つの処理を行っており、上側の処理では、両キャラクターが衝突した時のY軸方向の速度を、ノード「Kind of Velocity for Overlap」で管理しています。

ノード「Kind of Velocity for Overlap」では、両キャラクターが衝突した時のY軸方向の速度を比較して、以下の8つの状態に場合分けしており、変数”Kind of Velocity”へ0から7の値を代入しています。

0.両キャラクターが押し合っていて、両キャラクターの速度が同じ

1.両キャラクターが押し合っていて、P01キャラクターのほうが早い

2.両キャラクターが押し合っていて、P02キャラクターのほうが早い

3.両キャラクターが同じ方向に動いて、P01キャラクターのほうが早い

4.両キャラクターが同じ方向に動いて、P02キャラクターのほうが早い

5.P01だけが動いている

6.P02だけが動いている

7.両キャラクターが動いていない

次に衝突を判定している、全体の処理ノードを表示しますが、9種類のノードに分かれているので、まずは、概要を説明します。

1.両キャラクターが空中にいる

2.P02キャラクターだけが空中にいる

3.P01キャラクターだけが空中にいる

4.両キャラクターが前ステップしている

5.P01キャラクターだけが前ステップしている

6.P02キャラクターだけが前ステップしている

7.P01キャラクターだけがバックステップしている

8.P02キャラクターだけがバックステップしている

9.両キャラクターが歩いているか止まっている

4番以降の処理は、両キャラクターが地上にいることを前提としています。

それでは1番の両キャラクターが空中で衝突している時の処理している全体のノードを表示します。

まずは、変数”Player Side”の値を確認して、処理が大きく上下に別れており、ここでは、Trueの場合の7種類の場合について説明します。

1番目では、P01キャラクターがステージの左端にいる場合の処理で、P01キャラクターが垂直ジャンプをしている時に、P02キャラクターが下から前ジャンプをしたことを想定した処理となっており、P01キャラクターをステージ内側へ押し出すような処理をしています。

具体的には、CapsuleComponentの直径を3で除算して、2を乗算した値を1フレーム当たりの距離として、P01キャラクターを内側へ移動させています。

2番目は、P01キャラクターがステージの左端にいる場合の処理で、P01キャラクターが垂直ジャンプをしている時に、P02キャラクターが前ジャンプをして、P01キャラクターの正面に衝突したことを想定した処理となっており、P02キャラクターがそれ以上前に進まないような処理をしています。

具体的にはジャンプのY軸方向の1フレーム当たりの移動距離を引き算して相殺し、P02キャラクターをそれ以上前に進まないようにしています。

3番目と4番目は、P02キャラクターが画面の右端にいる場合の処理で、1番と2番と同様の処理をしています。

5番目は、両キャラクターが前ジャンプで、正面に衝突したことを想定した処理となっており、 両キャラクターがそれ以上前に進まないような処理をしています。

具体的にはジャンプのY軸方向の1フレーム当たりの移動距離を引き算して相殺し、両キャラクターをそれ以上前に進まないようにしています。

6番目は、P02キャラクターが垂直ジャンプをしている時に、P01キャラクターが前ジャンプをして、正面に衝突したことを想定した処理となっており、 両キャラクターが、画面右側へ少し移動するような処理をしています。

具体的にはP01キャラクターが前ジャンプしている時に発生している、1フレーム当たりの移動距離の半分で画面右側に移動します。

7番目は、P01キャラクターが垂直ジャンプをしている時に、P02キャラクターが前ジャンプをして、正面に衝突したことを想定した処理となっており、 両キャラクターが、画面左側へ少し移動するような処理をしています。

具体的にはP02キャラクターが前ジャンプしている時に発生している、1フレーム当たりの移動距離の半分で画面左側に移動します。

次に、P02キャラクターだけが空中にいて、P01キャラクターと衝突している時の処理している全体のノードを表示します。

まずは、変数”Player Side”の値を確認して、処理が大きく上下に別れており、ここでは、Trueの場合の4種類の処理について説明します。

1番目は、P01キャラクターがステージの右端にいて、P02キャラクターが前ジャンプで、P01キャラクターの後ろ側に着地することを想定した処理となっており、P01キャラクターをステージ内側へ押し出すような処理としています。

具体的には、CapsuleComponentの直径を3で除算して、2を乗算した値を1フレーム当たりの距離として、P01キャラクターを内側へ移動させています。

2番目は、P02キャラクターがステージの右端で垂直ジャンプした時に、P01キャラクターが前ステップをした場合を想定した処理となっており、P02キャラクターをステージ内側へ押し出すような処理としています。

具体的には、CapsuleComponentの直径を3で除算して、2を乗算した値を1フレーム当たりの距離として、P02キャラクターを内側へ移動させています。

3番目は、P01キャラクターがステージの左端にいる時で、P02キャラクターが前ジャンプでP01キャラクターの正面に衝突した場合を想定した処理となっており、P02キャラクターがそれ以上前に進まないような処理としています。

具体的には、CapsuleComponentの直径を3で除算して、2を乗算した値を1フレーム当たりの移動距離として、P02キャラクターがそれ以上前に進まないような処理としています。

4番目は、P01キャラクターが前に歩いている状態で、P02が前ジャンプで、P01キャラクターの正面に衝突した場合を想定しており、P02キャラクターがそれ以上前に進まないような処理としています。

この部分の具体的な移動の計算処理については、バグを発見したので、次回のアップデート時に対応します。

では次に、3番目のP01キャラクターだけが空中にいる場合の処理になりますが、先程説明した2番目の処理と同様となります。

次に、4番目の両キャラクターが前ステップして衝突している時の処理は、前ステップのアニメーションは再生していますが、キャラクターの位置は衝突した場所から変化しないように処理しています。

次に5番目のP01キャラクターだけ前ステップしている状態で衝突した場合の処理は、変数”Player Side”の値を確認して処理が別れますが、ここではTrueの場合を説明します。

ノード「Only P01 Dash Left Side」全体の処理ノードを表示しますが、処理が6種類に別れていますので、説明します。

1番目は、P02キャラクターが前に歩いている時に、P01キャラクターが前ステップで衝突した時を想定した処理となっており、両キャラクターがゆっくり右側へ移動する処理としています。

具体的にはP01キャラクターの前ステップが1フレーム当たりに進む半分の距離で右側に移動しています。

2番目は、当てはまる条件がなく、不要でしたので、次回のアップデートで修正します。

3番目は、P02キャラクターが後ろに歩いている時に、P01キャラクターが前ステップで衝突した時を想定した処理となっており、両キャラクターがP01キャラクターの前ステップと同じ速度で右側へ移動する処理としています。

4番目は、P02キャラクターが動いていない状態で、P01キャラクターが前ステップで衝突した時を想定した処理となっており、両キャラクターがP01キャラクターの前ステップと同じ速度で右側へ移動する処理としています。

5番目は、P02キャラクターがステージの右端にいる状態で、かつ前へ歩いている時に、P01キャラクターが前ステップで衝突していることを想定した処理となっており、両キャラクターの位置は衝突した場所から変化しないように処理しています。

最後に6番目は、P02キャラクターがステージの右端にいる状態で、かつ動いていない時に、P01キャラクターが前ステップで衝突していることを想定した処理となっており、P01キャラクターの位置は衝突した場所から変化しないように処理しています。

P02キャラクターだけが、前ステップしている時の処理も同様となります。

それでは次に7番目の、P01キャラクターだけがバックステップしている状態でP02キャラクターと衝突している処理の全体のノードを表示します。

まずは、変数”Player Side”の値を確認して、処理が大きく上下に別れており、ここでは、Trueの場合の2つの処理について説明します。

1番目は、P01キャラクターがステージの左端にいてバックステップした状態で、P02キャラクターが前へ歩いている時に衝突していることを想定した処理となっており、P02キャラクターの位置は衝突した場所から変化しないように処理しています。

2番目は、P01キャラクターがステージの端以外でバックステップした状態で、P02キャラクターが前へ歩いている時に衝突していることを想定した処理となっており、P01キャラクターはP02キャラクターと衝突していない時のバックステップと同じ速度で移動します。

P02キャラクターだけがバックステップしている状態の処理も同様となります。

それでは最後に9番目の、両キャラクターが歩いているか止まっている状態での衝突処理について、変数”Player Side”の値を確認したTrue側の処理について説明します。

全体の処理ノードは次のようになっており、変数”Kind of Velocity”の値に応じた10種の処理に別れています。

1番目の処理は、両キャラクターが押し合っていて、両キャラクターの速度が同じ場合を想定した処理となっており、両キャラクターが衝突している位置から変化しないように処理しています。

2番目の処理は、両キャラクターが押し合っていて、P01キャラクターの速度が速い場合を想定した処理となっており、P02キャラクターの速度との差分だけ、P02キャラクターを押して移動する処理となります。

3番目の処理は2番目と反対で、P02キャラクターが、P01キャラクターの速度との差分だけ、P01キャラクター押して移動する処理となります。

4番目の処理は、両キャラクターが同じ方向に動いて、P01キャラクターのほうが早い場合の処理ですが、遅い方の速度に合わせて移動する処理となります。

5番目と7番目の処理は、どちらかのキャラクターがステージの端にいる状態で、もう一方のキャラクターが押している状態を想定しており、押している側のキャラクターがそれ以上前に進まないよう処理しています。

6番目の処理は、両キャラクターが同じ方向に動いて、P02キャラクターのほうが早い場合の処理となり、遅い方の速度に合わせて移動する処理となります。

8番目と9番目の処理は、どちらかのキャラクターが動いていない状態で、もう一方のキャラクターが押している状態を想定した処理となっており、歩く速度の1/4の速度で押して移動する処理となります。

10番目は、両キャラクターが動いていない状態を想定しており、動いていない状態でオーバーラップを検知している場合は、オーバーラップが解除されるまで、お互いのキャラクターを離れる方向へ移動する処理を行っています。

説明は以上となります。

次回は、タイムアウトや勝利判定の説明をします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください