【UE5】人物控制与视角移动

目录

1.EnhancedInput

1.1 Input Action

1.2 InputMappingContext

1.3 绑定InputMappingContext到Controller

2. 人物移动视角控制

2.1 前置知识

2.1.1 视角与移动

2.1.2 一些教程

2.2 逻辑写在哪?

2.3 Character中各个函数接口的实现

2.3.1 MoveCharacter,实现人物前后左右移动

2.3.2 RotateCharacter,实现人物左右转向

2.3.3 RotateCamera,实现视角旋转

2.3.4 RotateCameraToOrigin,实现摄像机z轴(Yaw)视角回位

2.3.5 ScopeCamera,实现视角缩放

2.4 Controller中, EnhancedInputAction逻辑的编写

2.4.1 IA_Move

2.4.2 IA_Jump

2.4.3 IA_Rotate

2.4.4 IA_CameraRotate

2.4.5 IA_CameraFollowCharacter

2.4.6 IA_CameraScope


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

        

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值