unity制作賽車游戲


最近用了將近半個多月的時間研究如何用unity制作賽車游戲,找了搜索了網上很多的資料,嗶哩嗶哩上也看了很多視頻,發現有用的資料少的要死,大多數都是為了賺眼球弄得垃圾demo,毫無可玩性(簡直就是垃圾),也讀了unity官方的賽車游戲和飛行游戲的demo,發現可以借鑒的地方少的要死(具體為什么下面會提到),下面的關於如何制作一個穩定的賽車游戲的總結:

這里提出幾個有用的問題,我將根據問題去逐一解決。

1.我要制作一個怎樣的賽車游戲:

    狂野飆車是不可能的,如果牛頓知道有這么一款反重力游戲,估計會高興的從棺材里爬起來玩個三天三夜。

    由於是第一次做賽車游戲,所以這里我決定做一個模擬賽車游戲,前進鍵前進,后退鍵后退,左右鍵打方向,空格鍵手剎,shift鍵是腳剎。

2.如何去構建賽車的基本結構:

    這里懶得寫,直接操unity官方的結構構建一個。

3.賽車的基本控制代碼如何編寫:

    這里懶得寫,網上一大堆,就是那幾個代碼,驅動扭矩力,制動扭矩力,四驅,前后驅。

4.賽車輪子的參數如何設置:

    這里估計很多開發者剛接觸的時候會發現,車子總是會莫名其妙的彈起來,啟動會左右搖擺。彈起來的因為你的車子輪子的回復力已經超過了承受的重力 ,根據摩擦系數跟摩擦力和重力之間的關系,摩擦力是小於重力的,修改參數吧,至於輪子的參數,尤其是縱向摩擦和橫向摩擦,建議先去看看官方這方面的內容搞清楚了再來看下面的內容。

5.賽車如何防止側翻:

    這里我們使用一些輔助性物理的方式的處理:

第一種,設置較低的重心,就是設置rigidbody的質量中心在車子較低的位置。

第二種:添加額外輔助壓力,這里參考官方代碼,由於這里是反物理輔助性的,不要使用太大,如果你要絕對的仿真,那么就最好不用,不過玩家哪管這些呢。

m_WheelColliders[0].attachedRigidbody.AddForce(-transform.up * m_Downforce *m_WheelColliders[0].attachedRigidbody.velocity.magnitude);

第三種:平衡桿系統,這里具體內容貼上一個大佬的地址。https://blog.csdn.net/u011643833/article/details/49102423

平衡桿系統對賽車游戲可以說具有很大的效用,對防止側滑也是起到很大的作用。

var WheelL : WheelCollider;
var WheelR : WheelCollider;
var AntiRoll = 5000.0;

function FixedUpdate ()
{
    var hit : WheelHit;
    var travelL = 1.0;
    var travelR = 1.0;

    //計算兩側輪胎在不同情況下的懸掛系數
    var groundedL = WheelL.GetGroundHit(hit);
    if (groundedL)
        travelL = (-WheelL.transform.InverseTransformPoint(hit.point).y - WheelL.radius) / WheelL.suspensionDistance;

    var groundedR = WheelR.GetGroundHit(hit);
    if (groundedR)
        travelR = (-WheelR.transform.InverseTransformPoint(hit.point).y - WheelR.radius) / WheelR.suspensionDistance;

    //計算平衡桿剛度系數
    var antiRollForce = (travelL - travelR) * AntiRoll;

    //向兩側的輪胎分配力
    if (groundedL)
        rigidbody.AddForceAtPosition(WheelL.transform.up * -antiRollForce, WheelL.transform.position);  
    if (groundedR)
        rigidbody.AddForceAtPosition(WheelR.transform.up * antiRollForce, WheelR.transform.position);  
}

 

6.賽車如何防止側滑:

