实现游戏角色视角旋转
2023年6月11日 2024年1月12日
说明
视角旋转 | |||
---|---|---|---|
垂直方向 | 抬头低头 | 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) |
搭建框架
- 添加空函数
ShootThemUp: Player/STUBaseCharacter.cpp
1void ASTUBaseCharacter::LookUp(float Amount) {} 2void ASTUBaseCharacter::TurnAround(float Amount) {}
- 绑定函数描述和回调函数
ShootThemUp: Player/STUBaseCharacter.cpp
1// SetupPlayerInputComponent 2PlayerInputComponent->BindAxis("LookUp", this, &ASTUBaseCharacter::LookUp); 3PlayerInputComponent->BindAxis("TurnAround", this, &ASTUBaseCharacter::TurnAround);
- 添加函数声明
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旋转
-
勾选
BP_STUBaseCharacter > CameraComponent > UsePawnControlRotation
选中Camera Component > 细节面板 > CameraOptions > 勾选UsePawnControlRotation
-
编译并运行
- 向下移动鼠标,Camera向上旋转; 向上移动鼠标,Camera向下旋转
- 旋转中心点为CameraComponent
- 向下移动鼠标,Camera向上旋转; 向上移动鼠标,Camera向下旋转
PlayerController的InputPitchScale选项
- 游戏角色旋转的逻辑是通过旋转PlayerController完成的
- 游戏角色视角垂直方向旋转反向InputPitchScale有关,该参数默认为负数, 已退化
参考 - InputPitchScale, InputYawScale, InputRollScale的绝对值对应旋转速度
- 引擎版本
5.1
之前,可以在PlayerController蓝图类
的细节面板查看InputPitchScale
打印InputPitchScale
解决方法
-
将InputPitchScale设为正数
-
将LookUp的Scale改为-1
善后
- 去除
BP_STUPlayerController
中的打印和InputPitchScale设置 - 去除 C++
LookUp
中的日志打印
游戏角色视角绕Z轴旋转时,使中心点为游戏角色
为STUBaseCharacter添加USpringArmComponent类型成员
C++
- 添加SpringArmComponent类型成员
ShootThemUp: Player/STUBaseCharacter.h
1// 前向声明 2class USpringArmComponent; 3 4// protected 5UPROPERTY(VisibleAnywhere, BlueprintReadWrite) 6USpringArmComponent *SpringArmComponent;
- 初始化组件, 设置SpringArmComponent默认跟随Pawn旋转
ShootThemUp: Player/STUBaseCharacter.cpp
1#include "GameFrameWork/SpringArmComponent.h" 2 3// 默认构造函数 4SpringArmComponent = CreateDefaultSubobject<USpringArmComponent>("SpringArmComponent"); 5SpringArmComponent->SetupAttachment(GetRootComponent()); 6SpringArmComponent->bUsePawnControlRotation = true;
- 修改CameraComponent的上级组件为SpringArmComponent
ShootThemUp: Player/STUBaseCharacter.cpp
1// 默认构造函数 2// CameraComponent->SetupAttachment(GetRootComponent()); 3CameraComponent->SetupAttachment(SpringArmComponent);
- 编译ShootThemUp
配置SpringArmComponent
虚幻编辑器
BP_STUBaseCharacter
查看SpringArmComponent和CameraComponent
关于bUsePawnControlRotation设置
UCameraComponent
和USpringArmComponent
均有该数据成员- 在代码中设置
bUsePawnControlRotation
,设置的是类数据成员初始值。在蓝图编辑器中,对基于C++类的蓝图类数据成员恢复默认值,得到类数据成员初始值 - 为参数添加默认值,不会改变参数已有值
清除CameraComponent的相对变换,置UsePawnControlRotation为false
设置SpringArmComponent和CameraComponent的相对变换
-
查看
SpringArmComponent
臂长参数 -
设置CameraComponent相对SpringArmComponent的偏移
CameraComponent和SpringArmComponent的bUsePawnControlRotation生效问题
- | |
---|---|
二者均为 true |
SpringArmComponent的生效,Camera以游戏角色为中心绕Y轴旋转 |
二者均为 false |
Camera不可绕Y轴旋转 |
仅 CameraComponent 的为true |
以Camera为中心绕Y轴旋转 |
仅 SpringArmComponent 的为true |
Camera以游戏角色为中心绕Y轴旋转 |
为Character绑定动画
虚幻编辑器
BP_STUBaseCharacter
-
绑定动画
选中Mesh组件 > Details > Animation
- Animation Mode Use Animation Asset Anim To Play Run_Fwd 可能存在动画下拉框无可选项的情况, 需要重新为动画绑定骨骼网格体
-
编译并运行
优化视角旋转逻辑
C++
STUBaseCharacter
LookUp, TurnAround, AddControllerPitchInput和AddControllerYawInput的函数签名一致
1void LookUp(float Amount); 2void TurnAround(float Amount); 3void AddControllerPitchInput(float Val); 4void AddControllerYawInput(float Val);
- 屏蔽
LookUp
和TurnAround
ShootThemUp: Player/STUBaseCharacter.cpp
ShootThemUp: Player/STUBaseCharacter.h
- 函数描述直接绑定
AddControllerPitchInput
和AddControllerYawInput
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)
- 编译并运行