目的
對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