アクションモーションをアニメーションブループリントで制御する

例えばこのようなステートマシンで抜刀モーションを制御したいとする。

アニメーションブループリントを編集

ステートの遷移を制御するためのフラグ変数を定義する。

Unsheatheステートへの遷移条件を定義する。

UnsheatheからIdleへの遷移は、抜刀モーション終了時に遷移させたいので遷移を選択した状態で「Automatic Rule Based on Sequence Player in State」にチェックを入れる。

また、抜刀モーション終了時にフラグ変数をFalseに設定するため、その遷移の通知イベントを作成する。
※「End Transition Event」だと意図通りに動作しないので「Start Transition Event」の方に定義する。

EventGraphでフラグをFalseにする処理を書く。


キャラクターブループリントを編集

EventBeginPlayなどにアニメーションブループリントの参照を取得し保存する処理を書く。

そしてアニメーションを実行したいタイミングでアニメーションブループリントに定義したフラグをTrueにする。


ルートモーションを使用する

アニメーションブループリントでルートモーションを使用する場合、「ClassDefaults > Details > RootMotion」を「Root Motion from Everything」に設定する。

ロックオン時のカーソルを表示する

画像のようなロックオン時のカーソルを表示するようにする。


1. ウィジェットを作成する

[User Interface > Widget Blueprint]から「User Widget」を継承したウィジェットを作成し、「UIW_LockonCursor」と命名する。

CanvasPanelの中にImageを配置し、アンカーを中央にしてカーソルの画像を設定し、大きさを調整する。


2. キャラクターにウィジェットをアタッチする

キャラクターブループリントを開き、Widgetコンポーネントをアタッチする。

アタッチしたコンポーネントの「Detail > User Interface」から以下の設定を行う。

  • 「Space」にScreenを設定し、大きさが変わらないようにする
  • Widget Class」にUIW_LockonCursorを設定する


3. 表示の制御

キャラクターブループリントの初期化のタイミングでロックオンカーソルを非表示にする。

ロックオンのタイミングで表示・非表示を制御する。

キャラクターのアウトラインをハイライトする

以下の画像のように、キャラクターのアウトラインをハイライトさせる方法。


1. ポストプロセスマテリアルを作成する。

新規マテリアル「M_HighlightOutline」を作成し、開く。
「Home」をクリックした状態で以下の設定を行う。

  • 「Details > Material > Material Domain」をPost Processに設定
  • 「Details > Post Process Material > Blendable Location」をBefore Translucencyに設定

そして以下のようにノードを組む。




「M_HighlightOutline」からマテリアルインスタンス「MI_HighlightOutline」を作成する。


2. Post Process Volumeをレベルに配置する

Post Process Volumeをレベルに配置する。

レベルに配置したPost Process Volumeを選択して「Details > Post Process Volume Setting > Infinit Extent (Unbound)」にチェックを入れてレベル全体に適応させる。

また「Details > Rendering Features > Post Process Materials」に作成したマテリアルインスタンスを設定する。


3. アウトライン表示を制御する

アウトライン表示させたいものに対して「Set Render Custom Depth」でValueをTrueに設定する。
「Set Custom Depth Stencil Value」の値を0にすると1つめに設定した色で、1にすると2つ目に設定した色で表示される。

レベルアップシステムを作成

技能ごとにレベルを定義し、現在のレベルに合わせたパラメータを使用するシステムを作成する。

1. レベルごとのパラメータを定義

レベルによって変化するパラメータを構造体に定義する。
[Add > Blueprint > Structure] から「S_Ability_Attack」を作成する。

データテーブルにレベルごとのパラメータの値を定義する。
[Add > Miscellaneous > Data Table] から作成した構造体を使って「DT_Ability_Slash」を作成する。
「RowName」がレベルになる。


2. 列挙体に技能名とパラメータ名を定義

レベル管理をする技能の対象を列挙体に定義する。
[Add > Blueprints > Enumeration] から「E_AbilityName」を作成する。

