滑墙的实现方式
动画
使用滑墙图片制作滑墙动画,只有一帧的动画
动画状态机中,增加了 onWall 这个 bool 变量,以及 blueWallSlide 这个状态
当 onWall == true 时,从 Jump 立即切换到 blueWallSlide
当 onWall == false && isGround == true 时,从 blueWallSlide 立即切换到 blueJumpLand
因为贴墙跳的时候,可能会立马进入 blueWallSlide 状态,所以从 Any State -> Jump 的条件变更为 isGround == false && onWall == false
这里 onWall 只有当 角色贴着某个方向的墙面,并且给这个方向施加力,并且 y 方向的速度不为负数时,才算 onWall
代码实现
PlayerController.Move
首先必须要允许角色在空中能够左右移动,否则滑墙是实现不了的
我自己做的时候,角色不能在空中左右移动的话,角色很快就会掉下来,我也不是很明白,明明没有 X 轴的速度,为什么角色会慢慢远离墙面
PlayerController.CheckState
人物在下滑的时候,还是固定一个下滑速度,不要像老师那样把 rb.velocity 直接减半,他的环境重力系数是4倍,所以没问题,我的环境重力系数是1倍,一直减半某个时间会出现速度变零,导致压根滑不动了
PhysicsCheck.Check
onWall 的判断条件就和动画状态机最后说的那样,人碰到哪面墙,并且往那个方向施加力,并且有个向下的速度,才算在墙上
需要注意,PhysicCheck 是通用代码,而 playerController 只有在 Player 身上才有,所以判断 onWall 之前必须要确保 isPlayer
此外滑墙时,角色的地面监测高度应该要比平时更高一点,这样角色从墙上下来的时候才不会导致刚体有 Y 轴上的移动
可以看到滑墙时的地面监测需要高半个圈,否则刚体落地时会有半个圈的位移
PlayerAnimation
蹬墙跳
蹬墙跳不需要动画,只需要代码
蹬墙跳的意思是,当玩家在墙上滑动的时候,按跳跃键就能朝反方向进行跳跃,并且能越跳越高
PlayerController.Jump
在墙上按跳跃键,就会进入到 wallJump = true,然后施加一个 左上 或 右上 的力
为什么需要 wallJump 这个变量呢?因为我们之前开放了允许角色在空中移动,需要 wallJump 暂时禁用角色在空中移动,否则角色刚一离开墙面就会因为空中移动的力又立马贴回到墙面
PlayerController.Move
通过 wallJump 变量,来限制角色刚蹬墙跳,立马又贴回墙面
PlayerController.CheckState
还要注意,我们蹬墙跳的时候,onWall 变量还是为 true 的,那么每次 Update 都会强行把向下的速度改成一个固定值,这样就无法实现向上蹬墙跳了,所以 wallJump 时不要改速度
并且在最后,如果当前是蹬墙跳,并且 y 轴速度变成负数了(也就是开始下落了),也就是说此时角色应该离开墙面很远了。此时需要把 wallJump 改为 false,允许角色可以在空中左右移动
项目相关代码
代码仓库:https://gitee.com/nbda1121440/2DAdventure.git
标签:动画,角色,滑墙,实现,PlayerController,wallJump,onWall From: https://www.cnblogs.com/hellozjf/p/18035142