Unity3D_WheelCollider车轮碰撞器
面板属性
-
Mass(质量):车轮的质量
- Radius(半径):车轮的半径大小
- Suspension Distance(悬挂距离):最大车轮悬挂伸缩距离,以自身坐标计算。悬挂总是通过自身Y轴伸展向下。
- Center(中心):车轮在对象自身坐标的中心位置
- Suspension Spring(悬挂弹簧):通过添加弹簧和阻尼力,悬挂试图达到目标位置(Target Position)。
- Spring(弹簧):弹簧力尝试达到目标位置(Target Position),大的值可使悬挂快速达到目标位置(Target Position)。
- Damper(阻尼器):阻尼器控制悬挂速度,大的值可使悬挂弹簧移动变慢。
- Target Position(目标位置):悬挂的静止状态距离沿着悬挂距离,0值充分伸展悬挂,1值充分压缩悬挂,默认值为0,这是一个标准的汽车悬挂行为
-
Forward/Sideways Friction(向前摩擦力):当车轮向前/侧向滚动时的摩擦力属性。
代码方法
- morotTorque(驱动力):为正时车向前走,为负时车向后走
- steerAngle(转向驱动力):数值为车轮的旋转角度,若数值为30,则车轮顺时针旋转30度
- brakeTorque(刹车力):数值越大,当驱动力为零时,车的速度降到零的时间越短
- rpm(车轮转速):车轮没分钟转多少圈,通过计算之后 可以让车轮模型的旋转速度该速度相当
注意
1. 不添加 Rigidbody 组件时,不会显示该碰撞器
2. 车壳的 Collider 不能包裹住 WheelCollider,否则车不会移动
3. 车轮碰撞器旋转时,车轮碰撞器所在游戏物体不会旋转,即 只有碰撞器旋转,车轮模型不会转,若想要车轮模型一起旋转需要根据 rpm 在代码中描述。
4. 得到车轮每帧旋转的角度:float speed = rpm * 6 * Time.deltaTime
5. 车轮碰撞器父物体的轴向必须与世界坐标一致,也就是说车轮碰撞器的Rotation值为(0,0,0)
实例代码参考
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Driving : MonoBehaviour { // 四个车轮碰撞器(作为车壳的子物体) public WheelCollider wheel_Forword_Left; public WheelCollider wheel_Forword_Right; public WheelCollider wheel_Back_Left; public WheelCollider wheel_Back_Right; // 四个车轮模型(每个模型作为每个车轮碰撞器的子物体) private Transform wheelModel_Forword_Left; private Transform wheelModel_Forword_Right; private Transform wheelModel_Back_Left; private Transform wheelModel_Back_Right; // 重心(作为车壳的子物体) public Transform centerOfMass; void Start() { // 设置重心(注意是 localPosition ,Position会使车不规则跳动) GetComponent<Rigidbody>().centerOfMass = centerOfMass.localPosition; // 给车轮模型赋值 wheelModel_Forword_Left = wheel_Forword_Left.transform.GetChild(0); wheelModel_Forword_Right = wheel_Forword_Right.transform.GetChild(0); wheelModel_Back_Left = wheel_Back_Left.transform.GetChild(0); wheelModel_Back_Right = wheel_Back_Right.transform.GetChild(0); } void FixedUpdate() { // 给前面两个轮子添加转弯驱动力 // Input.GetAxisRaw("Horizontal") * 30f 表示轮子的最大旋转角度为30度 wheel_Forword_Left.steerAngle = Input.GetAxisRaw("Horizontal") * 30f; wheel_Forword_Right.steerAngle = Input.GetAxisRaw("Horizontal") * 30f; // 给前面两个轮子添加前进驱动力 wheel_Forword_Left.motorTorque = Input.GetAxisRaw("Vertical") * 10f; wheel_Forword_Right.motorTorque = Input.GetAxisRaw("Vertical") * 10f; // 车轮转动(不能写成wheelModel_Forword_Left.right,车轮的旋转方向会不确定) wheelModel_Forword_Left.Rotate(wheel_Forword_Left.rpm * 6 * Time.deltaTime * Vector3.right); wheelModel_Forword_Right.Rotate(wheel_Forword_Right.rpm * 6 * Time.deltaTime * Vector3.right); wheelModel_Back_Left.Rotate(wheel_Back_Left.rpm * 6 * Time.deltaTime * Vector3.right); wheelModel_Back_Right.Rotate(wheel_Back_Right.rpm * 6 * Time.deltaTime * Vector3.right); // 车轮转弯 wheel_Forword_Left.transform.localEulerAngles = new Vector3(0, Input.GetAxisRaw("Horizontal") * 30f, 0); wheel_Forword_Right.transform.localEulerAngles = new Vector3(0, Input.GetAxisRaw("Horizontal") * 30f, 0); // 刹车 if (Input.GetKeyDown(KeyCode.Space)) { wheel_Forword_Left.brakeTorque = 100; wheel_Forword_Right.brakeTorque = 100; wheel_Back_Left.brakeTorque = 100; wheel_Back_Right.brakeTorque = 100; }else if (Input.GetKeyUp(KeyCode.Space)) { wheel_Forword_Left.brakeTorque = 0; wheel_Forword_Right.brakeTorque = 0; wheel_Back_Left.brakeTorque = 0; wheel_Back_Right.brakeTorque = 0; } } }
实例工程参考
基于Unity 2018.4.11f1(点击下载)