UE5 キャラクターを派生開発する方法

※本サイトはアフィリエイト広告を利用しています。

本記事のテーマはクリボーをもとにノコノコを派生開発です。

カメちゃんはクリボーに比べて処理が多く、2番目の敵キャラとして制作するには
なかなか大変ですね

まずクリボーとの共通点や差分を確認して共通部分を親クラスにまとめることで
コピペだらけでぐちゃぐちゃにならないように整理しましょう

仕様確認

クリボー

  • 一定距離までプレイヤーが近づくまでスタンバイ​
  • 前進​
  • 壁にぶつかったら反転​
  • ファイヤーボールにぶつかったらひっくり返りDown​
  • スター無敵にぶつかったらひっくり返りDown​
  • 敵(マリオ)に体でぶつかったら相手にダメージ​
  • 敵に上から踏まれたらつぶれDown

比較的単純ですね

一定距離まで近づいたら前向きに歩き始め、何かにぶつかったら反転します

やられ方は2種類あり、

  • ファイアーボールをくらうかスター無敵状態でぶつかられた場合は、少し浮き上がってひっくり返って落下していきます
  • 敵(プレイヤー)に体でぶつかると、相手が無敵じゃなかったらこっちが勝ちます

ただし頭を踏まれた場合はつぶれてやられる弱点もあります

ノコノコ(亀)

  • 一定距離まで近づくまでスタンバイ​
  • 前進​
  • 壁にぶつかったら反転​
  • ファイヤーボールにぶつかったらひっくり返りDown​
  • スター無敵にぶつかったらひっくり返りDown​
  • 敵(マリオ)に体でぶつかったら相手にダメージ​
  • 敵に上から踏まれたら甲羅に引っ込み移動停止​
  • 甲羅停止状態のまま数秒経過で徒歩状態に​
  • 甲羅停止中に敵に踏まれorぶつかられると前後遠いほうに向かって高速移動開始​
  • 高速移動中に敵に踏まれると停止​
  • 高速移動中に敵味方にぶつかったら相手にダメージ

クリボーとは違って上から踏まれてもやられませんが、
甲羅に引っ込んだり高速移動したりと変身的な要素がありますね

停止してから数秒待って、引っ込み状態からもとに復活して再び歩きだします

甲羅状態で攻撃を受けるとそのまま高速に移動するモードになり、ぶつかる相手を敵味方関係なく攻撃します

また、高速移動中は直接通常の徒歩状態に戻ることはなく、敵であるマリオに踏まれるまで高速移動状態です

その他はクリボーといっしょなので共通部分を整理しましょう

親クラス抽出

敵キャラ2種類の共通部分をまとめた親のクラスを作り
その仕様を引き継ぎつつ子供独自の特徴を作る形に変えていきましょう

よっしー
よっしー

ただしまとめなくても作れますし、まとめ方・整理の仕方もいろいろ考えられるので、試行錯誤してみるのもよいと思います

私はこのような親クラス BP_Enemy としました

  • プレイヤーが一定距離まで近づく(起動トリガに触れる)までスタンバイ​
  • (うごきだしたらひたすら)前進​
  • 前方障害物にぶつかったら反転(ヨー軸180度回転)​
  • 踏まれダメージ受けたらつぶれDown​
  • 他のダメージ受けたらひっくり返りDown
よっしー
よっしー

頭部や前後のオーバーラップイベントは親クラス内には定義しないのがポイントです

ダメージの種類でリアクション2分岐するのは親クラスに定義しています(音や変形などのラグドール演出などを共通化)

これで子クラスでは見た目とオーバーラップイベントに集中できます

起動

歩き出す起動用トリガはボックスコリジョンで、キャラクタ本体の後ろに配置してあります
これにプレイヤーが触れたら歩き出します。

しかし単に設置した状態だと、ファイヤーボールともぶつかってしまう問題があります。

よっしー
よっしー

