RPG游戏开发日志1:设置自定义角色和动画
本项目同步上传于github和coding上,国内读者可以通过在coding下载项目,注意本套开发日志同步的是Tutorial分支,其他分支内容可能与日志内容不符。请注意
github地址:https://github.com/Liweimin0512/uRPG
coding地址:https://git.dev.tencent.com/JeremyBrett/uRPG.git
我们首先搞定角色的基础行为的操作,这里我们用第三人称模板新建项目。
需求分析
首先我们要搞清楚我们需求的角色移动方式是怎么样的:
1、按键wsad控制角色向前后左右四个方向移动
2、按住鼠标右键可以以角色为中心旋转摄像机
动画状态机设置
我们在mixamo下载一个角色,并下载法师的动作包。角色长这样:

导入,不需要更改什么选项:

之后我们整理一下目录结构:

然后我们将Attack相关的动作全选并批量创建动画蒙太奇:

在之后我们创建一个移动的1D的混合空间,并命名为Bs_IdleWalkRun:

水平坐标取名speed:

然后拖动3个动作加入到这里如下图所示,拖动绿点可以在上方预览效果:

然后我们创建一个动画蓝图,取名就叫做AniBp_Eve。点开动画状态机,分别添加一个slot和一个状态机。slot在之后使用动画蒙太奇时候再讲。先看状态机:

进入状态机,这里我们新建一个状态,就是Idle和run状态:

这个状态很简单,就是将我们刚创建的BS添加到这里,并把speed参数作为变量保存起来,如下图所示:

在事件图表中,我们尝试获取到动画状态机所属的Pawn,并且获取到其速度,将这个速度赋值给上文中所说的Speed变量,就可以了。

然后,我们复制一个ThirdPersonCharacter,取名叫做BP_CharacterBase,并将Mesh设为我们在自己的模型和动作。

控制器与摄像机设置
好的我们新建一个控制器蓝图,取名叫做BP_PlayerController。
在此之前,我们先设置一下项目的输入:

现在我们可以将BP_CharacterBase蓝图中的代码清空,并且将CameraSettings这里全部取消勾选,这里如果不清楚效果可以勾选之后运行一下比较一下差异就懂了。

再然后我们将TargetArmLength拉远,并且设置一个Y轴的-45°的旋转,这样看起来会有一个向下的俯视效果,也是我比较习惯的游戏角度(是的,就是WowLike)

然后打开角色控制器,首先修改一下MouseInterface如下图所示:

在BeginPlay事件中,我们获取到控制的Pawn,并将其存储在一个引用变量中,这里我将变量取名为Ref_ControlledCharacter(我习惯于将引用类型的变量标记Ref_前缀,这样方便查找和管理)。

然后,当我们按下鼠标右键的时候,表示可以旋转,我们用一个布尔值变量记录当前能否旋转的状态。

然后是镜头的上下、左右旋转,这个也比较简单,先看上下移动,首先我们需要判断一下当前是否可以旋转镜头,并且输入值是否不为0,只有当这两个条件同时满足时候才进行之后的操作

操作的内容也很简单,首先获取到角色蓝图中CameraBoom的Transform,然后旋转其Y坐标,旋转的值就是原值+输入值,注意这个Clamp节点,让旋转之后的值在一个区间之内,避免出现旋转过头的情况。当然,这个区间是我们可以调整的。之后将这个值MakeRotator并传入给CameraBoom调用的SetRelativeRotation方法即可

左右旋转的操作同理,唯一的区别就在于左右旋转并不需要在一个区间内:

处理了镜头旋转,现在开始搞定移动,这里只贴出MoveForward的操作,MoveRight同理。首先判断输入值是否不为零,如果不为零就执行移动操作,这里的移动操作依然是获取当前摄像机的角度,然后根据角度和输入的值来决定角色的移动方向和移动值。

BUG解决及优化
值得注意的是BP_CharacterBase的CharacterMovement组件的OrientRotationtoMovement需要勾选

并且BP_CharacterBase默认值中UseControllerRotationYaw需要取消勾选:

运行,测试,完美。好的,这样这一期的任务就完成了。我们下期,再见!