Pawn与键位绑定
2024年1月8日 2024年1月11日
介绍键位绑定
键位绑定有两种,动作映射和轴映射,其触发机制不同
- | |
---|---|
入口 | 项目设置 > 引擎 > 输入 > Bindings |
动作映射
一次完整的按下并松开按键,触发一次回调函数
具有离散性
举例
跳跃
轴映射
-
第一种使用场景
按下键位之后,松开之前的这段时间,持续触发回调函数 -
第二种使用场景
根据需求, 为键位按下和松开分别绑定回调函数包含第一种使用场景
每次刷新帧时,调用回调函数
具有连续性
举例
前后左右移动
绑定
-
在虚幻编辑器中,将键位和函数描述绑定在一起
-
在C++中,再将回调函数和函数描述绑定在一起
创建派生自APawn的C++类
GeometryPawn
- | |
---|---|
基类 | Pawn |
属性 | Public |
名称 | GeometryPawn |
选择基类
为GeometryPawn绑定键位
水平方向左右移动
只一个函数描述, 两个键位的步进长度互为相反数
函数描述 |
---|
MoveRight |
键位 | 缩放系数 |
---|---|
Right | 1 |
Left | -1 |
水平方向前后移动
只一个函数描述, 两个键位的步进长度互为相反数
函数描述 |
---|
MoveForward |
键位 | 缩放系数 |
---|---|
Up | 1 |
Down | -1 |
C++中实现移动逻辑
GeometryPawn
添加静态日志类型
1DEFINE_LOG_CATEGORY_STATIC(LogGeometryPawn, All, All)
包含头文件
1#include "Components/InputComponent.h"
添加数据成员
private
- | |
---|---|
Velocity | 速度 |
VelocityVector | 方向 |
1float Velocity = 300.0f; 2FVector VelocityVector = FVector::ZeroVector;
添加函数成员: 水平方向前后移动的回调函数
private
1void AGeometryPawn::MoveForward(float Amount) 2{ 3 if (Amount) 4 { 5 FString Direction = Amount > 0 ? "forward" : "backward"; 6 UE_LOG(LogGeometryPawn, Display, TEXT("Move %s: %f"), *Direction, Amount); 7 } 8 VelocityVector.X = Amount; 9}
添加函数成员: 水平方向左右移动的回调函数
private
1void AGeometryPawn::MoveRight(float Amount) 2{ 3 if (Amount) 4 { 5 FString Direction = Amount > 0 ? "right" : "left"; 6 UE_LOG(LogGeometryPawn, Display, TEXT("Move %s: %f"), *Direction, Amount); 7 } 8 VelocityVector.Y = Amount; 9}
添加函数成员: 更新Pawn位置
在Tick中更新Pawn位置
当按下上下左右键位时,虽然在X轴和Y轴有步进,但直观上来看,并不是前后左右移动,和摄像机的方向有关
1void AGeometryPawn::VelocityInForce(float DeltaTime) 2{ 3 if (!VelocityVector.IsZero()) 4 { 5 const FVector NewLocation = GetActorLocation() + Velocity * DeltaTime * VelocityVector; 6 SetActorLocation(NewLocation); 7 } 8}
添加函数成员: 为函数描述绑定回调函数
- | |
---|---|
BindAxis | 动作映射使用; 将回调函数绑定到函数描述; 使用委托机制实现绑定 |
在SetupPlayerInputComponent中调用
1void AGeometryPawn::BindAxis(UInputComponent* PlayerInputComponent) 2{ 3 PlayerInputComponent->BindAxis("MoveForward", this, &AGeometryPawn::MoveForward); 4 PlayerInputComponent->BindAxis("MoveRight", this, &AGeometryPawn::MoveRight); 5}
为Pawn添加组件
- | |
---|---|
SceneComponent | 可视化组件; 虽然没有使用SceneComponent,如果省略这一步,摄像机无法移动 |
添加数据成员
private
1USceneComponent* SceneComponent;
添加函数成员: 初始化组件
在构造函数中调用
创建组件并将可视化组件设置为根组件
1void AGeometryPawn::InitComponent() 2{ 3 SceneComponent = CreateDefaultSubobject<USceneComponent>("SceneComponent"); 4 SetRootComponent(SceneComponent); 5}
设置关卡基础类型: Pawn
GeometryGameModeBase
包含头文件
1#include "GeometryPawn.h"
添加函数成员: 设置Pawn的基础类型
private
在构造函数中调用
1void AGeometryGameModeBase::InitPawn() 2{ 3 DefaultPawnClass = AGeometryPawn::StaticClass(); 4}
添加函数成员: 默认构造函数
public
1AGeometryGameModeBase::AGeometryGameModeBase() 2{ 3 InitPawn(); 4}