六一的部落格


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




介绍键位绑定

键位绑定有两种,动作映射和轴映射,其触发机制不同

-
入口 项目设置 > 引擎 > 输入 > Bindings



动作映射

一次完整的按下并松开按键,触发一次回调函数

具有离散性


举例

跳跃


轴映射

  1. 第一种使用场景

    按下键位之后,松开之前的这段时间,持续触发回调函数

  2. 第二种使用场景

    根据需求, 为键位按下和松开分别绑定回调函数

    包含第一种使用场景

每次刷新帧时,调用回调函数

具有连续性


举例

前后左右移动


绑定

  1. 在虚幻编辑器中,将键位和函数描述绑定在一起


  2. 在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}

在虚幻编辑器中查看


Pawn与键位绑定



介绍键位绑定

键位绑定有两种,动作映射和轴映射,其触发机制不同

-
入口 项目设置 > 引擎 > 输入 > Bindings



动作映射

一次完整的按下并松开按键,触发一次回调函数

具有离散性


举例

跳跃


轴映射

  1. 第一种使用场景

    按下键位之后,松开之前的这段时间,持续触发回调函数

  2. 第二种使用场景

    根据需求, 为键位按下和松开分别绑定回调函数

    包含第一种使用场景

每次刷新帧时,调用回调函数

具有连续性


举例

前后左右移动


绑定

  1. 在虚幻编辑器中,将键位和函数描述绑定在一起


  2. 在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}

在虚幻编辑器中查看