OverlapやHitイベントのOtherActorとして応答してしまうせいです。
コリジョンも含めてキャラクターという扱い

これを避けるため、コリジョン設定でプレイヤーとだけ重なる設定にしました

これにはプレイヤー専用のチャンネルの作成と、
そのチャンネル応答をプレイヤーと起動トリガーに設定が必要です

よっしー
よっしー

詳しくは次回の記事で

準備ができたら、このトリガーとプレイヤーのカプセルコンポーネントに
コリジョンプリセットを設定しましょう

※ BP_ThirdPersonCharacterのカプセルコンポーネントのほうは「PlayerCapsule」に。挿絵は割愛します。

これで起動させられるのはプレイヤーだけになるだけでなく

プレイヤー以外には重なるイベント自体発生しないので、相手がプレイヤーかの判定も不要で処理負荷も減ります。

初期値0の動く方向をX軸-1に変更することで歩き出します。トリガは用済みで削除します。

移動(歩行)

歩く速さはCharacter Move Componentの「Max Walk Speed」で決めていて、ティックで毎フレームこっちに進めと入力して実現しています

クリボーやノコノコはまっすぐ進むだけなのでこれで十分です
もう少し凝った動きをさせたい場合はAI入門の記事もご覧ください

振り向き

カプセルコンポーネントが障害物にぶつかったときの処理です。
ヒット情報からぶつかった向きをみて、Z成分が小さかったら向きを反転させています

よっしー
よっしー

x成分だけ‐1倍にして反転させていますが、3Dで動くゲームにするならXYを反転させたほうがより良いかと。

Z軸なければスカラーで-1倍でOK

Do Once と Delay で挟んでいるのは、高速反転し続けてまったく動けなくなる対策です。
Do Onceは1回動くと閉じる門で、初回は動くけど2連続でイベント発生しても突入できなくなります。Delayの時間経過後に再び門が開きます。

被ダメージ

ダメージ受けたときの処理です
ここも最初に重複対策を入れています

コリジョンをなしにしているのは、やられて消えるまでの間にイベントが起きないようにするためです

よっしー
よっしー

動画ではHeadCollisionが漏れてたので追加しました

こんなふうにひとつのノードでまとめて実行できるものとできないものありますね(;^ω^)

次のIsAでダメージタイプがステップか他かで分岐しています
明示的にダメージタイプで”Step”を受け取ったときだけTrueのルートに進みます

ダメージタイプはコンテンツブラウザ右クリックから「ブループリントクラス」で「DamageType」を親にしたクラス「DamageTypeStep」を作るだけです

いまのところクラスの名前しか見てないので中身はデフォルトのままとしています

これでステップかそうでないかで分岐します。
後半は、

踏まれたときはつぶれる演出で、それ以外の攻撃でやられたときはひっくり返ります

まずPlay Sound 2Dで鳴らす音を分けています。素材は効果音ラボ様。

次は動きです。踏まれたときは踏んだマリオ側が少し浮き上がります
ここでは強制的に Launch Character で打ち上げています
※このタイミングで大きくジャンプできるようにするにはもう一工夫必要です

ひっくり返るルートでは自分自身なのでセルフを打ち上げています
きもち強めにしてふわっと浮き上がって落下です

次が本題のつぶれとひっくり返りです
スケールでメッシュをつぶしています
ひっくり返りはピッチ軸180度です

よっしー
よっしー

専用のアニメーションを用意してplay montageなどの再生でもっと凝った演出するのもいいですね

ただしその場合は敵キャラ共通のリグ付けか、関数化してオーバーライドするみたいな実装面でテクが求められるかも。

つぶれながら移動してほしくないので向きを0にしています
逆にひっくり返るときは横移動は自然にまかせています

Delayはいわゆるラグドールから消えるまでの走馬灯の時間です。
つぶれるときは短めに、ひっくり返るときは落下していく演出なので長めで落ちながら消えます

よっしー
よっしー

なるべく同じような処理を並べてあとで見たときにもわかりやすいようにしましょう

