CG関係の備忘録ブログ

主にZBRUSH、blender

UE5 敵の動きをつくる(追いかけ)

参考動画

【UE4/UE5ゲーム制作講座】ビヘイビアツリーを使ってみよう!【AI入門】 - YouTube

 

敵をつくる
Enemy2フォルダに新規BP→キャラクター
開いて・・・UE5ではうまくいかなかったので、1つ前のやり方でやった

名前をBP_EnemyControler

 

追いかけるに必要なパート

ビヘイビアツリー→ブラックボードを開き、key typeのTargetActor→BaseClassをActor
ビヘイビアツリーのMoveToを選択、BlackboardKeyをTargetActor
Waitを追加し、3秒まつ

 

ブループリント

BP_EnemyControlerを開きイベントグラフのBeginPlayから引っ張り、Runで検索、RunBehaviorTreeを選択、BTAssetにBT_AIEnemy2を指定する

SetValueasObjectでターゲットにGetBrackvoardのReturnValueをつなぐ
RunBehaviorTreeとSetValueasObjectをつなぐ
MakeLiteralNameでValueをSelfActorにして、ReturnValueをSetValueasObjectのKeyNameにつなぐ
ObjectValueをGetaRefarencetoSelf(※後でGetControlledPawnに変更)につなぐ

SetValueasObjectと引数をコピペしてつなぐ
MakeLiteralNameでValueをTargetActor
Selfを削除し、GetPlayerCharacterにする

 

タスクをつくる
新規タスク→BTTask_BlueprintBase、名前をBTT_Jump
左側の関数のオーバーライドプルダウンからReceiveExecuteAIを選択、ControlledPawnから出してCasttoCharacterを出す
CasttoCharacterのAsCharacterからJumpを出す
〃のCastFailedからFinishExecuteを出す

Jumpから引っ張りFinishExecuteを追加し、Successをチェック

 

シーケンスにジャンプとウエイトをつなげて待つパートを作成
追いかけるをRM→デコレーターを追加→ConeCheck
ConeOriginはSelfActor、ObservedはTargetActor
ConeDirectionはコーンの向き。NoneだとConeOriginの向きが使われる

 

※つくったBP_EnemyControlerのSetValueasObjectのObjctValueについてるSelfを削除し、代わりにGetControlledPawnをつなぐと前方を見つけてくれるようになる

 

1つ前のうろうろと組み合わせることもできた

UE5 敵の動きをつくる(うろうろ)

参考動画

【UE5初心者講座】#3 AI機能を使って敵キャラクター(NPC)を作ろう! - YouTube

 

敵の行動範囲を設定
ビュー上の箱+→ボリューム→NavMeshBoundsVolumeで
レベルの中央に配置

詳細のブラシセッティングで大きさを調整しレベル全体が覆われるようにする

Pを押すと敵の行動範囲が緑色で設定される

 

敵キャラクターをつくる
BPフォルダに行き新しいフォルダー→ENEMY
中に入ってブループリントクラス→すべてのクラス→AIで検索→AIControlerを選択→名前をBP_AIControler

ブラウザRM→AI→ビヘイビアツリー名前をBT_AIEnemy
ブラウザRM→AI→ブラックボード→名前をBB_AIEnemy

プレイヤーをEnemyフォルダにコピー

イベントグラフを全部消す
CameraBoom、FollowCameraも消す

(Self)を押し、詳細→ポーン→AIControlerClassを作成したBP_AIControlerしコンパイル

戻って名前をBP_AIEnemy

 

関連付け
AIControlerを開き、イベントグラフのBeginPlayから引っ張り、Runで検索、RunBehaviorTreeを選択、BTAssetにBT_AIEnemyを指定しコンパイル・セーブ

BT_AIEnemyを開き、右側BehaviorTreeのBlackboardAssetにBB_AIEnemyを指定する

 

タスクを作成(ランダムな場所を決めて移動する)
上の新規タスク→名前をBTTask_RandomLocationとし保存
左側の関数のオーバーライドプルダウンからReceiveExecuteAIを選択、ControlledPawnから出してGetActorLocationを出す

Md→GetRandomReachablePointInRadiusを選択、ReturnValueとOriginをつなげ、Radiusを500にする

※GetRandomReachablePointInRadius
Originの位置から半径500内のランダムな位置を取得する
(Originはエネミーの位置を入れている)

RandomLocationから引っ張り、SetBlackboardValueasVectorを選択、ReceiveExcuteAIとSetBlackboardValueasVectorをつなぐ
Keyから変数へ昇格、左側の変数したの名前をTargetLocationKey、表示をオンにする(目のアイコン)
最後にFinishExecuteにつなぐ

GetRandomReachablePointInRadiusのReturnValueとFinishExecuteのSuccessをつなぐ
コンパイル・保存

BT_AIEnemyに戻る
ルートから引っ張り、Sequenceを作成

SequenceからTasks内のBTTask_RandomLocationを選択
SequenceからTasks内のMoveToを選択

右上のブラックボードをクリック、新規キー→Vector、名前をTargetLocationとし保存、ビヘイビアツリーにもどる
BTTask_RandomLocationを選択し、デフォルトのTargetLocationKeyをTargetLocationにする

MoveToを選択し、詳細→ブラックボード→BlackboardKeyをTargetLocationにする

SequenceからTasks内のWaitを選択
Waittimeを5秒→1秒に変更

ビヘイビアツリーを開いた状態でAlt+Pで実行させると、挙動が可視化される

UE5 コントロールリグの作成

参考HP

Unreal Engine のコントロール リグ | Unreal Engine ドキュメント

【UE5】コントロールリグの作成方法 - コンスキブログ

 

