六一的部落格


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




说明

视角旋转
垂直方向 抬头低头 Camera绕Y轴旋转 鼠标垂直方向位移决定旋转角度
水平方向 环顾左右 Camera绕Z轴旋转 鼠标水平方向位移决定旋转角度

绑定旋转键位

虚幻编辑器

项目设置 > Engine > Input

轴映射

函数描述 键位
LookUp MouseY
TurnAround MouseX



实现视角旋转逻辑

C++

- 回调函数签名
BindAxis void handler(float Amount)
函数描述 回调函数
LookUp LookUp AddControllerPitchInput 绕Y轴旋转,增加Y轴旋转角度(Pitch)
TurnAround TurnAround AddControllerYawInput 绕Z轴旋转,增加Z轴旋转角度(Yaw)

搭建框架

  1. 添加空函数

    ShootThemUp: Player/STUBaseCharacter.cpp
    1void ASTUBaseCharacter::LookUp(float Amount) {}
    2void ASTUBaseCharacter::TurnAround(float Amount) {}
  2. 绑定函数描述和回调函数

    ShootThemUp: Player/STUBaseCharacter.cpp
    1// SetupPlayerInputComponent
    2PlayerInputComponent->BindAxis("LookUp", this, &ASTUBaseCharacter::LookUp);
    3PlayerInputComponent->BindAxis("TurnAround", this, &ASTUBaseCharacter::TurnAround);
  3. 添加函数声明

    ShootThemUp: Player/STUBaseCharacter.h
    • private

添加静态日志类型

ShootThemUp: Player/STUBaseCharacter.cpp

1DEFINE_LOG_CATEGORY_STATIC(LogBaseCharacter, All, All);

实现回调函数

ShootThemUp: Player/STUBaseCharacter.cpp

 1void ASTUBaseCharacter::LookUp(float Amount)
 2{
 3    AddControllerPitchInput(Amount);
 4    UE_LOG(LogBaseCharacter, Log, TEXT("LookUp Amount: %f"), Amount);
 5}
 6
 7void ASTUBaseCharacter::TurnAround(float Amount)
 8{
 9    AddControllerYawInput(Amount);
10}

编译ShootThemUp并运行

  • 视角可以在水平方向旋转, 身体跟随旋转

  • 无法在垂直方向旋转

  • 查看日志,鼠标向上移动时,Amount为正数



使视角可以在垂直方向旋转

虚幻编辑器


CameraComponent的UsePawnControlRotation选项

设置CameraComponent是否跟随Pawn旋转

  1. 勾选 BP_STUBaseCharacter > CameraComponent > UsePawnControlRotation

    选中Camera Component > 细节面板 > CameraOptions > 勾选UsePawnControlRotation


  2. 编译并运行

    • 向下移动鼠标,Camera向上旋转; 向上移动鼠标,Camera向下旋转
    • 旋转中心点为CameraComponent

PlayerController的InputPitchScale选项

  • 游戏角色旋转的逻辑是通过旋转PlayerController完成的
  • 游戏角色视角垂直方向旋转反向InputPitchScale有关,该参数默认为负数, 已退化

    参考
  • InputPitchScale, InputYawScale, InputRollScale的绝对值对应旋转速度
  • 引擎版本 5.1 之前,可以在 PlayerController蓝图类 的细节面板查看 InputPitchScale

打印InputPitchScale




解决方法

  1. 将InputPitchScale设为正数


  2. 将LookUp的Scale改为-1



善后

  • 去除 BP_STUPlayerController 中的打印和InputPitchScale设置
  • 去除 C++ LookUp 中的日志打印

游戏角色视角绕Z轴旋转时,使中心点为游戏角色


为STUBaseCharacter添加USpringArmComponent类型成员

C++

  1. 添加SpringArmComponent类型成员

    ShootThemUp: Player/STUBaseCharacter.h
    1// 前向声明
    2class USpringArmComponent;
    3
    4// protected
    5UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
    6USpringArmComponent *SpringArmComponent;
  2. 初始化组件, 设置SpringArmComponent默认跟随Pawn旋转

    ShootThemUp: Player/STUBaseCharacter.cpp
    1#include "GameFrameWork/SpringArmComponent.h"
    2
    3// 默认构造函数
    4SpringArmComponent = CreateDefaultSubobject<USpringArmComponent>("SpringArmComponent");
    5SpringArmComponent->SetupAttachment(GetRootComponent());
    6SpringArmComponent->bUsePawnControlRotation = true;
  3. 修改CameraComponent的上级组件为SpringArmComponent

    ShootThemUp: Player/STUBaseCharacter.cpp
    1// 默认构造函数
    2// CameraComponent->SetupAttachment(GetRootComponent());
    3CameraComponent->SetupAttachment(SpringArmComponent);
  4. 编译ShootThemUp

配置SpringArmComponent

虚幻编辑器

BP_STUBaseCharacter


查看SpringArmComponent和CameraComponent



