アクションゲームの定番であるドッジロールを作成しました。左スティックの入力方向にドッジし、4方向のアニメーション切替にも対応。
ポイント
キャラクターの向いている方向ではなく、左スティックを倒した方向にドッジする。正面向いて攻撃中にキャンセルして横に回避したりしたいため。
キーボード&マウスでもプレイできます。
ターゲットロック中は前後左右でドッジのアニメーションを変える。
やっとドッジロールができた。左スティックで指定した方向にドッジ。ターゲットロック中は前後左右のドッジアニメーションを割り当て。#UE5 #アンリアルエンジン pic.twitter.com/APoTo6H3iy
— ハマーキーUE (@Hummerkey_UE) September 22, 2023
必要なアニメーション
ドッジ(回避)のアニメーションが前後左右で4種必要です。
プラグイン
Motion WarpingとTarget System Component Pluginを使います。
Motion Warpingは編集 > プラグインでチェックを入れるだけです。
Target System Component Pluginはマーケットプレイスでダウンロードが必要です。
Target System Component Plugin:コードプラグイン – UE マーケットプレイス
これは素晴らしいターゲットロックシステムの無料プラグインであり、過去記事で解説しています。
ターゲットロックシステム
プレイヤーキャラクターブループリント
コンポーネントにMotion WarpingとTarget Systemを追加
+追加をクリックしてそれぞれ追加するだけです。
左スティックの入力方向(Vector)を変数へ昇格
BP_ThirdPersonCharacterに最初からあるMovement Inputから、ノードを繋げて計算して左スティックの入力座標(Vector)を変数へ昇格させます。
【昇格】LeftStickDirectionVector – Vector
加算→Normalizeの後、変数へ昇格。
Normalizeは、方向は同じままで長さが1のVectorを作ってくれます。
ドッジのノード
【新規】IsDodge? – Boolean
新規作成。ドッジ中かどうかのフラグ。
ボタン連打でドッジを連続発動させないようにします。この変数をジャンプや攻撃のノードにも使って、ドッジ中にジャンプや攻撃を発動させないようにもできます。
【昇格】LeftStickDirectionFloat – Float
Calculate Directionから変数へ昇格。-180から180の値で左スティックの入力方向を表す。前が0、右が90、左が-90、後ろが-180と180という具合。
・GetしたLeftStickDirectionVectorの後の乗算の値でドッジの距離を調整できます。
・Add or Update Warp Target from Location and RotationのノードでWarp Target Nameを「DodgeTarget」と入力します。このTargetにMotion Warpingで向かわせるわけです。
・Is Lockedはプラグイン『Target System Component Plugin』を導入していると使えるノードです。ターゲットロック中かどうかの判断ができます。
ターゲットロックシステム
・ターゲットロック中でなければ前方ドッジのAnimMontageを再生するだけです。ターゲットロック中である場合、変数LeftStickDirectionFloatの-180~180の値を4分割して、前後左右のドッジAnimMontageを割り当てています。
・Delayを0.3以上に設定しておかないと、ボタン連打でカクカクする現象が起きました。
・最後にドッジ中のフラグをオフにします。
アニメーションシーケンス
AnimMontage
配置したMotion Warpingを選択して詳細を見る。
ここのRoot Motion ModifierをSkew Warpにしていると、Warp Target Nameを入力できます。
ドッジのノードで入力していた「DodgeTarget」を入力。
ドッジの移動先でアニメーションがブレる感じがある時は、Warp Translationのチェックを外すと解決する場合があります。これはルート モーションの平行移動コンポーネントをワープするかどうかを指定するものです。私は左右のドッジアニメーションがブレましたのでチェックを外しました。
Mode > Linearは一定のスピードでTarget位置に向かいます。ここを変更すれば、初動を速くして後半で勢いを落としたりできます。
微調整
DefaultGroup.DefaultSlotの右のラインを選択して詳細を見る。
Start TimeとEnd Timeを変更することで、アニメーションの頭と尻をカットできます。余分な動作が含まれていて発動が遅かったり、発動後に硬直してしまって操作感が悪いと感じたらカットしましょう。
Play Rateの値を大きくするとアニメーションが速くなります。もっさりしていると感じたら速くしましょう。
無敵時間
空いている通知トラックで右クリックして通知ステートを追加 > Montage Notify Windowを選択。
無敵にしたい部分に配置しましょう。
配置したMontage Notify Windowを選択して詳細を見る。
Notify NameをInvincibleTimeにしておきます。
カテゴリ > Event > Montage Tick TypeをBranching Pointにしておくと、処理は重くなりますが精度が高くなります。
プレイヤーキャラクターブループリントのドッジアニメーションを設定しているモンタージュを再生のノードを見ます。
Notify Nameから線を伸ばして等しい(==)を配置。入力欄にInvincibleTimeと入力。さらに線を伸ばしてブランチを2つ配置し、それぞれOn Notify BeginとOnNotify Endに繋げる。
変数を作ります。名前はInvincibleTimeで型はBoolean。それをBegin側でTrue、End側でFalseにSetする。
この無敵時間フラグをイベント AnyDamegeで使えば、ダメージを受けないようにできます。
敵のブループリントでプレイヤーに対するヒット音や流血エフェクトを設定しているなら、プレイヤーキャラクターブループリントをキャストしてInvincibleTimeをGetし、ヒット音や流血エフェクトを無効にすることもできます。
良い感じ
ゲームパッドの左スティックで方向がドッジの指定でき、フリー時とターゲットロック時を切り替えてコントロールできる。今回の出来栄えは満点です。
ゲームパッドでプレイできるのはもちろんのこと、キーボード&マウスにも対応しています。手間ではありますが、数年前からSteamでゲームパッドを使うユーザーが急増しているという報告もあり、両対応は避けるべきじゃないと思います。
Steamでコントローラーを使用するプレイヤーがここ数年で急増中。PCゲームもゲームパッドで遊ぶ時代 – AUTOMATON
コメント