角色基本运动的实现
基础知识
角色的移动功能是通过Movement组件实现的,角色由Controller进行直接控制,主角由PlayerController控制
敌人则由AIController控制;其中对于主角,PlayerController可由键盘、鼠标、手柄等获取到玩家输入实现对
角色的控制。
GameMode包含了对游戏的诸多设置,PlayerController就在其中,我们可以在GameMode中设置自己写的PlayerController。
关于游戏框架,可以参考官方文档: https://docs.unrealengine.com/4.27/zh-CN/InteractiveExperiences/Framework/
进行设置
基本移动
创建新工程后,新建一个Character类和Controller类,命名为MainCharacter和MainPlayerController,同时
以MainCharacter为父类创建一个蓝图命名为BP_MainPlayer;
新建一个自己的GameMode并在WorldSettings中设置,至此便完满足基本的要求。
在GameMode的默认构造函数中进行如下设置:
1 | PlayerControllerClass=AMainPlayerController::StaticClass(); |
在Projest Settings-Input-Axis Mappings中添加两个输入事件,分别为MoveForward和MoveRight,MoveForward绑定W
和S,缩放值为+1和-1,MoveRight绑定AD,缩放值同上,完成输入事件绑定
在MainCharacter.h的protected中声明如下代码:
1 | void MoveForward(float Value); |
随后进行定义:
1 | void AMainCharacter::MoveForward(float Value) |
最后在SetupPlayerInputComponent函数中进行绑定:
1 | PlayerInputComponent->BindAxis(TEXT("MoveForward),this,&AMainCharacter::MoveForward); |
至此便可以实现角色的前后左右移动逻辑,接下来完成跳跃和旋转视角
跳跃与旋转视角
操作过程与上述过程相似,在Project Settings-Input-Action Mappings中添加一个值并命名为Jump,绑定SpaceBar
随后添加如下声明与实现:
1 | void DoJump() |
并在SetUpPlayerInputComponent函数中进行绑定:
1 | PlayerInputComponet->BindAction(TEXT("Jump"),IE_Pressed,this,&AMainCharacter::DoJump); |
以上两种方法都可以实现角色的跳跃,但如果在跳跃是有一些其他逻辑可以使用第一种方法
旋转视角功能的实现方法是沿着控制器的方向进行旋转
在Project Settings-Input-Axis Mappings中添加LookUp和LookRight两个值,绑定鼠标的Y和X,Y的缩放值可根据自己的习惯
进行更改,完成以上设置后便可在代码中进行设置
声明并实现两个函数,并完成绑定:
1 | void LookUp(float Value) |
由此完成视角旋转的绑定,还可以通过添加额外的参数来限制视角旋转,如添加ViewportMoveSpeed、ViewportOffset等约束
视口的旋转速度和最大偏移量
总结
主要是输入事件的绑定,在Project Settings-Input中根据需求完成相应的绑定
Action和Axis两种绑定区别在于Action是只响应一次,Axis是轴向事件,会一直响应,可以在调用函数中添加如下代码验证
1 | UE_LOG(LogTemp,Log,TEXT("this is a log")); |
如果是Action会只打印一次,而Axis会打印多次
同时还有两种绑定方式,BindAction和BindAxis的功能显而易见,区别在于参数的不同,BindAction中多了一个按下与抬起的状态
其余大致相同,更详细的信息可以参考官方文档: https://docs.unrealengine.com/4.27/zh-CN/InteractiveExperiences/Input/
更多复杂的运动可以通过绑定自己编写的MovementComponent进行实现
- 本文作者: KongXinQing
- 本文链接: https://13114987559.github.io/2023/08/09/essay/虚幻角色的基本移动功能/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!