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

今回は必殺技について説明します。

まずは、FireBallという必殺技のコマンド入力について説明しますが、入力を受け付けているのは、PlayerCotrollerである「BP_Common_Controller」のTickに繋がったノード「P01 Command01」で処理をしています。

ノード「P01 Command01」では、変数”P01 Char Num”を参照したSwichノードを使用して、どのキャラクターが使われているのか特定し、その後のブランチで、変数”Player Side”を参照して、相手キャラクターの左右どちらにいるのか判断しています。

変数”Player Side” がTrueだった場合のFireBallのコマンドは、下、右下、右、パンチボタンとなるので、変数”Down Key”を参照し、方向キー下が入力されているのか確認します。

その後、 変数”Down Key” がTrueを維持した状態で、変数”Right Key”を参照し、方向キー右も入力されていることが確認できたら、ノード「Do Once」を使用して、変数”Command02″をTrueにし、下と右下のコマンド入力が成立したことにします。

ですが、その0.3秒後には関数「Delay」を使用して、変数”Command02″をFalseにしますので、 0.3秒後以内に次のコマンドを入力する必要があります。

次に方向キー右だけ、入力されている必要があるので、変数”Down Key”がFalseの場合を処理することになり、変数”Command02″と”Right Key”がTrueであれば、ノード「Do Once」を使用して、変数”Command01″をTrueにし、下、右下、右のコマンド入力が成立したことにします。

ただし、その0.3秒後には関数「Delay」を使用して、変数”Command01″をFalseにしますので、 0.3秒後以内に次のコマンドを入力する必要があります。

最後に、変数”Command01″がTrueの間に、変数”Press Button P”がTrueであれば、ノード「Do Once」を使用して、FireBallを発生させる処理を行います。

また、変数”Player Side”がFalseだった場合のコマンドは、下、左下、左となり、使用する変数が違うだけで同様の処理となります。

その後は、例えば、空中にいないか、ダウンしていないかなど、複数の変数を使用して、FireBallを発生させることが可能な状況か確認しており、すべてFalseであれば、変数”Bullet Flag”をTrueにします。

ただし、変数”P01 is Attacking”と”Enable to Cancel”、”P02 Hit back”がTrueだった場合は、キャンセル可能な攻撃が相手にヒットしており、かつ必殺技の入力も成立しているので、キャンセル必殺技が成立し、変数”Cancel to Bullet”と”Bullet Flag”をTrueにします。

それでは次に、必殺技FireBallのアニメーションについて説明します。

FireBallのアニメーションについては、アニメーションブループリントである「Char01_AnimBP」内のイベント「Blueprint Update Animation」に繋がっている処理で変数”Bullet Flag”と”Cancel to Bullet”を確認しており、どちらかがTrueであれば、ノード「Do Once」を使用してPlayMontageの処理を開始します。

さらに、PlayMontageの処理が終了すると、カスタムイベント「Setting Attack Flag OFF for Bullet」の処理を行い、攻撃関連の変数初期を行います。

FireBallのアニメーションモンタージュでは、通知としてカウンターのON/OFFを設定する”On Counter”と”OFF Counter”、FireBallを発生させる”Shot Bullet”、攻撃関連の変数を初期化する”OFF Anim”が設定されています。

通知の”Shot Bullet”では、「BP_Common_Controller」のカスタムイベント「Shot Bullet」の処理を開始します。

カスタムイベント「Shot Bullet」では、最初のブランチで変数”SP Flag”を参照して、SPゲージを使用した必殺技が使用されていないか確認し、Falseであれば、変数”Where to Attack”に必要な値を代入して、体のどの部分に攻撃するのかを指定しています。

さらにその後、マクロ「Controller ID Single」でどちらのPlayerによる入力か確認しています。

次に、変数”Command01″をFalseにして、コマンド入力を初期化した後、再度攻撃を受けていないか確認し、Falseであれば、関数「Play Sound 2D」により、必殺技専用の効果音を再生します。

