The Wheel Collider is a special collider for grounded vehicles. It has built-in collision detection, wheel physics, and a slip-based tire friction model. It can be used for objects other than wheels, but it is specifically designed for vehicles with wheels.
车轮碰撞器是一个特殊的地面车辆碰撞器。它具有内置的碰撞检测、车轮物理引擎和一个基于滑移的轮胎摩擦模型。当然,它也可以用于其他对象,但它是专门为有轮子的车辆设计。
Unity文档:
WheelCollider -UnityDocumentation
参考DEMO:
Standard Assets -UnityAssetStore
Edy’s Vehicle Physics -UnityAssetStore
WheelCollider是Unity做物理车的一种组件,包括悬挂系统、前进后退拐弯等物理车操作。
组件的主要参数:分别是
Mass 质量
Radius 半径
wheelDampingRate 车轮尼阻
suspension distance 悬挂距离
forceAppPointDistance 施力点距离
Center 中心
Suspension Spring 悬挂弹簧
ForwardFriction 正方向摩擦
SideWaysFricition 侧方向摩擦
组成:
WheelCollider 最好与车轮模型分开处理,每一个车轮单独一个WheelCollider。并在代码中让车轮模型和WheelCollider在进行同步操作。
车轮模型最好自身Rotation为(0,0,0),并且父物体和WheelCollider的父物体在Rotation上保持一致。
WheelCollider的父物体需要一个Rigidbody组件,否则在Sence视图下WheelCollider也不会显示
前进后退:
wheelCollider.motorTorque //前进赋予这个力矩数值(>0)
wheelCollider.brakeTorque //后退赋予这个力矩数值(>0)
刹车时候减速也可通过赋予BrakeTorque来缩短减速时间
模拟前轮驱动:仅对前轮两个wheelCollider赋予力矩
模拟后轮驱动:仅对后轮两个wheelCollider赋予力矩
模拟四轮驱动:对四个wheelCollider赋予力矩
N轮驱动同理;
获取当前速度:
Rigidbody.velocity
Rigidbody.velocity是一个Vector3的值,包含其方向信息
获取速度值:Rigidbody.velocity.magnitude
获取速度方向:Rigidbody.velocity.normalized
保持车辆最大速度
if(speed >= maxSpeed)
{
wheelCollider.motorTorque = 0;
}
else
{
wheelCollider.motorTorque = value;
}
加速
加速跟前进一样都是可以通过
wheelCollider.motorTorque = value
实现,但是这一个加速是一个缓慢的起步过程。
实现快速起步或者快速加速可以通过:
1.直接给刚体速度
2.直接给刚体力
但是这两种方式都会造成车轮空转的问题
给刚体速度
Vector3 dir = this.transform.forward;
rb.velocity += normalMaxSpeed * 0.1f * dir.normalized;
给刚体前进力
Vector3 dir = this.transform.forward;
rb.AddForce(dir.normalized * force, ForceMode.VelocityChange)
模型同步
Vector3 pos;
Quaternion quat;
wheelColliders.GetWorldPose(out pos, out quat);
可以通过wheelColliders.GetWorldPose来获取WheelColliders 的世界坐标跟旋转角度,然后赋予到对应的车轮模型上进行同步
当然你也可以根据需要修改某些值跟只取某些值
quat.eulerAngles.x 为车轮向前后滚动的值
quat.eulerAngles.z 为车轮向左右偏转的值
车辆转向
车辆转向可以使用WheelCollider进行转向,也可以通过旋转车体进行转向
使车轮偏转角度,然后根据物理使车辆转动,一般都对前轮进行操作:
wheelCollider.steerAngle = value;
使车身偏转角度,直接拐弯
this.transform.Rotate(new Vector3(-x, 0, 0));
要模拟前轮先转后面再甩尾的话可以增加一个旋转中心,在旋转
this.transform.RotateAround(rotateCenter.position ,Vector3.up, angle);
但是后面的直接偏转车身的话wheelCollider本身不会旋转,所以车轮模型的偏转需要脱离WheelCollier,而自己去指定Z轴的偏转角度
其他
可以指定车身质量中心来使车平稳
Rigidbody.centerOfMass = massCenter.localPosition;
获取WheelCollider 是否着地
wheelCollider.isGrounded
获取WheelCollider转速
wheelColliders.rpm