[UE4]Control Rig機能調査:LookAt(Aim)をゲーム中に使う

ここはControl Rig機能調査の子頁です

LookAt(Aim)をゲーム中に使う

設計

  • 要件

    • Characterに対して特定のActorを注目する指示が出せるようにしたい

  • 構成

    • Character Blueprint(以下キャラBP)

    • キャラBPの所有Skeletal Meshに設定するAnimation Blueprint(以下ABP)

    • ABPのAnim Graphに設定するControl Rig(以下Rig)

  • 責任

    • キャラBP

      • 外部(今回はLevel BP)から注目状態(開始・終了)と注目対象Actorの指示を受ける

      • 注目対象Actorから注目Transformを作る

      • ABPに注目状態と注目Transformを渡す

    • ABPは貰った情報をRigに流す

    • Rigは最新の注目状態と注目Transformを用いてキャラの姿勢を更新する

※今回はこのようにするが、どのProjectでも最適な設計というわけではない。全員が納得するまで責任を押し付けあおう。

Control Rig側の準備

  • Control RigのMy Blueprintタブから変数作成

    • 注目状態を決めるbool変数

    • 注目TransformとしてTransform変数(World Space)

      • ↑2つは外部からの設定用として、公開変数(Instance Editable)にする

    • 注目TransformComponent Spaceに変換したTransform変数(Component Space)

    • Controlを使うか注目Transformを使うかを決めるbool

    • Aimの割合を示すfloat

  • Sequenceノードを活用して、Aim処理の前にAimTargetとAimRatioの初期化を行っておく

  • Controlの代わりに、Component SpaceのTransformでAim処理させる

  • IsAimingfalseの時は元の姿勢を保つようにする

    • AimRatioを初期化用のSetTransformに適用

    • Aimノードにも適用

      • Curve値とMutiplyしておけばよい

Animation Blueprintの準備

  • お手元のEpic Skeleton対応のキャラクターなら何でもOK

  • ここではBlueprintちゃんのABPを改造して使う

    • コピーしてオリジナルは残すことを推奨

  • AnimGraphでControl Rigノードを作り、作成したRigを適用

  • Control RigノードのDetails欄で制御用変数のUse Pinを有効化

  • Set Ref Pose from Skeletonを有効化

    • グレイマンSkeletonのInitial TranformでRigを作っている為

  • ABP用のbool変数、transform変数を作成してRigに接続

  • キャラBPから呼び出すための関数も作成

    • 要件によってはBlueprint Inerfaceにしてもよい

  • ABPのEdit Previewでパラメータをいじって挙動を確認

    • なんか無限にたこやき要求されている気持ちになる

キャラクターBPの準備

  • これもBlueprintちゃん付属のBPを使う

    • コピーしてオリジナルは残すことを推奨

  • Begin Playで先ほど作成したABPの参照を変数に保存

    • Blueprint Interfaceを使う場合は不要

  • 注目対象Actorを指定するSetAimTargetイベントを作成

  • 常に最新のActor位置を追従できる様に、Delay 0を使ってループするAimLoop処理を作成

    • Delayを使ったLoopについてはDelayメモを参照

  • 動作確認

    • Levelに適当なActorを配置

    • Level Blueprintで適当なInput Eventを作成し、注目処理を呼び出し

  • アイドリングアニメーションの首振りに影響されず注視できるはず

注目を滑らかにする

  • 開始と終了でカクっと動くのをどうにかしたい

  • あと目標がワープするとやっぱりカクっと動くのでどうにかしたい

  • AimRatio初期化時にAccumulate Lerpで徐々に変化させる

  • AimノードをAim Mathノードに置き換えて、その出力をこれまたAccumulate Lerpで徐々に変化させる