それから変数”Player Side”を参照して、相手キャラクターの左右どちらにいるのか判断し、変数”Position of Bullet”に変数”Player Side”の値に応じた、FireBallを射出する位置の値を代入しています。

さらに、コンポーネント”P01″を使用して、キャラクターの位置を基準とした FireBallを射出する位置を決定し、ノード「Make Transform」を使用して、「SpawnActor BP Char01 Bullet」のアクターをスポーンする位置として設定しています。

それでは、アクター「BP Char01 Bullet」について説明します。

アクター「BP Char01 Bullet」は、外観デザインを設定しているParticleSystemと衝突判定を設定するSphere、動作を設定しているProjectileMovementから構成されています。

ParticleSystemでは、位置・回転・大きさ、パーティクルファイルを指定しています。

Sphereでは、直径と衝突判定を設定しており、オーバーラップを開始した時のイベント「On Component Begin Overlap」も設定しています。

ProjectileMovementでは、初速と重力を設定しており、今回は水平に飛び続けるので、重力は0としています。

次に、「BP Char01 Bullet」のTickの処理について説明します。

Tickはノード「Sequence」によって3つの処理に分かれており、最初の処理では、ノード「Do Once」を使用して、Projectilemovementから取得した速度を変数”Temp Velocity”に代入しており、速度を変更できるようにしています。

さらに、PlayerControllerの変数”Controller ID”を使用して、どちらのPlayerがFireBallをスポーンしたのか確認し、変数”Char01 Bullet”に「BP Char01 Bullet」自身を代入します。

この変数は画面上にFireballが存在しているのか確認するために使用されます。

次の処理では、ブランチで変数”Overlap”を参照してオーバーラップしていないか確認後、両方のキャラクターの位置を参照して、FireBallとの距離を算出しています。

この算出している距離は、相手のFireBallとの距離を算出している値と自分のFireBallとの距離を算出している値があり、相手のFireBallとの距離を算出している値は、ガードをするタイミングを決定するのに使用し、自分のFireBallとの距離を算出している値は、600cm以上離れるとノード「Do Once」を使用して、攻撃種類と距離の初期化を行った後、FireBallを破壊し、画面から消去します。

最後の処理は、相手のキャラクターが、SPゲージを使用した必殺技を使用した際に、特別なアニメーションが再生されるので、その間、FireBallは動かないよう設定するため、PlayerControllerの変数”Controller ID”を使用して、どちらのPlayerがFireBallをスポーンしたのか確認し、変数”SP Flag”がTrueであれば、FireBallの速度を0にし、Falseになった場合は、 元の速度を再設定します。

それでは次に、イベント「On Component Begin Overlap」について説明します。

最初のブランチで、関数「Get Instigator Controller」とPlayerindexが0の「Get Player Controller」の値が同じか確認しており、Trueであれば、Player01のFireBallがPlayer02にヒットしたと判断し、Falseであれば、Player02のFireBallがPlayer01にヒットしたと判断して処理を継続します。

それから、変数”Overlap”をTrueにして、Tick側の距離を計算する処理を停止します。

その後、Sphereの衝突判定を関数「Set Collision Object Type」を使用して”Destructible”に変更し、変数”P01 Kind of Attack”に攻撃種類の値を代入します。

さらに、関数「Spawn Emitter at Location」を使用して、FireBallが衝突した時のパーティクルをスポーンしています。

最後に、その0.1秒後に攻撃や距離の変数の初期化を行い、FireBallを関数「DestroyActor」で破壊しています。

以上で必殺技FireBallについて説明したので、次にSPゲージを使用した必殺技IceBallについて説明しますが、共通部分も多いので、差分について説明します。

IceBallの入力を受け付けているのは、PlayerCotrollerである「BP_Common_Controller」のTickに繋がったノード「P01 Command SP」で処理をしています。

ノード「P01 Command SP」では、変数”P01 SP”の値を参照し、1.0以上あるか確認しており、SPゲージがMAXであれば処理を継続します。

