CG関係の備忘録ブログ

主にZBRUSH、blender

UE4 AIの移動スピードを距離に応じて変動させる

参考動画

【UE4でTPSゲーム制作実況】#21 AIがプレイヤーを見つけた時、その距離に応じてスピードを変化させる処理【メタルギアソリッドをUE4で作る】 - YouTube

 

デコレーター

IsTargetActorSet?→実装済

IsHasLineOfSightSet?→実装済

BTDeco_IsTargetFer?

 

タスク

BTTask_SprintMoveto

既存タスク

Moveto(TargetActor)

Wait

 

インターフェイス

EnemyAIInterface

 

BTDeco_IsTargetFer?

※変数はすべてパブリック

ビヘイビアツリーの上のボタンを押してデコレーターを追加→BTDeco_IsTargetFer

開きFunctionのOverrideからPaformConditionCheckを追加

ControlledPawnから引っ張りGetActorLocation、から引っ張りVectorLength

RM→GetBlackBoardValueasActorを追加、Keyから変数を追加し名前をTargetActorKey

GetBlackBoardValueasActorのReturnValueからGetActorLocation→VectorLength

2つのVectorLenghを引き算してAbsをつなぎ>=で比較、下の値は変数にして名前をDistance

比較の結果をReturnValueにつなぐ

 

BTTask_SprintMoveto

新規タスク→デコレーターを追加→BTDeco_IsTargetFer?

デコレーターの詳細→DefaultのDistanceの値を100

Lowerに設定

開いてEventReceiveExecuteAIを追加→ChangeWalkSpeedを追加、ControlledPawnとTargetをつなぐ

Speedから引っ張り変数にしてSprintSpeed、型はFloat、パブリック

ChangeWalkSpeedから引っ張りAIMoveToを追加

TargetActorから引っ張りGetBlackBoardValueasActorを追加、Keyから引っ張り変数にしてTargetActorKey、パブリック

OnSuccessから引っ張りChangeWalkSpeedを追加、FinishExecuteにつなぎSuccessにチェック、Speedから引っ張り変数にしてJogSpeed、TargetとEventのControlledPawnをつなぐ

EventのControlledPawnとPawnをつなぐ

SprintSpeed、JogSpeedのデフォルト値はビヘイビアツリーの詳細で入力する

 

イベントReceiveAbortAIを追加→引っ張りChangeWalkSpeed追加、SpeedはJogSpeed、TargetとEventのControlledPawnをつなぐ。

FinishAbortをつなぐ

 

EnemyAIInterface

AddNew→名前をChangeWalkSpeed

詳細→InputにSpeed、型をFloat

 

ビヘイビアツリー

タスクにもデコレーターつけられる

TargetActorなどの初期設定を忘れずに

 

BP_EnemyAI

上にあるメニューボタンからClass Settingsを選択し、
DetailsのInterfacesにある、Implemented InterfacesにあるAddボタンを押す

ファイル名EnemyAIInterfaceを選択する

コンパイル・セーブ

 

EventChangeWalkSpeedを追加、引っ張りTimeLineを追加、名前をUpdateTimeLine、PlayFromStartにつなぐ。UpdateからSetMaxWalkSpeedにつなぐ

RM→FInerpToを追加、CharacterMovementをドラッグして配置、引っ張りGetMaxWalkSpeedを追加、Currentとつなぐ

TargetとEventのSpeedをつなぐ

GetWorldDeltaSecondとDeltaTimeをつなぐ

InerpSpeedの値を5にする

ReturnValueからSetMaxWalkSpeedにつなぐ

 

CharacterMovementをドラッグして配置、引っ張りSetMaxWalkSpeedを追加、

 

※以下は実装済

 

IsTargetActorSet?は既存の実装と同じだった

ComponentにAIPerception追加→設定

OnTargetPerceptionUpdate→PerceivedActor変数にSet、BeginPlayからGetPlayerCharacterも変数に格納し、AIPerceptionStimuliのSuccessfullySensedとAND比較

Falseの場合、TimeLineで5秒たったら忘れる→忘れたらUpdateTargetActorを呼び出す

※もしかしてBlackboardを呼び出す関数と同じか?

BeginPlayからGetControllerでEnemyAIControllerを変数に格納

UpdateTargetActorのTargetにEnemyAIControllerをつなぐ

TargetActorは消去するためなにもつなげない

SetTimerbyEventから引っ張り変数TargetLostTimeにSet、ReturnValueとつなぐ

TargetLostTimeから引っ張りUpdateHasLineOfSightKeyを追加

TargetにEnemyAIControllerをつなぐ

 

Trueの場合、ClearandInvalidateTimerbyHandle、HandleにTargetLostTimeをつなぐ

から引っ張りUpdateTargetActorを呼び出す

TargetにEnemyAIControllerをつなぐ

TargetActorにPerceivedActorをつなぐ

から引っ張りUpdateHasLineOfSightKeyを追加

TargetにEnemyAIControllerをつなぐ

Booleanにチェック

 

インターフェイス

RM→BluePrint(BluePrintClassではない)→BluePrintInterface

名前をBP_EnemyAIConInterface

つくる理由:BP_EnemyAIにパーセプションのノードを書く→誰を見たかの情報をBP_EnemyAIConに渡す→BP_EnemyAIConからBlackboardの情報を書き換えるため

 

開いてFunctionの名前をUpdateTargetActorKey

InputをTargetActor、型はActor

AddNewを押し、名前をUpdateHasLineOfSightKey

InputをHasLineOfSight、型はBoolean

 

EnemyAIControllerを開く

EventBeginPlayからRunBehaviorTreeの状態

上のClassSettingsボタンを押す、詳細→Interface→ImplementedInterFaceのAddボタンを押す、BP_EnemyAIConInterfaceを選択、コンパイル・セーブ

Eventとして呼び出せるようになる

EventUpdateTargetActorKeyから引っ張りSetValueasObject、TargetはBlackboard

EventUpdateHasLineOfSightKeyも同様

※やってることは一緒

 

EnemyAIを追加して詳細→Actor→Tags→+→Path_B