ラグドールから立ち上がる方法!
「MovementAnimsetPro」の起き上がりアニメーションを使った
ラグドールから起き上がる処理を紹介します。
~目次~
- アセットの追加
- リターゲット
- Montageの作成
- BPインターフェースを作成
- ThirdPersonCharacter
- AnimBP
- AnimNotifyStateの作成
- AnimNotifyStateをMontageに追加
- 実際にプレイ!けど・・・
- 物理アセットの編集
- 改めて実際にプレイ!
アセットの追加
まずは、「MovementAnimsetPro」をプロジェクトに追加します。
リターゲット
「MovementAnimsetPro」フォルダ内にある「Mesh」フォルダの中の
「UE4_Mannequin_Skeleton」を開きます。
リグを「Humanoid」にし、下にある「ポーズを変更」をクリックし
「現在のポーズを使用する」を選択します。
次に、サードパーソンのボーンも同じ設定にしていきます。
「Mannequin」フォルダ内にある「Mesh」フォルダ内の
「UE4_Mannequin_Skeleton」を開きます。
リグを「Humanoid」にします。
「MovementAnimsetPro」フォルダ内にある「RootMotion」フォルダにある
「GetUpFromBack」と「GetUpFromFace」を選択し、右クリックします。
「Animアセットとリターゲットを複製する」を選択しましょう。
「UE4_Mannequin_Skeleton」を選択し、リターゲットしましょう。
コンテンツブラウザ内に、「UE4_Mannequin_Skeleton」でリターゲットされたアニメーションがあるはずです。
Montageの作成
「GetUpFromBack」と「GetUpFromFace」で、AnimMontageを作成します。
これで、ラグドールから起き上がる為のAnimMontageが作成できました。
作成したMontageを開いて、BlendInのBlendTimeを「0」にします。
BPインターフェースを作成
BPI_AnimBP
AnimBP用のBPインターフェース「BPI_AnimBP」を作成します。
開いて、「SetRagdoll」イベントを作成します。
Bool型のインプットピンを追加します。
BPI_Character
CharacterBP用のBPインターフェース「BPI_Character」を作成しましょう。
「BPI_Character」を開き、「IsGetUp??」イベントを作成します。
Bool型のインプットピンを追加します。
ThirdPersonCharacter
「ThirdPersonCharacter」を開きます。
BPインターフェースの追加
作成したBPインターフェース「BPI_Character」を追加します。
変数の作成
変数を作成します。
~Ragdoll~
デフォルト値「False」
Trueの場合、ラグドール化してる。
Falseの場合、ラグドール化してない。
~PelvisBone~
デフォルト値「Pelvis」
~RagdollLocation~
Pelvisの位置を示す変数。
~RagdollRotation~
Pelvisの向きを示す変数。
~RagdollFaceUp~
Trueの場合、仰向け。
Falseの場合、うつ伏せ。
~RagdollOnGround~
Trueの場合、地面についてる。
Falseの場合、空中。地面についてない。
~GetUp~
Trueの場合、起き上がりモーション中。
Falseの場合、起き上がりモーション中ではない。
ラグドール処理の作成
「Q」キーを押した時、
カスタムイベント「EnabledRagdoll」と「DisabledRagdoll」を呼び出す。
「EnabledRagdoll」は、ラグドール化する為の処理。
「DisabledRagdoll」は、ラグドールを解除する処理です。
EnabledRagdoll
カスタムイベント「EnabledRagdoll」の処理です。
Sequenceノードで、順番に処理を行ってます。
Then0
Then1
Then2
Then3
EventTick
ラグドール中の場合、CapsuleComponentの位置と向きを調整するカスタムイベント「SetCapsuleLocationAndRotation」を呼び出す。
SetCapsuleLocationAndRotation
Sequenceノードで、処理を順番に実行してます。
Then0
Then1
Then2
トレースを地面に向かって飛ばす。
CapsuleComponentの位置と向きを調整。
DisabledRagdoll
ラグドール状態から起き上がるカスタムイベント「DisabledRagdoll」の処理です。
Sequenceノードで、順番に処理を実行してます。
Then0
SnapshotNameを「RagdollPose」に設定します。
Then1
Then2
RagdollFaceUp変数がTrueの時は、仰向けから起き上がるモンタージュを
Falseの時は、うつ伏せから起き上がるモンタージュを再生するようにしています。
Then3
Then4
イベント「IsGetUp??」の追加
ラグドール状態からの起き上がりアニメーション中は、GetUp変数はTrueになります。
このイベントは、AnimNotifyStateから受け取るイベントになります。
起き上がりアニメーション中は、ジャンプが出来ないようにします。
AnimBP
「ThirdPerson_AnimBP」を開きます。
BPインターフェースの追加
作成したBPインターフェース「BPI_AnimBP」を追加します。
イベント「SetRagdoll」の追加
BPI_AnimBPで作成したイベント「SetRagdoll」をイベントグラフに追加し
Ragdollピンを変数へ昇格します。
Animグラフ
新規のステートマシーン「Ragdoll」を作成し
Ragdoll変数を繋いだ「ブレンドPosesByBool」ノードで処理の分岐を行います。
ステートマシーン「Default」がFalse。
ステートマシーン「Ragdoll」がTrueです。
Trueブレンド時間と、Falseブレンド時間は「0.5」です。
ステートマシーン「Default」
ステート「Idle/Run」を開きます。
スロットノードを追加します。
これでモンタージュが再生されるようになりました。
ステートマシーン「Ragdoll」
ステートマシーン「Ragdoll」を開き
ステートを2つ追加します。
「Entry」と「RagdollPoseSnapShot」をお互い線で繋ぎましょう。
2つのトランジションルールを選択し、
詳細パネルのブレンド設定項目にある「継続時間」の値を「0」にします。
EntryからRagdollPoseSnapShotのトランジションルール
RagdollがFalseになったら、RagdollPoseSnapShotへ遷移します。
つまり、ラグドールから起き上がる時に、RagdollPoseSnapShotへ遷移するという意味です。
RagdollPoseSnapShotからEntryのトランジションルール
RagdollがTrueの時にEntryへ遷移します。
つまり、ラグドール化した時に、Entryに遷移するという意味です。
ステート「RagdollPoseSnapShot」
ステート「RagdollPoseSnapShot」を開きます。
ポーズスナップショットノードを追加します。
SnapshotNameを「RagdollPose」に設定します。
AnimNotifyStateの作成
AnimNotifyState「GetUp_AnimNotifyState」を作成します。
Received_NotifyBeginとReceived_NotifyEndを追加します。
変数は「GetUp」という名の編集可能にしたBool型変数を追加します。
Received_NotifyBegin
Received_NotifyEnd
AnimNotifyStateをMontageに追加
起き上がりアニメーションMontage「GetUpFromBack」と「GetUpFromFace」を開き
通知のところに、作成したAnimNotifyState「GetUp_AnimNotifyState」を追加します。
起き上がり始めてから、起き上がった瞬間まで、通知を伸ばしています。
追加した「GetUp_AnimNotifyState」を選択し、詳細パネルにある
GetUpにチェックをつけ、Trueにします。
実際にプレイ!けど・・・
実際にプレイしてみましょう!
何か変ですよね。
ラグドールは良いんですが、そこから起き上がる時
キャラが横に倒れたまんま起き上がりアニメーションをして、色々おかしなことになっています。修正しましょう。
物理アセットの編集
「SK_Mannequin_PhysicsAsset」を開きます。
スケルトンツリーのオプション内にある
「すべてのボーンを表示」を選択します。
Rootボーンを選択し、右クリックして
球形を追加します。
Rootボーンに、球形のボディが追加されました。
追加したボディを選択し、詳細パネルの設定をします。
「PhysicsType」を「Kinematic」
「CollisionReponse」を「Disabled」
Spheresの半径を「7.5」にします。
追加したボディを選択し、コンストレイントから「Pelvis」を選択します。
追加したコンストレイントを選択し
詳細パネルの「LinearLimits」の
「XMotion」「YMotion」「ZMotion」を全部「Free」にします。
改めて実際にプレイ!
改めて実際にプレイしてみましょう!
今度は、しっかりラグドール状態から起き上がってくれました!
それではまた!^^ノシ