スケルタルメッシュをRM→作成する→ControlRig
ダブルクリックでエディタを開く
リグ階層を表示

動かしたいボーンをRM→新規→新しいコントロール
扱いやすくするため、シフト+Pで階層の外に出す
詳細の形状カテゴリのShapeをCircle_Thick、形状トランスフォームで大きさなど調整する

コントロールをグラフにドラッグ→コントロールを取得(GetControl)
ボーンをグラフにドラッグ→ボーンの設定
ビューポートで操作可能になる

2個目以降は、Controlを階層化して、グラフはセットボーンのExecute同士をつなぐ

 

どうやらpythonで操作できるらしい

Unreal Engine におけるコントロールリグでの Python スクリプティング | Unreal Engine ドキュメント


シーケンサーでコントロールをアニメートする
コンテンツブラウザ から コントロール リグ アセット をレベル ビューポートにドラッグ
Sでキーを打つ

 

UE5 今日覚えた事

参考動画

【UE5】使用して約1ヶ月で特に役立った事【Tips集】【VOICEVOX 春日部つむぎ】 - YouTube

 

シフトキーを押しながらOBJを移動すると、カメラも一緒に動いてくれる

alt+移動で複製

シフト+Eで一括選択

Hで非表示、cntl+Hで表示

cntl+LMでX軸回転、+RMでÝ軸回転、LRMでZ

フォルダRMでカラー設定

cntl+0~9でカメラ位置を記憶、0~9で呼び出し(notテンキー)

cntl+Aフォルダ内全選択
RM→アセットアクション→プロパティマトリクスで一斉編集できる→編集後、ファイルからすべて保存を選ぶ

UE5 アニメーションを流用する

キャラクターを動かしてみたくなったので、いきなり高度なことに挑戦してしまった・・・なお、UE4とUE5ではやり方がまったく異なる。(UE4の動画みた時間・・・)

 

参考動画

UE5でのアニメーションの流用方法について【Compatible Skeletons, IK Retargeter】 - YouTube

※後半グダグダ動画だが、手順通りにやったらできた

 

IKRigを作る

①コンテンツブラウザを右クリック、アニメーションのIKRigを選択
右のインポート済みスケルトンでどのスケルタルから作るか指定(流用先を指定)

②リターゲットのルートボーンに対して右クリック
チェックリターゲットルートを選択

③どこが頭、手足かをリターゲットチェインに登録

新しいチェーンを追加する

chain name にspine,どこからどこまでが背骨か指定
以下同
LeftArm
LeftArm
RightLeg
LeftLeg
Headはクビ、頭を指定

ボーンを複数選択して右クリック、newRetargetChainfromSelectedBoneを選択で指定することもできる

 

IKリターゲッタを作る

①コンテンツブラウザを右クリック、アニメーションのIKRetargeterで流用元を選択

②さっき作ったIKRigをTargetIKRigAssetに指定する

③アセットブラウザでアニメーションをダブルクリックしテスト

※ReTargetphasesのチェックを確認する

 

フルボディIKを設定する

さっきのIKRigを開き、ボーンの階層のところで作業

骨盤に当たるボーンを右クリック、選択されているソルバにルートボーンを設定(SetRootBoneonSelectedSolver)を選択

左手のボーンを右クリック、IK目標の新規作成(NewIKGoal)を選択

以下、右手、左足、右足にもIK目標の新規作成を行う

IKリターゲッティングのところで作業

前の③で作ったリターゲットチェインのIK目標で、今作ったIKGoalを指定する

※上のIKRigをつくる流れでこれもやったほうがいいかも

 

デフォルトポーズを合わせる

ポーズの編集ボタンを押し、IKリターゲッタを開き、流用元のデフォルトポーズと流用先のデフォルトポーズをざっくり合わせる

 

ブループリントクラスをつくる

コンテンツブラウザを右クリック、ブループリントクラス→Characterを作成

ビューポートタブで左上のMesh(CharacterMesh)を押し、メッシュに流用元のメッシュを指定

その下層にスケルタルメッシュを追加(コンポーネントの追加ボタン)
流用先のメッシュを指定、オブジェクトが重なっていたら位置を調整する

流用元をクリックし、アニメーションモードをアセットにしてアニメーションを指定

 

Animブループリントをつくる

コンテンツブラウザに戻って流用先のスケルタルメッシュを右クリック、作成→Animブループリント。でダブルクリックで開く

右クリックでノードを追加、メッシュからポーズをリターゲット(ReTargetPosefromMesh)を指定
出力ポーズにつなぐ

※このノードに対して流用元を指定することでも同じことができると言っていたが、そのやり方の説明はなかった(楽するためにもにゃもにゃ・・)

 

AnimClassを設定

コンテンツブラウザに戻ってさっき作ったブループリントクラスを開き、流用先を選択、AnimClassを先ほど作成したAnimブループリントに設定

 

シーンに配置する

コンテンツブラウザに戻ってブループリントクラスをシーンにドラッグアンドドロップで配置。再生ボタンを押すと2人で走りだす

 

※ボーンの構造、特に手足とそれを受ける骨盤、鎖骨の構造が合ってないと、IKをつかうとアニメーションが破断する。

↑IKリターゲッタでReTargetIKオフ、↓IKリターゲッタでReTargetIKオン

 

 

Blender ウエイトの転送方法

簡易的なOBJを用意する

アーマチュアにアタッチ

それにボーン名と同じ頂点グループを設定する

それぞれに1を割り当て

転送元メッシュ→転送先メッシュの順にシフト選択

ウエイトペイントモード

ウエイトメニュ→ウエイトを転送を選択

頂点マッピングを最近接面の補完、
転送元レイヤーの…を名前に指定する