目录
1.3 绑定InputMappingContext到Controller
2.3.1 MoveCharacter,实现人物前后左右移动
2.3.2 RotateCharacter,实现人物左右转向
2.3.4 RotateCameraToOrigin,实现摄像机z轴(Yaw)视角回位
2.4 Controller中, EnhancedInputAction逻辑的编写
2.4.5 IA_CameraFollowCharacter
1.EnhancedInput
1.1 Input Action
首先,要创建InputAction资产。
在InputAction中,可以设置Input的ValueType。
1.2 InputMappingContext
其次,创建InputMappingContext,将Input Action映射到输入中(如鼠标、键盘等等)。在InputMappingContext中,还可以添加修饰器等等。常用的修饰器如下:
-
scalar:放大输入
-
dead zone:使输入没那么敏感。
-
swizzle input axis value:将该输入映射到另一个轴上。例如,我们如果在Input Action中制定值类型为Axis2D,那么默认的输入就是在x轴上。开启这个修饰器之后,可以将该输入映射到y轴上。
-
negate:使该输入变为负值。
对于某些输入,例如鼠标滚轮,天生带有正负。
对于其他输入,例如按键,那么一般来说当按下按钮的时候只能产生正值。如果我们需要实现w向前s向后,那么就可以在输入s上绑定negate修饰器。
1.3 绑定InputMappingContext到Controller
我们还需要绑定才能让controller理解MappingContext中定义的内容。
绑定必须要绑定到Controller上,不要绑定到Pawn上(这样应该无效,没有试过)。在Controller中,增加以下蓝图代码可以实现绑定
2. 人物移动视角控制
2.1 前置知识
2.1.1 视角与移动
根据我的理解,“视角”其实就是Character中我们使用的Camera Component所看到的画面(目前来看在只有一个摄像机的情况下是这样的,具体细节有待考究)。而人物移动和视角应该是两个不同的部分。人物的移动与摄像机无关,人物向前的移动方向是由Character中Capsule Component所决定的。
在这里,我希望利用Enhanced Input实现以下几个功能:
- 键盘W A S D,实现人物移动。
- 鼠标左右摇晃,实现人物转向。
- 键盘 Q E 和鼠标的上下摇晃,实现视角(Camera)移动。
- 键盘R,实现视角回正。
- 鼠标滚轮,实现视角缩放。
2.1.2 一些教程
UE4学习-自定义角色的移动、视野旋转、设置游戏模式_ue4设置玩家移动角度-CSDN博客
上述链接,是我参考的一些教程。一开始,我是按照这个教程所教的内容实现移动和视角控制。在其中,我们在SpringArm中勾选Use Pawn Control Rotation,然后我们只需要Set Control Rotation就可以实现Camera视角的旋转。
同时,教程中还勾选了Character的Use Controller Rotation Yaw。这样一来,我们仍然只需要Set Control Rotation,就可以实现Character人物的转向操作。
这是一种很简单的方法,勾选了这两个选项之后,只需要操作控制器的Control Rotation,即可实现人物转向和视角移动的任务。但是为了加强对前置知识的理解,我选择将人物转向、视角移动的函数与控制器的Controll Rotation区别开来,通过操作Pawn(Character)和Camera,实现人物转向、视角移动。
2.2 逻辑写在哪?
以上的控制逻辑比较简单,可以写在Controller中,也可以写在Character中。
在我的实现过程中,我在Character中实现了一些关于人物移动、转向和摄像机缩放、转向的一些函数接口,因为在Character中获取SpringArm等组件更为方便,而且这些函数和逻辑无关,所以定义在这里是一个不错的选择。否则,举个例子,如果我们在Controller中实现鼠标滚轮操纵视角缩放的函数,就需要先得到ControllerPawn,再得到SpringArm Component,如下图所示。
然后在Controller中,我将这些接口绑定到了上面提到的 InputAction 中,实现了一定程度上的解耦合。注意,由于这接口(也就是一个个蓝图函数)只在我定义的BP_DemoCharacter蓝图中存在,所以如果我们想调用这些函数,必须要现将Controlled Pawn转换成BP_DemoCharacter,然后才能调用其中的函数。如下图所示。
2.3 Character中各个函数接口的实现
以下函数,均定义在BP_DemoCharacter蓝图中!!
2.3.1 MoveCharacter,实现人物前后左右移动
利用Get Actor Rotation获得当前的Actor的朝向(Roll Pitch Yaw)。然后,利用Get Forward Vector和Get Right Vector获得当前朝向作为基准时,指向Forward的向量和指向Right的向量(均为单位向量)。最后,利用Add Movement Input节点,实现Character朝着向量所知的方向进行移动。
2.3.2 RotateCharacter,实现人物左右转向
使用AddActorWorldRotation节点。
2.3.3 RotateCamera,实现视角旋转
使用了SpringArm的AddRelativeRotation节点。在这里,使用AddWorldRotation会出错。
(WorldRotation和RelativeRotation的参考系有什么区别?这个点还没仔细看)
除此之外,使用Clamp函数,将视角旋转的Pitch值(Y-Axis)限定在一定范围内,再用SetWorldRotation设置SpringArm的旋转角度
2.3.4 RotateCameraToOrigin,实现摄像机z轴(Yaw)视角回位
计算Charactor的Rotation角度(GetActorRotation)与SpringArm的Rotation角度(GetWorldRotation)之间的差值,然后将SpringArm的Yaw角度向Charactor的Yaw角度靠近。使用了先前定义的RotateCamera函数。
2.3.5 ScopeCamera,实现视角缩放
修改SpringArm的TargetArmLength参数。
在这里,也可以添加一个Clamp函数,将视角缩放的程度限定到一个范围内。
2.4 Controller中, EnhancedInputAction逻辑的编写
以下事件,均定义在BP_DemoPlayerController蓝图中!!!
2.4.1 IA_Move
-
InputMappingContext
InputAction ValueType: Axis2D
-
Event —— IA_Move
2.4.2 IA_Jump
-
InputMappingContext
InputAction ValueType: Digital bool
-
Event —— IA_Jump
2.4.3 IA_Rotate
-
InputMappingContext
InputAction ValueType: Axis1D
-
Event —— IA_Rotate
2.4.4 IA_CameraRotate
-
InputMappingContext
InputAction ValueType: Axis2D
-
Event —— IA_CameraRotate
2.4.5 IA_CameraFollowCharacter
-
InputMappingContext
InputAction ValueType: Digital bool
-
Event —— IA_CameraFollowCharacter
2.4.6 IA_CameraScope
-
InputMappingContext
InputAction ValueType: Axis1D
-
Event —— IA_CameraScope