输入组件


  一个Actor是怎么接收键盘或者游戏手柄等硬件的输入的呢,那很简单,这个Actor里面会有一个组件用来接收来自对应硬件的输入。硬件输入通常包括键盘按键,鼠标点击或鼠标移动,以及手柄控制器按钮按下或手柄操纵杆移动等等。

PlayerInput组件

  PlayerInput是PlayerController中的一个组件,他定义了两个事件,一个是FInputActionKeyMapping,它定义了一个ActionMapping即按键映射。另一个是FInputAxisKeyMapping,它定义了一个AxisMapping即轴映射。


  什么是按键映射(ActionMapping):

  按键映射是指例如有一个跳跃动作,这个动作称之为事件,那么这个动作是通过一个按键来触发的,例如按下空格键,也就是说,通过硬件的的按钮的按下的瞬间或者松开的瞬间会触发的事件就称为按键映射

  什么是轴映射(AxisMapping):

  轴映射与按键映射不同之处在于,它定义了返回值,而且事件的触发不再是按下瞬间或者是松开瞬间,轴映射事件只要按着所定义的按键就会一直触发,其返回值一般用于表示方向,例如有个MoveForward轴映射事件,定义了W键返回1,S键返回-1,那么在使用的时候会利用这个返回只乘上前进方向的方向向量就会获得我们对应按键对应的移动方向,即W为前进正方向,S为前进反方向,即向后移动。


  不管是按键映射还是轴映射,我们都不用去写他的代码,因为 UE4 已经将接口帮我们写好了,我们只需在菜单栏中点击 Edit(编辑)->Project Settings(项目设置)中的输入一栏中设置即可,如下图:

点击加号即可进行相对应的设置


输入组件InputComponent

  这个组件是用来链接我们设置的按键映射和轴映射的,在里面写相对于的映射事件应该对应的具体代码。

  例如我们有一个Character,他的名字叫做MyCharacter,那么绑定按键映射的具体步骤如下(代码可以左滑查看全部):

在 AMyCharacter.cpp 中,

void AMyCharacter::SetupPlayerInputComponent(class UInputComponent* InputComponent) { check(InputComponent)); // 以上内容是自带的,下面这句才是你要写的 InputComponent->BindAction("Jump", IE_Pressed, this, &AMyCharacter::Jump); } void AMyCharacter::Jump() { // Jump 函数内的对应定义部分,就不具体写了 }

  InputComponent->BindAction("Jump", IE_Pressed, this, &AMyCharacter::Jump);这句话的意思是,我给这个Character绑定了一个我之前设置好的Jump按键映射,IE_Pressed是按下按下的时候触发,若为IE_Pressed则是按键弹起也就是松开的时候触发,这个this一般不用管,指的是作用于哪个Actor,很明显,一般都是作用于自己本身,所以一般不用管,而后面的&AMyCharacter::Jump指你这个按键映射触发的时候对应的函数,这个函数为AMyCharacter内的Jump函数。



  如要绑定的是轴映射,则具体步骤如下(代码可以左滑查看全部):

在 AMyCharacter.cpp 中,

void AMyCharacter::SetupPlayerInputComponent(class UInputComponent* InputComponent) { check(InputComponent); // 同理以上内容是自带的,下面这句才是你要写的 InputComponent->BindAxis("MoveForward", this, &AMyCharacter::MoveForward); } void AMyCharacter::MoveForward(float Value) { // MoveForward 函数内的定义部分,就不具体写了 }

  与按键映射不同,轴映射是有一个返回值的,所以他的对应函数是要传入一个值来判断我这个轴的方向的,所以我们的MoveForward函数是要传入一个float的数值,这个数值就是我们所按下的按键所返回的值,这些都是在我们的Project Settings中设置好的,例如,W是 1,S是 -1,则触发这个轴映射的时候,按下W的时候我们的MoveForward函数传入的Value的值是1,同理,按下S的时候为-1。与按键映射不同,绑定轴映射用的是InputComponent->BindAxis("MoveForward", this, &AMyCharacter::MoveForward);与按键映射相比,少了那个写IE_Pressed或IE_Released的地方,其余位置对应的意思与按键映射的绑定是几乎一样的,就不重复介绍了。