unity car demo解析


目的

  對unity的car demo進行解析,看下wheelcollider的運行原理。

結果

  下圖就是我用unity的基礎模型搭建起來的車子,實現了前進、后退、轉彎、剎車等功能,當然就是抄的官方的代碼。

搭建模型

  攝像機、燈光使用創建場景時默認的。

  創建一個plane當道路使用,一個cube用來檢測碰撞。

  cube有三種用來測試碰撞的狀態。一是可以不添加rigidbody,此時cube為靜態剛體,碰撞時不會動。而是添加rigidbody但是使用is kinematic選項,此時cube為動態運動學剛體,碰撞效果和靜態剛體一樣,不會動。三是使用rigidbody,但是不勾選is kinematic,對剛體的mass大小進行修改,我們的車子默認是1000kg,可以看到不同障礙物的碰撞反應。

  主體car,也就是車子就比較復雜了。如上圖所示,主要分為模型和碰撞體兩部分,碰撞體又分為車身碰撞體和車輪碰撞體。

  

車身碰撞體

  車身碰撞體用的是簡單的unity中自帶的boxcollider,分別用了三個表示車身、車底座、車頭,當然你還可以增加你需要的collider。

車輪碰撞體 wheelcollider

  車輪碰撞體用的是unity中自帶的wheelcollider,分別有前左輪、前右輪、后左輪、后右輪,參數暫時使用默認的參數。

模型

  車身模型都是使用的unity中自帶的cube,車輪使用的是unity中自帶的sphere。注意,需要把他們自帶的collider都刪除掉,因為我們在前兩步已經添加了對應的collider了。

關鍵代碼解釋

方向控制

m_steerAngle = steering*m_maxSteerAngle;
            //Debug.Log(m_steerAngle);
            m_wheelColliders[0].steerAngle = m_steerAngle;
            m_wheelColliders[1].steerAngle = m_steerAngle;

wheelcollider有個參數為steerAngle,通過調節這個參數就可以控制車子的轉向,這個地方需要注意車子的轉向角度有個最大值,例子中給的是25°。

油門控制

 private void ApplyDrive(float accel, float footbrake)
        {
            float thrustTorque;
            switch (m_carDriveType)
            {
                case CarDriveType.FourWheelDrive:
                {
                    thrustTorque = accel*(m_currentTorque/4f);
                    for (int i = 0; i < 4; i++)
                    {
                        m_wheelColliders[i].motorTorque = thrustTorque;
                    }
                    break;

                }
                case CarDriveType.FrontWheelDrive:
                {
                    thrustTorque = accel * (m_currentTorque / 2f);
                    m_wheelColliders[0].motorTorque = m_wheelColliders[1].motorTorque = thrustTorque;
                    break;
                }
                case CarDriveType.RearWheelDrive:
                {
                    thrustTorque = accel * (m_currentTorque / 2f);

                    m_wheelColliders[2].motorTorque = m_wheelColliders[3].motorTorque = thrustTorque;
                    break;
                }
            }

            for (int i = 0; i < 4; i++)
            {
                if (CurrentSpeed > 5 && Vector3.Angle(transform.forward, m_rigidbody.velocity) < 50f)
                {
                    m_wheelColliders[i].brakeTorque = m_brakeTorque*footbrake;
                }
                else if (footbrake > 0)
                {
                    m_wheelColliders[i].brakeTorque = 0f;
                    m_wheelColliders[i].motorTorque = -m_reversTorque*footbrake;
                }
            }
        }

case語句將車子分為四驅、前驅、后驅,本例按四驅來解釋。當車子為四驅時,向前的牽引力需要分配給四個輪子,所以需要除以4。accel為油門系數,當我們按”w“鍵時,這個值就會慢慢變為1,這時我們通過修改motorTorque參數的值就可以控制車子前進起來了。
footbrake為剎車系數,當我們按”s“鍵的時候,這個值會慢慢變為1,這時我們通過修改brakeTorque的值就可以給車子增加剎車力矩。當然剎車力矩時在車速比較高的條件下才需要修改的,這里我們當速度大於5km/h時就添加剎車力矩。

當汽車速度較小,footbrake參數將會用來當倒車系數,這個和油門系數一樣,乘以倒車力矩的最大值,即可獲得實時的倒車力矩,用來實現倒車的效果。

 

源碼放在了git上 http://git.oschina.net/zkzk945/CarDemo


免責聲明!

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



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