面板屬性
-
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(點擊下載)