How to PaperZD その5-3段コンボ攻撃を作る-
その5となってますがその4とは繋がってるような、別に繋がってないような……って感じです。
コンボ攻撃を作ってみます。
とは言っても複雑なものではなく、A→A→Aのような単純にAボタンを三回押して三連続攻撃をする、みたいな想定です。
作り方はだいぶ端折っていきます。
GamePlayTagsが出てくるあたりから写経気味になりますがご愛嬌ということで……
3段コンボで使う3種類の攻撃素材の用意
InputActionの準備
EnhancedInputActionで攻撃方法を設定。(自分は左クリックで攻撃にした。)
Flipbookをアニメーションに
三種類のFlipbookを用意。
AnimationSourceに登録。
コンボの組み込み
準備
(一つのボタンを3回押すだけの攻撃だともっと別のやり方があるかもしれませんが、今回はXボタンで強攻撃できて、それがコンボに組み込める、A→X→X…などができるパターンでも対応できるような作りになっているのでご容赦ください。)
キャラBPに攻撃用のEnhancedInputActionのイベントを追加
任意のフォルダ箇所で新規のBlueprintInterfaceを作成。名前は分かれば自由。
中を開いてすでにある関数をRequestComboに名前変更。
また、Enumerationも作成。
中を開いてAddEnumerator、Enumratorsに欄が増えるので、DisplayNameをLightAttackに変更。(弱攻撃的な。Flipbookの名前のLも弱的な意味でつけてた。後に強攻撃とか作ったとしてもここで欄を増やす。)
先程作ったBlueprintInterfaceにもどり、Inputsに追加、Enumerationの名前で検索すると同じ名前のものが見つかるので変更、名称はNewComboInputsに。
AnimBPのAnimGraphに行き、BlueprintInterfaceを実装したいと思います。
上の方にあるClassSettingsをおし、ImplementedInterfacesのAddをクリック。BPIで検索すると先程作ったBlueprintInterfaceが引っかかると思うので選択。
コンパイルするとMyBluePrintのINTERFACES欄にBPIで関数に設定した名前のものが増える。右クリックでImplement eventを押すと
イベントがEventGraphに追加。
これを使ってアニメーションコンポーネントを取得します。
キャラBPに戻り、最初に追加したEnhancedInputActionから画像のように繋げます。(強攻撃とか、パターンが有る場合対応するEnhancedInputActionとRequestComboを更に作っておく。)
ここで、GamePlayTagsを追加します。ProjectSettingsを開きGameplayTagsを選択、AddNewGamePlayTagのNameにCombo.InputAllowedと入力しAddNewtag。
増えました。
AnimBPに戻り、変数にComboAnimationTagsという名前で追加。Gameplay Tag Containerです。
さらにNextComboInputという名前でE Combo Inputも追加。
コンパイルしてNextComboInputを見るとDefaultValueにLightAttackが入ってます。今回はワンパターンのコンボなので関係なさそうですが、後に強攻撃だったり様々な攻撃パターンをコンボルートに追加したくなる場合があるかもしれませんので、デフォルトは弱攻撃でもなくしたい。
のでEnumを開いてEnumratorsを追加。/ を入れて、順番を一番上にしてください。
AnimBPに戻ってDefaultを / に。
EventRequestComboから画像のように組みます。
HasTagのTag部分はInputAllowedにチェックを入れればOK。
新規のStateMachineを作成
AnimGraphにて今まで移動やジャンプを構成していたStateMachineとは別のものを作成。
中に入り画像のようにStateを追加してください。(強攻撃とかがある場合StateStateからHeavyStartとかも追加で分岐を作る感じだと思いますが割愛。)
LightStartには1段目のアニメーションをLoopなしで入れてください。
続けて2段、3段目の攻撃用のノード、後で使うリセット用Jumpノードも足しておきます。アニメーションもそれぞれ対応したものをLoopなしで入れます。
コンボ遷移
StartState to LightStartの遷移ルールはこちら。
NextComboInput変数をGet、Equalで繋いでLightAttackを選択。それをResultに繋ぐ。
一瞬分からなかったのがEqual。Equal(Enum)を選ぶ必要がありました。
LightStart to LightSecond はこちら。条件に前のアニメーションの再生が終わったらを追加しています。
LightSecond to LightEnd はこちら。こちらも同様。
ここまで出来たら一度AnimGraphまで戻ります。
移動などのStateMachineと今回のStateMachineのアニメーションの選択ルールを設定します。
コンボ攻撃の判定になるとTagにComboが入るのでこれを基準に分けています。
ただ、このままではPlayしても攻撃できません。
ProjectSettingsに行き、再びGameplayTags。Comboの右に小さく+ボタンがあるので押すとAddNewGamePlayTagにCombo.が記入されるのでその後ろにStartと入れてAdd。Tagが増えます。
ここで今後使う予定のTagも追加しておきます。Combo.PlayingMontageも足しておきます。
ここから申し訳ないですが写経気味になります。
まずComboStateMachineの各NodeのCallbacksに、後でCustomEventにするための名前を入れておきます。
StartStateのOn State Exit Event NameにCombatSequenceBegin
LightStartのOn State Enter Event NameにConsumeComboInput
LightSecondのOn State Enter Event NameにConsumeComboInput
LightEndのOn State Enter Event NameにLastComboStartEntered
AnimBPにて、まずClearComboTagsという関数を作成しておきます。
そして、EventGraphにて下記のノードを組んでいきます。
まずはEventRequestComboからの一連を修正。
コンボ開始時とコンボ終了時のEvent。
攻撃が始まった時にインプットを空(/)にする。
攻撃の再生が終わった時にインプットが/、Comboタグを持っていればコンボ終了Eventを始める。
コンボ最終が始まった時のEvent。
最初、ここまでを噛み砕けなくて記事にするのを諦めていたのですが、一つずつ噛み砕いて納得できたので追記して出すことにしました。
このタグなくてもいいのでは?と思うところもあったんですが、消すと止まったりとかで一度この形に落ち着いてます。
というわけで3連コンボが完成しました。
最初はGASで出来たりしないかと思ったんですが、デフォじゃ対応してないので、調べているとC++で色々やったりしないといけないようで……
とりあえず今の自分ではどうにもならなそうなので基本に忠実?な感じを学んでやってみました。
最後だいぶ早足になってしまったので、何か間違ってる部分があったらぜひ教えていただければと思います。
ではまた。
この記事が気に入ったらサポートをしてみませんか?