クリボー差分

カメと同じ方法でスケルタルメッシュ化してあります。

クリボーはひたすら歩くだけなので、アニメーションは(自作の)歩くアセットを直接設定しています

  • 敵キャラである​
    • 一定距離まで近づくまでスタンバイ​
    • 前進​
    • 前にぶつかったら反転​
    • 踏まれダメージ受けたらつぶれDown​
    • 他のダメージ受けたらひっくり返りDown​
  • 前後にぶつかったとき​
    • 敵(マリオ)なら相手にダメージ/味方なら無視(反転)​
  • 踏まれたとき​
    • 敵なら自分に踏まれ攻撃/味方なら無視

ほぼ親クラスでできているので、残りを実装しましょう。

踏まれたとき

頭のオーバーラップイベントで、プレイヤーだったら自分を攻撃して親のクラスのAnyDamageを呼び出しています

このときにダメージタイプとして”DamageTypeStep”を指定することで、踏まれた演出側のルートに進むということです

前後にぶつかったとき

あとは体当たりです
前後にぶつかったときに、プレイヤーだったら攻撃してそれ以外は無視でOKです

プレイヤーか判定して攻撃しています

さきほどのプレイヤーオンリーのプリセットを使う手もアリですね

よっしー
よっしー

ただし子クラスで親とコリジョン設定を変えると混乱のもとになるかもしれません。親でそうしちゃうと亀ちゃんの子クラスで変える必要があります。

ノコノコ差分

  • 敵キャラである​
    • 一定距離まで近づくまでスタンバイ​
    • 前進​
    • 前にぶつかったら反転​
    • 踏まれダメージ受けたらつぶれDown​
    • 他のダメージ受けたらひっくり返りDown​
  • 踏まれた時​
    • 徒歩中か高速移動中なら甲羅停止へ​
    • 甲羅停止中なら高速移動へ​
  • 前後にぶつかったとき​
    • 徒歩中かつ相手がマリオなら攻撃/味方なら無視(反転)​
    • 甲羅停止中かつマリオなら高速移動/味方なら無視​
    • 高速移動中なら相手に攻撃​
  • 甲羅停止後数秒で徒歩状態に

亀ちゃんは踏んでもつぶれDownしませんが、それはクリボーの時のように自分でStep攻撃をしなければよいだけです。

カメちゃんも差分のオーバーラップイベントを作りましょう

踏まれた時

まず頭から見ていきます

最初のマクロと最後のカスタムイベントは重複対策ですが、説明は一旦後回しとします

ぶつかった相手がプレイヤーだったら、3つの状態ごとに分岐します
3つの状態を管理するのにもと記事ではフラグを2個使っていましたが、列挙型を使って1つにまとめてみました

Walk 徒歩と Shell 甲羅と Bullet 弾丸の3種類です
※高速移動を弾丸と表現しています

歩いているとき踏まれたら甲羅に閉じこもり
甲羅状態で踏まれたら発射されて
弾丸になっているときでも上から踏まれたら止まります

よっしー
よっしー

甲羅に閉じこもるのと弾丸から甲羅になるのはアニメーション上は違いがありますが、処理上は共通化できます。

そのときの状態変化の詳細はカスタムイベント化しているので、一旦後回しで、

そのあと踏んだプレイヤーをちょっと跳ねさせるのと鳴らす音は、親のダメージ処理と同じです

よっしー
よっしー

※親クラスでカスタムイベント化とかするともっと共通化できますね

本題の状態変化処理をみましょう

甲羅モードになる( ToShellイベント)

イベントの最初で、Set Timer タイマーを使って元(徒歩モード)に戻る予約をしています

これで甲羅状態になってから5秒後にEndShellイベントが発動して徒歩状態になります
※ タイマーを変数に保存しているのはToBulletイベントで予約解除用です

Directionを0にしているのは移動の停止です

状態変数を甲羅にしています
この変数をアニメーションBPからモニタすることで、アニメーションで見た目を甲羅状態に変えます

