Unity 街機物理車 - 第二部份
懸吊施力、懸吊阻力
第一部份
這一部分是在影片中 2 : 10 - 3 : 10 的時候講解,我自己就不講解了
對…這一分鐘的內容要寫一篇,如果是真的要做的人,記得要先看過歐
繼續~
在編輯器
要對車輛施力,車輛得要具有物力性質
所以要給車子添加RigidBody~
屬性就像圖中一樣
所有的Drag 都會直接在計算中進行
而Collision Detection就不解釋
(A - 1)
回到腳本
添加一個Rigidbody變量
(B - 1)
//
在 SuspensionBounce() 的迴圈中,我們必須加入一條判斷
判斷懸吊有沒有接觸到地板
上次已經把懸吊偵測結果存在Bool裡了,直接使用就好
懸吊所有力算都要在裡面進行
(B-2)
施力的力道,回到國中物理
F = MA
M 的部分就是車輛質量,所以這裡直接從RigidBody取得
A 的話,因為懸吊是要向上施力的,所以就用Unity Grivaty.y - 9.81
施力的力道F 就用剛剛的MA
但是! 因為這是在每個懸吊上執行,所以施力量還得要除與懸吊數量
(B - 3)
再來就是對RrigidBody施力
首先先把施力力度乘上施力方向,因為車子會傾斜,所以方向是懸吊點朝上,而不是(vector3.up)
在來是施力,之力必須對著懸吊點施,而不是整個物體
所以要用(rigidbody.AddForceAtPosition())代替(AddForce())
(B - 4)
現在回到編輯器,執行
如果你的車子是傾斜的,那它應該會朝傾斜的方向滑
如果擺正,那它應該[浮]在原地不動(可能會有點浮點數誤差,但不影響)
(A - 2)
//
再回來腳本
就像影片中說到的,跟著懸吊的壓縮,改變懸吊的施力
先計算懸吊的壓縮比(總懸吊長 - 當前長度) / 總懸吊長
再來把懸吊的施力乘上壓縮比再承2
承2的原因是因為,它現在的施力最大值是9.81,只夠剛好撐住車輛
但要把車輛向上回推,得要有更大的力量! 而承2的話那它的靜止點會在中間
最後再更改施裡方向的算式,這樣施力的第一部份就完成了
(B - 5)
回到編輯器~~
在測試時可以把懸吊設長一點,效果會比較明顯
執行!!
然後你的車子就會開始跳舞(゚∀゚)
沒有的話你就把車子放高一點,往下丟~
(請注意: 懸吊點的位置不能在主體的碰撞盒外,避免懸吊點穿入地面)
(C - 1)
//
顯然這樣不對,所以現在來加一點修正
首先添加幾個變數
K是懸吊的強度(彈力係數?)
Demping是阻力,但不是你想的那種
(B- 6)
然後是結構(Struct) Suspensions
加入一個函式,不解釋
至於那個lastLenght是要用來算阻力的
(B - 7)
回到SuspensionBounce()的迴圈
添加一個零時變數,等等用來算阻力
(B - 8)
回到懸吊施力
用彈力公式來計算彈簧施力,至於公式是啥,就自己去Wiki看吧~
然後更新施力公式
(B - 9)
回到編輯器,執行!
現在你的懸吊會變得很彈,看起來就正常多了
效果不明顯的話可以把K調高
(請注意: 懸吊點的位置不能在主體的碰撞盒外,避免懸吊點穿入地面)
(C - 2)
(彈簧這部分可有可無,看使用需求)
//
然而彈簧是不會一直彈的
所以現在要來加上阻力,不過這也不是真正的阻力
只是在達成某個條件時減少施力量
首先加入兩個臨時變數,一個是懸吊的加速度方向,另一個是懸吊的施力方向
在來判斷懸吊的加速度方向與懸吊的施力方向是否一致
一致的話,就把施力減掉阻力 - 達成某個條件時減少施力量
然後更改施力算式
最後再把suspensionLenght設給lastSuspensionLenght,給下一次計算用
(B - 10)
回到編輯器!
執行!!
現在就不會無盡的彈跳了
(請注意: 懸吊點的位置不能在主體的碰撞盒外,避免懸吊點穿入地面)
(C - 3)
完成!
第二部分完成!!
比較累的部分完成了,還好接下來移動計算還算輕鬆~
哇…1.2K個字,我打報告都沒這麼勤
第三部份
49大改版
好想玩( º﹃º )