前言
本篇博客旨在解决黑魂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的大小。不过这个还是留着以后再实验吧。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。