前言
本篇博客旨在解决黑魂 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 的大小。不过这个还是留着当前再试验吧。