UE4でMAYAやBlenderを使用せずに既存アセットの組み合わせでアニメーションを作成する。
今回はゲーム作成などを作成する際にMAYAやBlenderなどのDCCツールを一切使用せずにUE4上の機能を使用してアニメーションを作成していく方法を紹介します。
使用環境
今回使用したものはUnrealEngine4のVersion4.22.3です。
使用アセット
使用アセットは以下のとおりです
使用するアニメーション
以下の2つのアニメーションを使用します。
Anim_Talkingの上半身のパーツとAnim_Sit_Bench1の下半身のパーツ組み合わせて以下のようなアニメーションを表示します。
作成手順
作成する手順としては
- アニメーションをブレンド
- アニメーションの書き出し の2つになります。
それでは解説に移ります。
アニメーションをブレンドする。
UE4にはアニメーションをブレンドする「Layered blend per bone」というノードがあります。(エディタが日本語の場合はボーン毎のレイヤードブレンドで表示されます)
Layered blend per bone
LayerSetUpで指定したボーンの下の階層から
BasePoseピンにつなげたアニメーションとBasePoses0ピンにつなげたアニメーションをBlendWeightの値でブレンドします。
BlendWeight=0なら ブレンドなし
BlendWeight =1なら BasePoses0ピンのアニメーションをブレンド
(もし間違っていましたらコメント下さい)
※ドキュメント
https://docs.unrealengine.com/en-US/Engine/Animation/NodeReference/Blend/index.html
それでは実装します。
まずはAnimationMontageを作成する際に指定したSkeltalMeshのAnimationBlueprintを作成します。
今回はMyAnimBlueprintという名前で作成しました。
作成したMyAnimBlueprintを開きアニムグラフから「Layered blend per bone(ボーン毎のレイヤードブレンド)」ノードを作成します。
次にアセットブラウザタブからAnim_Talking_1とAnim_SitBench_1をドラッグ&ドロップしBasePoseピンにAnim_Talking_1をBlendPoses0ピンにAnim_SitBench_1ピンをつなぎBlendWeightを1.0にします。
そうすると次のような画面になります
まだこの段階ではAnimTalking_1のアニメーションが流れたままです。
次からブレンドさせていきましょう。
「Layered blend per bone(ボーン毎のレイヤードブレンド)」を選択し詳細タブからLayerSetUpを選択しBranchFiltersのエレメントを追加します。
エレメントを追加すると次のような画面になります。
ここで指定するボーン名はアニメーションをブレンドさせるボーンの起点になります。
ここで指定したボーン階層より下の階層のボーンがブレンドされます。
わかりにくいと思いますので今回のアニメーションに例えてみましょう
今回はAnimTalking_1の上半身の部分とAnim_SitBench_1の下半身の部分を組み合わせたアニメーションを作成したいです。
ボーン構造を見るために一旦スケルトンを開きます。
スケルトンを開くと左側にボーン構造が表示されています。
今回は足の部分でブレンドをさせたいので
thigh_l
thigh_r
の部分になりますね
再度MyAnimBlueprintを開き「Layered blend per bone(ボーン毎のレイヤードブレンド)」を選択して先程のBoneNameの部分にthigh_lを記述します。
このままでは左足のみブレンドになってしまうのでBranchFiltersのエレメントをもう一つ追加しBoneNameにthigh_rを記述します。
これでコンパイルをかけると以下画面にようになります。
これでアニメーションのブレンドが完了しました。
次にこのアニメーションの書き出しを行います。
UE4のアニメーションには録画機能があり
アニメーション中に録画ボタンを押すとAnimatioBlueprint中のアニメーションを録画し、アニメーションシーケンスに書き出すことができます。
MyAnimBlueprintを開きプレビュー画面の下に以下のようなボタンがあります。
左から録画ボタン
再生・一時停止ボタン
次へボタンになります
再生・一時停止ボタンを押下しアニメーションを止め
現在再生されているアニメーションを最初の初期位置に戻します。
※一時停止ボタンを押すと上記画面のように一時停止ボタンのアイコンが再生ボタンに変更されます。
次に録画ボタンを押下し、新規のアニメーションシーケンスを保存する場所を指定します。
今回はMyAnimationという名前で保存しました。
場所を指定すると録画が開始するのでアニメーションが1モーション終わったところで録画ボタンを押せば書き出し完了です。
※アニメーションの録画が成功した際には画面右下に以下のようなウィンドウが出ます。
無事に書き出されました。
最後にアニメーションの切り取りを行います。
録画した際は止まっている状態から録画されているので最初から数フレームはとまったままで表示されています。
これでは良くないので止まっている部分を切り取ります。
先程作成したMyAnimationを開きます。
アニメーションが再生されているので一番下にあるシークバーを選択します。
アニメーションを停止させ、シークバーでアニメーションが停止している部分で右クリックをしフレーム0~n値まで削除を選択します。(サンプルでは48フレームでした。)
以上でアニメーションの作成が完了です。
あとは従来のアセットの通りにアニメーションを組み込むことができます。
また今回スケルトンデータが同じものでやりましたが、ボーンのリターゲットを行えば同じような方法でアニメーションブレンドができると思います。
※検証はしていないです。
最後に
この機能を使用しぷちコンにゲームを応募しました。
動画がありますのでご覧下さい。
ダウンロードリンクは以下にありますのでよければ遊んでください。
https://drive.google.com/open?id=1JX7Q90UQFPyznw3ERsZ2PO4xqt5dG7_N
UE4 Loopool備忘録(壁づりベクトルを反射ベクトルにする)
ヒストリア様主催のぷちコンで以下のゲームを作成しました。
オリジナルルールのピンボールゲームなのですが、そこで詰まった部分等を備忘録として残していこうと思います。
今回はボールの反射についてです。
UnrealEngine4では物理操作をエンジンに組み込んでいるので
そこまでつまらずに作成できるかなと踏んでいましたが、
作成途中こんな現象が起こりました。
理想としてはボールが壁にあたった時に反射角にボールを移動させたいのですが、反射せずに壁にそって移動してしまいます。
これを反射角に移動させたい場合はプロジェクト設定を変更する必要があります。
プロジェクト設定→エンジン→Phisycsから
「BounceThreholdVelocity」の値を0に設定します。
※デフォルトは200
このオプションはオブジェクトを反射させる際に、最低限必要な速度の値を設定します。
(間違っていたら指摘ください)
デフォルトでは200になっているので、反射させるにはボールの速度が200必要になります。
今回のゲームの仕様では速度に関係なく反射させたかったので、0に設定しました。
これを設定した動作が以下のようになります。
理想通りに反射角に移動することができました。
作成してるゲーム等で反射が思っていた動作と違う際に確認してみると良いかもしれません。