项目里遇到车子在场地漫游的需求,因为要模拟真实物理效果,而且场地里会有上下坡,所以我选择了rigidbody.addforce的移动方法。
但是遇到一些问题 查了api之后才发现这个移动方式需要在FixedUpdate而不是Update里调用,否则只是加一个瞬间的力而不是持续的力。所以最后还是选择了直接给rigidbody.velocity赋值的移动方法。
这个移动方法我遇到的问题是,因为场地里有矮的障碍物,车子如果在撞上障碍物之后还继续强行向前移动的话会行进到障碍物上方,最开始想的解决办法是用空气墙阻止车子开上障碍物,但是空气墙做好了之后又发现车子撞到空气墙之后还强行加速的话,车屁股会翘起来,后退撞上障碍物的话车头会翘起来。后来去问了大佬,给的解决方法是在车子行进过程中给一个向下的力压住车子。这个做好以后原来调好的速度数值也不能用了因为向下加力之后车子跟地面的摩擦力太大了,而且PC端合适的数值导到移动端也又不合适了。然后大佬说可以改变材质球的摩擦力,在车子动的时候把材质球设置为0摩擦的,需要停下来的时候设置为高摩擦的。这样加力就对车子速度没影响。同时解决了车头车屁股翘和pc端手机端移动数据一样效果不一样的问题。
改变材质球摩擦力代码如下
private static PhysicMaterial zeroFrictionMaterial; //零摩擦材质
private static PhysicMaterial highFrictionMaterial; //高摩擦材质
void OnEnable()
{
if (zeroFrictionMaterial == null)
{
zeroFrictionMaterial = new PhysicMaterial();
zeroFrictionMaterial.dynamicFriction = 0f;
zeroFrictionMaterial.staticFriction = 0f;
zeroFrictionMaterial.frictionCombine = PhysicMaterialCombine.Minimum;
zeroFrictionMaterial.bounciness = 0f;
zeroFrictionMaterial.bounceCombine = PhysicMaterialCombine.Minimum;
}
if (highFrictionMaterial == null)
{
highFrictionMaterial = new PhysicMaterial();
}
}
// 物理材质
// 设置碰撞器到高摩擦材质
public void HighFriction()
{
capsule.GetComponent<MeshCollider>().material = highFrictionMaterial;
}
// 设置碰撞器为零摩擦材质
public void ZeroFriction()
{
capsule.GetComponent<MeshCollider>().material = zeroFrictionMaterial;
}