Max Walk Speed 歩く速度をセットしているのは高速移動時に速くしたのをもとに戻す用です

徒歩モードになる(EndShellイベント)

移動方向をアクターの進行方向にセットしています

よっしー
よっしー

※ブロック下から叩いてひっくり返る状態は作っていませんが
やるなら起き上がる回転もこの辺りに実装ですね

状態変数はWalk 徒歩状態に変えます

よっしー
よっしー

※戻り間際ジタバタさせるにはもう1つ状態が必要ですね

弾丸(高速移動)モードになる(ToBulletイベント)

さきほど甲羅になるときにセットされたタイマーを解除しています

移動方向は頭を踏まれた場合はとりあえず前回の方向に進む仕様としています。
初期値1の変数で、前後のオーバーラップイベントでは変更しています。が、このあたりはプレイヤーとの相対位置でもっとうまくやれそうですね

状態変数は Bullet 弾丸状態で

歩行速度を通常の3倍の900に変更しています(お好みで)

前後にぶつかったとき

残るは前後のオーバーラップイベントです

前か後ろか当たったコリジョンに応じて、甲羅から弾丸になった場合にぶつかられたほうと逆側に進むように変数を更新しています。

よっしー
よっしー

動画では逆になっていたのを修正しました

あとは同じなので、Body Overlapカスタムイベントで共通化してあります。

ここは単純に3状態で3条件に分岐しています

Walk 徒歩中は、相手がプレイヤーか確認して、そうだったらApply Damage で攻撃します
違ったらなにもしない(ので、カプセルがぶつかってお互い反転します)

Shell 甲羅のときは、プレイヤーだったら弾丸になります

Bullet 弾丸のときは、だれでも(プレイヤーじゃなくて味方でも)攻撃します

連続判定対策

残すは重複対策です。カメちゃんの各overlapイベントすべてで最初にマクロ・最後にカスタムイベントがつけてありました。

まず後ろのカスタムイベントは、

0.3秒待って処理中フラグを解除しています

次に手前側のマクロは、

まずコリジョンが複数あると、自分自身とオーバーラップイベントが発生する場合があったので、
自分以外かを判定しています(自分だったらFalse)

次がプレイヤーかの判定で、自分でもプレイヤーでもない場合はTrue(重複対策せずに通過OK)としています

プレイヤーの場合だけ、重複対策しています。
処理中フラグが立っていたらFalseでキャンセルし、そうでなければ処理中フラグを立ててからTrueで通過OKにしています

これでそこそこいい感じに動くようになりました

亀アニメーション

では最後にアニメーションBPをみましょう

通常のBPでいうTick相当のUpdate Animationイベントで、PawnのOwnerをノコノコのクラスにキャストして、状態変数を受け取ってアニメーションBP側での変数に昇格させています。

※もとはフラグを見ていました

イベントグラフはこれだけです。AnimGraphに行きましょう

出力にステートマシンがつないであります。

その中は、

状態3つですが、キャラクター自体の状態とは違っていて、「Walk」徒歩か「Shell」甲羅か「ToShell」甲羅に入る途中かの3つです。
※BulletがなくてToShellが増えています

これは、甲羅と弾丸はアニメーション的には同じ(甲羅に収まっているだけ)なので、区別する必要がありません。
逆に、甲羅に収まろうとするときには、処理のBPでは一瞬で切り替えていますが、アニメーションでは引っ込むアニメーションを再生する時間が欲しいので、状態を分けて管理しています

そしてToShellで引っ込むアニメが1回再生されたら
自動的に次の状態に遷移するフラグにチェックを付けています

あとはさきほど受け取った状態変数をみて、
Walk 徒歩じゃなくなったら甲羅に収まって、
Walk 徒歩になったら歩きのアニメに遷移すれば完成です

つづく

次回はプレイヤー専用コリジョンの作り方を解説します

コメント

タイトルとURLをコピーしました