キャラクター

構造

+- Character ... (UE4標準のキャラクタークラス)
  +- BP_CharacterBase ... 全てのキャラクターの共通処理
    +- BP_Player ... プレイヤー
    +- BP_EnemyBase ... 敵共通処理
      +- BP_EnemyA ... 敵

UE標準の "Character" クラスを継承した
"Character/BP_CharacterBase" というブループリントをいわゆる基底として、
その下にプレイヤー、敵などキャラクターごとの独自の処理が書かれています。

UE4はモーションの制御を行うにあたってアニメーションブループリントという専用の仕組みがあるため、
プレイヤー、敵、それぞれにアニメーションブループリントも存在します。

本体の解説

Event Graphを見る分にはそう大きくないので、ここから掘っていってもらえれば分かるかと思います。



入力処理

ボタン入力を自前で生成しています。

UE4は入力がイベントとしてしか受け取れないので、
押した瞬間と離した瞬間のイベント発行時での判断しかできず、
押し続けられているかどうかや、任意時での判定が一切できません。よって自前で作っています。


左右向き

このゲームのキャラクターは内部的には3Dモデルとなっていますが、
作り自体はFlashでよく見る様な多関節スプライトに近いものです。

左右の向き制御が少しクセのある仕様になってまして、
右向き時、モデルの前方軸スケールを-1に反転させています。
普通に回転で左右向きをやった場合、頭や体といった各パーツの優先順位が逆転してしまったのと、
面法線が裏を向いてライトが当たらなくなってしまったため、そんな対処を入れています。
(最終的に、発色がどうしても滲むとのことでライティング自体がオフにされましたが)

この方法は向きを見る時に毎度スケールを加味しないといけなくなるためあまりオススメしません。
マテリアルに向きを渡してUV反転や頂点移動させるといった対処方法もあるかもしれません。


攻撃処理

どつく系アクションとしては攻撃ヒット処理はやはり肝になりましてやや複雑です。

吹っ飛ばされた敵が他の敵に衝突した時のための処理なんかは
敵同士にしか必要がないので、子クラスであるEnemyBaseに定義されており、
親クラスから子クラスの処理へ飛ばします。

C++的には仮想関数でやる所なんですが、
無いっぽかったのでカスタムイベントという機能で実現してます。

アニメーションブループリントの解説

モーション制御用のブループリントで、
最終的なポーズを生成するAnimGraphと、条件遷移を制御するステートマシンがあります。

何もしてなければ "Idle"、移動量が加わると "Walk" ステートへ移って歩きモーション再生という感じ。
モーションブレンド率なども設定できます。

アニメーションブループリントにも通常と同様EventGraphがあります。
ステートマシンで各ステートへ遷移した時にイベントを通知し、EventGraphで受け取ります。
入力による移動の許可とか、攻撃属性とか、ステートによる設定を行っています。

ペルソナと呼ばれるアニメーションエディタ。
モーション中にデータを仕込むにはここで行います。

攻撃判定 "ANS_Attack" は AnimNotifyState というもので、任意のブループリントを呼び出せます。
ここでは "Character/Common/ANS_Attack" を呼び、
この期間中、攻撃判定がキャラクターへ設定されるという作りになっています。