参考動画
【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