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(點擊下載

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM