5.第一/三人称
1.方块搭建和破坏
2.物理碰撞
3.全局重力
4.跳跃功能
5.第一/三人称
需求
1.让单位可以使用第一视角和第三视角
2.每个视角匹配对应的WADS移动模式
3.和物理系统嵌合
4.不影响原生的AI移动接口
分析
不影响原生的AI移动接口,那么通过设置unit的point来模拟移动即可.然后对于具体的实现思路,这里直接套用先前写过的一个稿子:
1.第一人称
通过分析现实生活中”人”的移动方式得出结论: WADS的移动只影响角色的移动方向,不会影响角色的视野和朝向,即不会旋转角色的视野和移动方向,并且WADS移动的时候是基于当前角色朝向进行的移动.例如当前unit的direction 为north,那么按下W的时候,unit就会向north移动, 如果当前unit的direction为south,那么按下W的时候,unit会朝south移动.
WADS移动部分:
在处理这里的时候不能简单的通过键盘的按下事件来设置unit的移动distance,这样会导致在按下事件的事件队列中,后续的事件会覆盖前面事件的行为,导致unit每次只能响应一个事件的情况,因此,需要设置两个局部变量x,y来记录按键的状态,W按下y += 1,S按下y -= 1,A按下X += 1,D按下X -= 1,还需要注意的一点是,按键按下后的加还是减,取决于世界坐标系中对应unit的direction时是变大还是变小.然后根据x,y的值来判定当前unit的移动direction .此处计算需要根据当前unit的direction为基轴进行偏移.接着以当前unit所在的point向前面计算出来的direction进行固定步长的distance偏移,此处的偏移量就是单位时间内的速度.得到偏移点后,还需要判定改点是否处于场景中的物体内部,如果是,则通过物体表面距离unit的最近点为最终的偏移点,最后把unit的position设置为改偏移点即可.整个逻辑可以放在UpdataTimer中执行即可完成功能.
外观层部分:
人物的移动虽然从数学上讲,就是点的位置偏移,但对于游戏而言还需要动作进行适配,增加玩家体感,因此,在x,y值首次都不为0的时候,也就是首次停止下来的时候给unit适配待机动画,首次移动的时候适配walk或者run动画,同时这两次状态之间的切换为了确保状态的处理简单性,都使用唯一状态,而不使用状态融合,所以在每次切换状态的时候,都对其余状态置空,仅标记保存当前状态.
摄像机部分:
通过引擎提供的获取鼠标在屏幕的X,Y的占比来进行.设置一个upvalue值,例如mousePointTemp,它缓存了 鼠标上一帧时候的屏幕X,Y占比值,然后通过UpdataTimer不断获取新的鼠标占比值,通过用新值-mousePointTemp的差值作为camera修改pitch和yaw值的根植,同时提供两个灵敏度参数,便于玩家根据自身喜好调整鼠标对镜头的操作灵敏度,也就是在前面的差值基础上分别乘以对应的灵敏度值,然后修改camera的pitch和yaw即可,但需要注意的一点是,camera的yaw和pitch值修改的时候是基于camera的focus进行的,也就是说,如果鼠标向右边拉,那么camera的yaw值应该是减去差值的,此外注意一下yaw值和pitch值的值域,最后将camera当前的yaw值经过-pi后赋值给unit的direction.但在实际的应用中发现了一个问题:通过UpdataTimer来修改camera的欧拉角的行为存在抖动问题,因此需要对其欧拉角的修改进行插值,这里使用了拉格朗日插值法:
,这里使用3次插值即可,避免高次插值的Runge现象.
2.第三人称
与第一人称有大部分地方是类似的,但其中存在一定的差异,在进行该功能的开发时,参考了<<原神>>的实际操作方式.整体拆解下来就是:WADS控制人物的移动方向和朝向,鼠标控制朝向和摄像机视野角度.
WDAS移动:
在通过X,Y变量记录完键盘按下情况之后,通过世界原点(0, 0)和(x, y)形成的方向向量与世界基轴的夹角作为unit的direction的分量之一,然后与摄像机部分计算出的navacationTemp值进行矢量合成,得出实际的direction值,然后赋值给unit的朝向属性即可
外观层部分:
同第一人称一样
摄像机部分:
跟第一人称类似,不过需要额外用upvalue变量缓存一下当前的yaw值-pi后的值,用于WADS部分的移动方向的矢量合成.另外因为第三人称摄像机会距离unit一定的距离,因此当camera向头顶看时就会出现camera穿模现象,而camera由于不存在物理collision(其实都没有物理碰撞),因此只能通过建立camera的焦距关于pitch角的数学模型来近似模拟camera与地面的collision效果了.这里直接给出数学模型:
实际效果就是镜头向上看的时候会自动缩进距离.
实现
这里直接使用CliCli内置的二次开发语言编写
第三人称
第一人称
效果
难点
1.对第一/三人称的效果分析
2.先数据处理再执行的模式
3.数据转换和调整
4.兼容其它模块