這里估計是所有剛接觸的開發者遇到的最大問題了,開開心心敲代碼,已啟動車子,刺溜就滑着去了,轉彎吃力,剎車剎不了,一頭的無力感。其實這也是個很雞肋的問題。由於unity的物理引擎是進行的真實物理模擬,如果我們把這里的側滑摩擦系數調到盡量高,會發現還是會打滑,而現實中你把車子開到這個速度,也會打滑,側翻也會比這個嚴重,只是現實中車子的速度都比較慢,啟動轉彎等都是緩慢過度的,所以感覺不出來。

上面防止側翻的額外添加的力其實無形中也增加了摩擦力,但是作用不明顯;至於平衡桿帶來的防止側滑的效果我暫時沒有研究出來。所以我們可以添加一些額外輔助的效果力,雖然有些反物理,但是玩的爽就行了。根據獲取每個輪子的側滑值,在每個輪子處添加與該輪子側滑方向相反的力(乘以側滑值,獲取的側滑值變量限定在0到1之間),這里相當於額外增加了側向摩檫力,從而增加了防止摩擦打滑的效果。然而我們感覺一些模擬游戲中側滑不嚴重,是因為開發者對賽道做了側向高低處理,所以游戲的時候側滑就會被抵消掉一部分,無形中增加了游戲體驗(這里我做了個實驗,把一個賽車游戲的車子demo放到平地實驗,妹的打滑情況比我的游戲車子還嚴重)。

這里呢,由於游戲中漂移主要來自一定的側滑,但是側滑嚴重又會導致游戲體驗糟糕,所以這里比較考研開發者的耐心。

7.關於賽車以及漂移和氮氣的那些事:

現實中,只開過摩托車,所以呢查了一下,漂移就是用足夠的速度和手剎來實現。但是游戲中一點小速度就可以漂移(太假了)。氮氣在游戲中簡直就是科幻的存在,就好像車子突然裝了一個火箭發動機。然而,真實的情況是氮氣瓶其實就是用於提高發動機引擎的加速度,換句話說平時一點卵用沒有,該翻車還是得翻車。另外呢上面提到的只是小游戲中的開發,如果是大型游戲,像geta5那樣,估計一個車子的外設參數能有上百個,估計除了這個車子的程序員,沒人能看的清楚,所以游戲貴也是有道理的。這里要吐槽一下unity官方的賽車游戲代碼,我一直很納悶官方是如何解決側向打滑和拐彎的,然后一個代碼SteerHelper(),看了這段狗屎一樣的代碼讓人崩潰,這是強行改變車子的速度方向,帶來的副作用就是你拐彎的時候會嚴重的拐彎,將一個糟糕的體驗轉換成另一個糟糕的體驗,這樣的有意義嗎。

8.車子如何限速:

關於車子的限速,unity官方里面還是老方法,直接用數學限速,但是這里沒有考慮到車子方向與速度方向的問題,甚至車子在空中也會被限速。這里我們有三個限速方案,前兩個時物理限速,第三個是數學限速。

第一種:取得速度在輪子方向的分量Vf,求出Vf與限定速度的分量絕對值比例b,限定b在0到1之間,用1-b求得力矩比例bf,bf乘以力矩,就得到輪子上所施加的力矩量 。這里解釋一下,相當於我們車子速度足夠快的時候,輪子的速度已經到達了扭矩軸所能達到的最高速度,也就是說扭矩軸不能再對該輪子施加速度加持了。用這個方法有個好處,就是車子在下坡等某些情況下可以超過最高速度。但是就真實情況而言,即使是下坡速度也是被擋位齒輪限制住的,所以暫時討論到此(還沒做完)。

第二種:同樣取得分量比例,但是這次不用力矩分量,而是使用剎車分量,即增加一個限速剎車分量,當速度分量超過最大速度時,通過限速剎車分量對車子進行剎車控制,從而起到擋位齒輪控制車速的作用。

第三種:先判斷輪子是否在地面上(在控制墜落的車子無法限速),如果有,那么限制車子在車子前方分量的速度值。但是這樣做的弊端就是車子在被其他車子撞到的時候,在該方向上的速度也不會增加


免責聲明!

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



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