处理输入

在这篇文章中,我们开始实现输入的逻辑,让坦克动起来。

我们打开 编辑 - 项目设置,来到 输入 标签卡中。如图 1 所示,项目工程里已经帮我们设置好了输入映射。

图1 输入

接着我们实现输入绑定,如代码清单 1 所示,SetupPlayerInputComponent() 是用于绑定玩家输入的函数,我们把它从父类移到此处声明。同时再定义一个 Move() 函数,它用于响应坦克的移动。

代码清单 1 Tank.h
  1. UCLASS()
  2. class TOONTANKS_API ATank : public ABasePawn
  3. {
  4.     GENERATED_BODY()
  5.    
  6. public:
  7.     ATank();
  8.  
  9.     virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
  10.  
  11. private:
  12.     void Move(float Value);
  13. };

PlayerInputComponent 类的成员函数 BindAxis(),用于绑定轴输入函数,其函数原型如下:

  • template<class UserClass>
  • FInputAxisBinding& BindAxis( const FName AxisName,
  •     UserClass* Object,
  •     typename FInputAxisHandlerSignature::TMethodPtr< UserClass > Func );

AxisName 参数指定轴输入的名称,它就是图 1 输入中的映射名称;Object 参数指定传递的成员函数的实例类对象;Func 参数指定要传递的成员函数指针。

如代码清单 2 所示,我们把 MoveForward 的响应绑定到 Move 函数。目前移动功能没有实现,只是进行打印验证。

代码清单 2 Tank.cpp
  1. void ATank::Move(float Value)
  2. {
  3.     UE_LOG(LogTemp, Warning, TEXT("Value: %f"), Value);
  4. }
  5.  
  6. void ATank::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
  7. {
  8.     Super::SetupPlayerInputComponent(PlayerInputComponent);
  9.  
  10.     PlayerInputComponent->BindAxis(TEXT("MoveForward"), this, &ATank::Move);
  11. }

实现完成之后,我们运行程序。如图 2 所示,可以看到按 W 键会打印 1 值,按 S 键会打印 -1 值,不按键会打印 0 值。

绑定的函数是逐帧调用的。

图2 验证