こちらは、連載記事の第2回となります。第1回を読んでいない方は、先にそちらからお読みください。
今回はグレイマンにパンチを打たせてみて、GameplayAbilityの機能を確認してみたいと思います。
注意事項
今回の記事では、パンチのアニメーションを使用します。AdobeのMixamoというサービスからパンチアニメーションを拾ってきて、グレイマンのアニメーションに適用する必要があります。
手順はこのサイトを参考にしてください。パンチアニメーションがプロジェクトに取り込まれている状態から説明を開始します。
アニメーションモンタージュの準備
“/Mannequin/Animations/ThirdPerson_AnimBP”を開いて、AnimGraphを表示してください。
Defaultステートマシンと、出力ポーズの間に”スロット’DefaultSlot’ノードを挟み込んでください。これで、アニメーションブループリントの編集は完了です。
次に、パンチアニメーションからアニメーションモンタージュを作成します。
取り込んだパンチアニメーションを右クリックして「作成する」「AnimMontageの作成」を選択してください。
名称はなんでも構いません。
パンチ能力用のGameplayTagを作成
前回ability.jumpというGameplayTagを追加しましたが、今回はパンチ用にability.panchタグを追加します。
プロジェクト設定からGameplayTagsを開き、abilityタグ配下にpanchを追加してください。
パンチ能力の作成
前回ジャンプ能力処理としてGA_Jumpを作成しましたので、同じ場所にパンチ能力としてGA_Punchを作成します。GameplayAbilityを継承したブループリントを作成して、パンチ処理を実装しましょう。ブループリントのロジックも大切ですが、右側の詳細のタグの設定も忘れないようにしてください。
GA_Jumpの時はグレイマンを取得するのに”GetOwningActorFromActorInfo”ノードを使っていましたが、今回は”GetSkeletalMeshComponentFromActorInfo”ノードを使っています。これは、能力が割り当てられたグレイマンのスケルタルメッシュコンポーネントを直接取得することができるので、キャストすらせずにアニメーションモンタージュのノードに繋げることができます。そして、アニメーションモンタージュが再生終了したら、EndAbilityノードを呼び出しています。
パンチ能力のグレイマンに与える
ThirdPersonCharacterのBeginPlayでグレイマンにジャンプ能力を与えていた場所に戻って、パンチ能力を与えるようにしましょう。
パンチ能力の発動
ジャンプボタンでジャンプ能力を発動させていましたが、ジャンプ能力をパンチ能力に変えてしまったので、発動側もパンチ能力の発動に切り替えてみましょう。これも、GameplayTagを切り替えるだけですね。
動作確認
それでは、プレイボタンを押してみて、ジャンプボタンを押してみてください。
無事にパンチが出るはずです。
不具合に気づきましたか?
実は、このままでは正常にプログラムが動作していません。ジャンプボタンを押すと能力が発動するということは、ジャンプボタンを連打した場合はどうなるでしょうか?
殴るぞ!殴るぞ!状態になってしまいました・・・・これは、ジャンプボタンを押す度にアニメーションモンタージュが再生される為に、アニメーションの途中でも再びアニメーションが始まってしまうことが原因です。
さて、どうしましょうか・・・・普通に考えると、アニメーションモンタージュの再生前にフラグを立てて、フラグが立っている時は能力を発動させないように制限しますが、今後様々な状態が追加されていくと実行判定のブランチノードが凄い数になってしまいそうです。そいうえば、BPのブランチノードって地味に面倒なんですよね・・・
しかし、GameplayAbilityにはこれを解決する手段が用意されています。
能力発動中を表すGameplayTagの作成
再びプロジェクト設定からGameplayTagsを開き、今度はabilityタグ配下にrunningを追加してください。
今まではGameplayTagを能力の発動用に使っていましたが、今回のタグは能力の状態(発動中)を判定する為に使用する為”running”というタグ名にしてみました。
発動中を表すタグと、発動させない条件のタグを設定
再びGA_Puhchに戻り、上記で作成したability.runningタグを”ActivationOwnedTags”と”ActivationBlockedTags”に設定します。
この詳細のタグには他にも何個かGameplayTagを設定できる項目がありますので、代表的な項目を解説します。
Ability Tags | ActivateAbilityから能力を呼び出す時に使用するタグ |
Cancel Abilities With Tag | このAbilityが発動した場合、ここに定義されたTagを持つほかのAbilityをキャンセルする |
Block Abilities With Tag | このAbilityが発動した場合、ここに定義されたTagを持つAbilityを実行させない |
Activation Owned Tags | このAbilityの発動中(ActivateAbilityからEndAbilityまで)の間、ここで定義されたTagが能力を割り当てたActorのAbilitySystemコンポーネントに付与される |
Activation Required Tags | 能力を割り当てられたActorのAbilitySystemコンポーネントがこのタグを持っている時に能力を発動することができる |
Activation Blocked Tags | 能力を割り当てられたActorのAbilitySystemコンポーネントがこのタグを持っている時に能力を発動することができない |
つまり、今回追加したability.runningタグを使って、パンチ能力発動時に”Activation Owned Tags”でグレイマン(のAbilitySystemコンポーネント)に「能力発動中ですよ」というタグを設定しておき、”Activation Blocked Tags”にも同じタグを設定することで、能力発動中の場合は新しく能力を発動することができない制限をかけています。
上記リストにも書きましたが、 “Activation Owned Tags”が能力発動しているか否かを判断するのはEndAbilityが呼ばれたかどうかで判断しているので、GA_PunchからEndAbilityを外すと、一度しかパンチが打てなくなります。これは1度目のパンチで能力発動中のタグが設定されますが、EndAbilityが呼び出されない為に永遠に能力が発動している事になり、2度目のパンチが打てないという意味になります。
再び実行!
プレイボタンを押して、ジャンプボタンを連打してみてください!
今度はパンチモーションが終わるまで次のパンチが出ないはずです。
解説
今回の解説では、ジャンプ能力を作った経験を活かしてパンチ能力を作成し、GameplayAbilityの能力発動制御の機能について実装してみました。
前回、GASを使う事の利点を何個かリストアップしましたが、今回のサンプルではかなり強力な利点を理解することができたと思います。
次回は、GameplayAbilitySystemの構成を振り返り、C++言語を使ってもっと扱いやすい構成に変更していきます。
構成が整理できたら、パンチを打ち続けるグレイマンにスタミナの概念を取り入れ、疲れさせてみようと思います。
No responses yet