处理输入
在这篇文章中,我们开始实现输入的逻辑,让坦克动起来。
我们打开 编辑 - 项目设置,来到 输入 标签卡中。如图 1 所示,项目工程里已经帮我们设置好了输入映射。

接着我们实现输入绑定,如代码清单 1 所示,SetupPlayerInputComponent() 是用于绑定玩家输入的函数,我们把它从父类移到此处声明。同时再定义一个 Move() 函数,它用于响应坦克的移动。
- UCLASS()
- class TOONTANKS_API ATank : public ABasePawn
- {
- GENERATED_BODY()
- public:
- ATank();
- virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
- private:
- void Move(float Value);
- };
PlayerInputComponent 类的成员函数 BindAxis(),用于绑定轴输入函数,其函数原型如下:
- template<class UserClass>
- FInputAxisBinding& BindAxis( const FName AxisName,
- UserClass* Object,
- typename FInputAxisHandlerSignature::TMethodPtr< UserClass > Func );
AxisName 参数指定轴输入的名称,它就是图 1 输入中的映射名称;Object 参数指定传递的成员函数的实例类对象;Func 参数指定要传递的成员函数指针。
如代码清单 2 所示,我们把 MoveForward 的响应绑定到 Move 函数。目前移动功能没有实现,只是进行打印验证。
- void ATank::Move(float Value)
- {
- UE_LOG(LogTemp, Warning, TEXT("Value: %f"), Value);
- }
- void ATank::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
- {
- Super::SetupPlayerInputComponent(PlayerInputComponent);
- PlayerInputComponent->BindAxis(TEXT("MoveForward"), this, &ATank::Move);
- }
实现完成之后,我们运行程序。如图 2 所示,可以看到按 W 键会打印 1 值,按 S 键会打印 -1 值,不按键会打印 0 值。
绑定的函数是逐帧调用的。