パラメータの一覧を列挙型に定義する。
[Add > Blueprints > Enumeration] から「E_AbilityValue」を作成する。


3. レベルごとのパラメータをセットする関数を作成

キャラクターベースのブループリントを開く。

以下の変数を作成する。

「AbilityLevel」は技能ごとのレベル、「AbilityExp」は技能ごとの獲得経験値、「AbilityValue」はそのレベルにおける技能ごとのパラメータの値を格納する。
「AbilityLevel」と「AbilityExp」のキーはE_AbilityNameで、「AbilityValue」のキーはE_AbilityValue

現在のレベルを取得し、データテーブルからパラメータの値を取得する関数「SetAbilityValue」を作成する。


4. レベルと経験値の取得処理

将来セーブ機能を実装した時のために、現在のレベルと経験値は「BP_GameManager」から取得するようにする。

「BP_GameManager」を開き、レベルを管理するキャラごとにレベルと経験値を格納する変数を作成する。

レベルを管理するキャラごとにゲッター関数を作成する。

次にレベルを管理する各キャラクターのブループリントで、レベルと経験値を取得し各パラメータの値をセットする処理を書く。

敵キャラ等のレベルが固定のキャラに関しては、キャラの種類ごとにレベルを定義したデータテーブルを作成した上で、キャラクターブループリントに以下のようにパラメータをセットする。

剣のスイング音を付ける

剣のスイングに合わせてSEを鳴らす方法。

1. SoundCueを設定

ピッチを毎回ランダムに変える

SoundCueを開き、Outputの前にModulatorノードを追加して以下のようにPitchの範囲を設定する。
ピッチが上がると再生速度も速くなる。


距離によって減衰させる

[Add > Sounds > Sound Attenuation] から「ATT_Longsword」を作成し、音量減減衰設を作成する。

そしてSoundCueを開いて「ATT_Longsword」を設定する。

SEをランダムに選択する

SoundCueを開き、Randomノードを使用して再生するSEをランダムにできる。

Randomノードを選択して重みなどを設定する。
[Randomize Without Replacement] はtrueにすると非復元抽出となり、falseにすると復元抽出になる。

2. モンタージュサウンドを設定

モンタージュに「PlaySound」Notifyを追加する

そして追加した「PlaySound」Notifyを選択し、[Detail > Anim Notify > Sound] にSoundCueを設定する

マウスカーソルの地面との接点にマーカーを表示する

マウスカーソルと地面との接点に画像のようなマーカーを表示する。


1. マーカーのマテリアルを作成

マテリアル「M_GroundHoverMarker」を作成する。

「M_GroundHoverMarker」からマテリアルインスタンス「MI_GroundHoverMarker」を作成する。


2. マーカーのアクタを作成

[Actor]を継承したブループリント「BP_GroundHoverMarker」を作成し、開く。

StaticMeshを追加し、メッシュに「Shape_Cylinder」を、マテリアルに「MI_GroundHoverMaker」を設定する。


3. UIマネージャに関数を作成

「BP_UIManager」を開く。
マーカーを生成する関数「GenerateMouseGroundHoverMarker」を作成する。

マーカーを移動させる関数「ShowMouseGroundHoverMarker」を作成する。

[SetInputModeGameAndUI]ノードがないとマウスを動かしたときに視点が動いてしまうので設定しておく。

イベントグラフで「ShowMouseGroundHoverMarker」をEventTickにつなげておく。

マーカー削除用の関数「DestroyMouseGroundHoverMaker」も作成しておく。

[SetInputModeGameOnly]ノードで[SetInputModeGameAndUI]ノードの設定を解除する。

4. 関数の実行

プレイヤーコントローラー等、マーカーを表示させたい所で「GenerateMouseGroundHoverMaker」関数を実行する。

マーカーを非表示にしたい所で「DestroyMouseGroundHoverMaker」関数を実行する。