关于bUsePawnControlRotation设置

  1. UCameraComponentUSpringArmComponent 均有该数据成员
  2. 在代码中设置 bUsePawnControlRotation ,设置的是类数据成员初始值。在蓝图编辑器中,对基于C++类的蓝图类数据成员恢复默认值,得到类数据成员初始值
  3. 为参数添加默认值,不会改变参数已有值

清除CameraComponent的相对变换,置UsePawnControlRotation为false




设置SpringArmComponent和CameraComponent的相对变换

  1. 查看 SpringArmComponent 臂长参数


  2. 设置CameraComponent相对SpringArmComponent的偏移



CameraComponent和SpringArmComponent的bUsePawnControlRotation生效问题

-
二者均为 true SpringArmComponent的生效,Camera以游戏角色为中心绕Y轴旋转
二者均为 false Camera不可绕Y轴旋转
CameraComponent 的为true 以Camera为中心绕Y轴旋转
SpringArmComponent 的为true Camera以游戏角色为中心绕Y轴旋转

为Character绑定动画

虚幻编辑器

BP_STUBaseCharacter

  1. 绑定动画

    选中Mesh组件 > Details > Animation

    -
    Animation Mode Use Animation Asset
    Anim To Play Run_Fwd


    可能存在动画下拉框无可选项的情况, 需要重新为动画绑定骨骼网格体

  2. 编译并运行


优化视角旋转逻辑

C++

STUBaseCharacter

LookUp, TurnAround, AddControllerPitchInput和AddControllerYawInput的函数签名一致

1void LookUp(float Amount);
2void TurnAround(float Amount);
3void AddControllerPitchInput(float Val);
4void AddControllerYawInput(float Val);
  1. 屏蔽 LookUpTurnAround

    ShootThemUp: Player/STUBaseCharacter.cpp

    ShootThemUp: Player/STUBaseCharacter.h
  2. 函数描述直接绑定 AddControllerPitchInputAddControllerYawInput

    ShootThemUp: Player/STUBaseCharacter.cpp
    1// SetupPlayerInputComponent
    2// PlayerInputComponent->BindAxis("LookUp", this, &ASTUBaseCharacter::LookUp);
    3// PlayerInputComponent->BindAxis("TurnAround", this, &ASTUBaseCharacter::TurnAround);
    4PlayerInputComponent->BindAxis("Lookup", this, &ASTUBaseCharacter::AddControllerPitchInput);
    5PlayerInputComponent->BindAxis("TurnAround", this, &ASTUBaseCharacter::AddControllerYawInput)
  3. 编译并运行

实现游戏角色视角旋转



说明

视角旋转
垂直方向 抬头低头 Camera绕Y轴旋转 鼠标垂直方向位移决定旋转角度
水平方向 环顾左右 Camera绕Z轴旋转 鼠标水平方向位移决定旋转角度

绑定旋转键位

虚幻编辑器

项目设置 > Engine > Input

轴映射

函数描述 键位
LookUp MouseY
TurnAround MouseX



实现视角旋转逻辑

C++

- 回调函数签名
BindAxis void handler(float Amount)
函数描述 回调函数
LookUp LookUp AddControllerPitchInput 绕Y轴旋转,增加Y轴旋转角度(Pitch)
TurnAround TurnAround AddControllerYawInput 绕Z轴旋转,增加Z轴旋转角度(Yaw)

搭建框架

  1. 添加空函数

    ShootThemUp: Player/STUBaseCharacter.cpp
    1void ASTUBaseCharacter::LookUp(float Amount) {}
    2void ASTUBaseCharacter::TurnAround(float Amount) {}
  2. 绑定函数描述和回调函数

    ShootThemUp: Player/STUBaseCharacter.cpp
    1// SetupPlayerInputComponent
    2PlayerInputComponent->BindAxis("LookUp", this, &ASTUBaseCharacter::LookUp);
    3PlayerInputComponent->BindAxis("TurnAround", this, &ASTUBaseCharacter::TurnAround);
  3. 添加函数声明

    ShootThemUp: Player/STUBaseCharacter.h
    • private

添加静态日志类型

ShootThemUp: Player/STUBaseCharacter.cpp

1DEFINE_LOG_CATEGORY_STATIC(LogBaseCharacter, All, All);

实现回调函数

ShootThemUp: Player/STUBaseCharacter.cpp

 1void ASTUBaseCharacter::LookUp(float Amount)
 2{
 3    AddControllerPitchInput(Amount);
 4    UE_LOG(LogBaseCharacter, Log, TEXT("LookUp Amount: %f"), Amount);
 5}
 6
 7void ASTUBaseCharacter::TurnAround(float Amount)
 8{
 9    AddControllerYawInput(Amount);
10}

编译ShootThemUp并运行

  • 视角可以在水平方向旋转, 身体跟随旋转

  • 无法在垂直方向旋转

  • 查看日志,鼠标向上移动时,Amount为正数



使视角可以在垂直方向旋转

虚幻编辑器


CameraComponent的UsePawnControlRotation选项

