前言
本篇博客旨在解决黑魂like游戏开发时遇到的一个问题,当咱们的角色跳起来撞墙时,会卡在半空中。
而且因为在地面时咱们是没用方法操作的,所以基本上就卡死了。
明天实现的内容:
角色跳起来时的卡墙问题形容
这个问题的形容如前言所述,问题产生的起因次要是因为在咱们的角色控制器代码会在跳起来时锁死m_planarVec,而这时m_planarVec是有大小的,所以在FixedUpdate中会始终给刚体的速度赋值(m_rb.velocity = new Vector3(m_planarVec.x, m_rb.velocity.y, m_planarVec.z) + m_thrustVec;),这原本是为了维持跳跃时的惯性成果,却导致角色撞在墙上时依旧会始终具备一个向前的速度,依照Unity的物理引擎算法,这会产生一个与墙面的摩擦力,所以导致角色掉不下来卡死在墙上。所以这是一个摩擦力的问题。要解决,咱们能够更换墙面的物理材质,或者在检测到撞墙时扭转m_planarVec从而扭转速度。
批改物理材质计划
先创立一个新的物理材质。
对于Unity物理材质的几个参数,别离是动摩擦系数,(最大)静摩擦系数,弹性,形容该物理材质与物体产生摩擦时依照什么算法计算理论摩擦系数(两个物体的最大值、最小值、平均值、相乘的值)、以及形容该物理材质与物体产生弹性时依照什么算法计算理论弹性系数(最大值、最小值、平均值、相乘)。在这里,咱们将动静摩擦都设为最小,将Combine设置为依照最小值计算。
接下来,关上Project Settings中的Physics,咱们能够将咱们本人的物理材质设置到Default Material项,这样我的项目中所有未指明物理材质的游戏对象会被默认设置为Default Material项上的材质。在这里咱们将一个失常摩擦力的材质放在Default Material项,因为咱们还是须要摩擦力来爬坡,否则站到坡上时角色会本人滑下来。
最初,为了解决BUG,咱们将在脚本中动静批改游戏对象的物理材质,计划还将是老一套,在动画状态Ground上增加FSMOnExit,增加音讯OnGroundExit,之后在OnGroundEnter中将材质设置为失常摩擦力的,在OnGroundExit中将材质设置为零摩擦力的。脚本如下:
[Header("===== 物理材质 =====")] // 最大摩擦力材质 public PhysicMaterial friction_normal; // 零摩擦力材质 public PhysicMaterial friction_zero; // 角色胶囊体碰撞器 private CapsuleCollider m_capCol; // ------------------- 生命周期办法 ---------------------- // Awake适宜用来做GetComponent void Awake() { // ... m_capCol = GetComponent<CapsuleCollider>(); } // ------------------- 音讯解决 ---------------------- public void OnGroundEnter() // OnGround应该了解为:行走/跑时 不肯定是指在高空时 { // ... // 在行走时设置角色的物理材质为最大摩擦力材质 m_capCol.material = friction_normal; } // 来到Base层的动画节点ground时执行的办法 // 通过PlayerController动画机中的ground节点上挂载的FSMOnExit调用 public void OnGroundExit() { // 没有行走时设置角色的物理材质为最大摩擦力材质 m_capCol.material = friction_zero; }
该计划能很好的解决问题
批改m_planarVec计划
这属于我本人想的计划,具体是,当角色在地面产生碰撞时,批改m_planarVec的大小。不过这个还是留着当前再试验吧。