コマンドの入力処理はFireBallとほぼ同様のため省略し、コマンド入力が成立した時の処理が一部違うため、説明します。

IceBallはFireBall3発分の威力があるため、変数”Multiple Hits”をTrueにするのと、変数”Multiple Hit times”に3を代入しています。

それからIceBallはコマンド入力が成立すると、カメラが切り替わってアニメーションを再生して、変数”SP Camera”をTrueにし、同時に効果音も再生されるため、関数「Play Sound 2D」で再生しています。

さらに、コマンド入力が成立した場合は、一時的に無敵とするため、カスタムイベント「D-Box OFF」で衝突判定をすべて”Destructible”に変更し、カスタムイベント「SP Pause」でカメラが切り替わっている間、相手のキャラクターの動作を一時停止させ、変数”P01 SP”の値を初期化しています。

それでは、まずカメラの切り替え処理について説明します。

カメラの切り替え処理は、「BP Global Camera」のイベントTickに繋がった処理で、変数”SP Camera”を確認しており、そこがTrueになった時に、キャラクターの位置からカメラの位置を決定し、関数「SetActorTransform」でカメラの位置を変更しています。

次に「BP_Common_Controller」カスタムイベント「SP Pause」を説明しますが、「SP Pause」は、ノード「P01 SP Pause」で処理されています。

ノード「P01 SP Pause」では、ノード「Sequence」で2つの処理を行っており、1つ目はキャラクターが空中にいる場合に処理を継続し、もう一つは、アニメーションの再生速度を0.0にして一時停止後、1.4秒後に再生速度を1.0に戻します。

ここの1.4秒というのはカメラが切り替わっている時間です。

キャラクターが空中にいる場合の処理は、キャラクターのYとZ軸の速度と位置を取得後、重力と速度を0にします。

その後、関数「SetActorLocation」を使用して、先程の位置をセットすると、キャラクターは空中にいる状態で停止し、1.4秒後に重力を初期値へ戻し、次のブランチでZ軸の速度がプラスであれば、YとZ軸の元の値を参照し、関数「Launch Character」でジャンプ処理を継続し、Z軸の速度がマイナスであれば、Y軸の元の値を参照し、落下処理を継続します。

それでは次に、IceBallのアニメーションについて説明します。

IceBallのアニメーションについては、アニメーションブループリントである「Char01_AnimBP」内のイベント「Blueprint Update Animation」に繋がっている処理で変数”SP Flag”を確認しており、Trueであれば、ノード「Do Once」を使用してPlayMontageの処理を開始し、処理が終了すると、FireBallと同じ処理を行っています。

IceBallのアニメーションモンタージュでは、通知としてIceBallを発生させる”SP”と、攻撃関連の変数を初期化する”OFF SP Flag”が設定されています。

通知の”SP”では、「BP_Common_Controller」のカスタムイベント「SP」の処理を開始します。

カスタムイベント「SP」では、ノード「P01 SP Flag」を処理しており、変数”SP Camera”をFalseにすることで、カメラの切り替えを元に戻し、変数”Player Side”の値に応じて、IceBallの位置を決定して、変数”Where to Attack”に必要な値を代入して、体のどの部分に攻撃するのかを指定しています。

その後、カスタムイベント「D-Box ON」で無敵を解除し、コンポーネント”P01″を使用して、キャラクターの位置を基準とした IceBallを射出する位置を決定し、ノード「Make Transform」を使用して、「SpawnActor BP Char01 SP」のアクターをスポーンする位置として設定しています。

それでは、アクター「BP Char01 SP」について説明します。

アクター「BP Char01 SP」の構成は、FireBallと比べてParticleSystemが3つあるだけで、設定は同じです。

次に、「BP Char01 SP」のTickの処理については、FireBallと同じ処理をしており、イベント「On Component Begin Overlap」について、FireBallと違うのは、FireBallと衝突したときに、変数”Multiple Hit Times”の値から1を引く処理を追加しています。

今回の説明は以上です。

次回は攻撃を受けた時のダメージ処理について説明します。

コメントを残す

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

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