设置CameraComponent是否跟随Pawn旋转

  1. 勾选 BP_STUBaseCharacter > CameraComponent > UsePawnControlRotation

    选中Camera Component > 细节面板 > CameraOptions > 勾选UsePawnControlRotation


  2. 编译并运行

    • 向下移动鼠标,Camera向上旋转; 向上移动鼠标,Camera向下旋转
    • 旋转中心点为CameraComponent

PlayerController的InputPitchScale选项

  • 游戏角色旋转的逻辑是通过旋转PlayerController完成的
  • 游戏角色视角垂直方向旋转反向InputPitchScale有关,该参数默认为负数, 已退化

    参考
  • InputPitchScale, InputYawScale, InputRollScale的绝对值对应旋转速度
  • 引擎版本 5.1 之前,可以在 PlayerController蓝图类 的细节面板查看 InputPitchScale

打印InputPitchScale




解决方法

  1. 将InputPitchScale设为正数


  2. 将LookUp的Scale改为-1



善后

  • 去除 BP_STUPlayerController 中的打印和InputPitchScale设置
  • 去除 C++ LookUp 中的日志打印

游戏角色视角绕Z轴旋转时,使中心点为游戏角色


为STUBaseCharacter添加USpringArmComponent类型成员

C++

  1. 添加SpringArmComponent类型成员

    ShootThemUp: Player/STUBaseCharacter.h
    1// 前向声明
    2class USpringArmComponent;
    3
    4// protected
    5UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
    6USpringArmComponent *SpringArmComponent;
  2. 初始化组件, 设置SpringArmComponent默认跟随Pawn旋转

    ShootThemUp: Player/STUBaseCharacter.cpp
    1#include "GameFrameWork/SpringArmComponent.h"
    2
    3// 默认构造函数
    4SpringArmComponent = CreateDefaultSubobject<USpringArmComponent>("SpringArmComponent");
    5SpringArmComponent->SetupAttachment(GetRootComponent());
    6SpringArmComponent->bUsePawnControlRotation = true;
  3. 修改CameraComponent的上级组件为SpringArmComponent

    ShootThemUp: Player/STUBaseCharacter.cpp
    1// 默认构造函数
    2// CameraComponent->SetupAttachment(GetRootComponent());
    3CameraComponent->SetupAttachment(SpringArmComponent);
  4. 编译ShootThemUp

配置SpringArmComponent

虚幻编辑器

BP_STUBaseCharacter


查看SpringArmComponent和CameraComponent



关于bUsePawnControlRotation设置

  1. UCameraComponentUSpringArmComponent 均有该数据成员
  2. 在代码中设置 bUsePawnControlRotation ,设置的是类数据成员初始值。在蓝图编辑器中,对基于C++类的蓝图类数据成员恢复默认值,得到类数据成员初始值
  3. 为参数添加默认值,不会改变参数已有值

清除CameraComponent的相对变换,置UsePawnControlRotation为false




设置SpringArmComponent和CameraComponent的相对变换

  1. 查看 SpringArmComponent 臂长参数


  2. 设置CameraComponent相对SpringArmComponent的偏移



CameraComponent和SpringArmComponent的bUsePawnControlRotation生效问题

-
二者均为 true SpringArmComponent的生效,Camera以游戏角色为中心绕Y轴旋转
二者均为 false Camera不可绕Y轴旋转
CameraComponent 的为true 以Camera为中心绕Y轴旋转
SpringArmComponent 的为true Camera以游戏角色为中心绕Y轴旋转

为Character绑定动画

虚幻编辑器

BP_STUBaseCharacter

  1. 绑定动画

    选中Mesh组件 > Details > Animation

    -
    Animation Mode Use Animation Asset
    Anim To Play Run_Fwd


    可能存在动画下拉框无可选项的情况, 需要重新为动画绑定骨骼网格体

  2. 编译并运行


优化视角旋转逻辑

C++

STUBaseCharacter

LookUp, TurnAround, AddControllerPitchInput和AddControllerYawInput的函数签名一致

1void LookUp(float Amount);
2void TurnAround(float Amount);
3void AddControllerPitchInput(float Val);
4void AddControllerYawInput(float Val);
  1. 屏蔽 LookUpTurnAround

    ShootThemUp: Player/STUBaseCharacter.cpp

    ShootThemUp: Player/STUBaseCharacter.h
  2. 函数描述直接绑定 AddControllerPitchInputAddControllerYawInput

    ShootThemUp: Player/STUBaseCharacter.cpp
    1// SetupPlayerInputComponent
    2// PlayerInputComponent->BindAxis("LookUp", this, &ASTUBaseCharacter::LookUp);
    3// PlayerInputComponent->BindAxis("TurnAround", this, &ASTUBaseCharacter::TurnAround);
    4PlayerInputComponent->BindAxis("Lookup", this, &ASTUBaseCharacter::AddControllerPitchInput);
    5PlayerInputComponent->BindAxis("TurnAround", this, &ASTUBaseCharacter::AddControllerYawInput)
  3. 编译并运行