在C++中运行行为树和为NPC转向添加过渡
2023年10月21日 2024年1月11日
说明
Smooth Character Rotation
在C++中运行行为树; NPC转向时有过渡
补充遗漏
让NPC移动到指定位置
那一节: 提供了允许游戏角色同时在场景中添加和代码中生成的方法; 以及在代码中设置AI控制器类的方法
添加构造函数
public
ShootThemUp: AI/STUAICharacter.h
1ASTUAICharacter(const FObjectInitializer &ObjInit);
ShootThemUp: AI/STUAICharacter.cpp
1#include "AI/STUAIController.h" 2 3ASTUAICharacter::ASTUAICharacter(const FObjectInitializer &ObjInit) : Super(ObjInit) 4{ 5 AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned; 6 AIControllerClass = ASTUAIController::StaticClass(); 7}
在C++中运行行为树
- 添加属性: 保存行为树资产
可以作为控制器的逻辑, 也可以作为游戏角色的逻辑; 由于控制器控制多个游戏角色, 其有自己的行为树逻辑, 所以, 更适合放在游戏角色
public
ShootThemUp: AI/STUAICharacter.h
1class UBehaviorTree; 2 3UPROPERTY(EditDefaultsOnly, BlueprintReadWrite) 4UBehaviorTree *BehaviorTreeAsset;
- 运行行为树
在OnPossess函数中; 在游戏中会被多次调用; 控制器每次切换游戏角色时调用
protected
ShootThemUp: AI/STUAIController.h
1virtual void OnPossess(APawn *InPawn) override;
ShootThemUp: AI/STUAIController.cpp
1#include "AI/STUAICharacter.h" 2 3void ASTUAIController::OnPossess(APawn *InPawn) 4{ 5 Super::OnPossess(InPawn); 6 7 const auto STUCharacter = Cast<ASTUAICharacter>(InPawn); 8 if (STUCharacter) 9 { 10 RunBehaviorTree(STUCharacter->BehaviorTreeAsset); 11 } 12}
查看
BP_STUAIController
-
移除行为树逻辑
BP_STUAICharacter
-
设置行为树资产
BT_STUCharacter
-
移除Wait任务
游戏角色转向突兀
在蓝图中设置NPC转向时过渡
BP_STUAICharacter
-
CharacterMovement > Details > Character Movement(Rotation Settings)
勾选Use Controller Desired Rotation: 旋转时在Tick函数中插入旋转过渡设置旋转插入比例: Z = 200
-
BU_STUAICharacter > Details > Pawn
, 取消Use Controller Rotation Yaw的勾选
在C++中为NPC转向添加过渡的方法
FRotator中分量的顺序依次为: Pitch Y
, Yaw Z
, Roll X
ShootThemUp: AI/STUAICharacter.cpp
1#include "GameFramework/CharacterMovementComponent.h" 2 3// ASTUAICharacter 4 5bUseControllerRotationYaw = false; 6if (GetCharacterMovement()) 7{ 8 GetCharacterMovement()->bUseControllerDesiredRotation = true; 9 GetCharacterMovement()->RotationRate = FRotator(0.0f, 200.0f, 0.0f); 10}