六一的部落格


关关难过关关过,前路漫漫亦灿灿。




说明

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}

在C++中运行行为树和为NPC转向添加过渡



说明

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}