有不少問題
這幾篇都沒用了,還是別看吧
前言~
這只是用一系列物理計算來[模擬]出車子的行為
但本質上還是跟車子有些差距,
所以還是可能出現一些不太符合車子常理的現象
雖然說這並不是真正的車子,但這也是它的U點
意思就是它沒必要是車子
你可以放個飛艇模型就把它當飛艇,或是放個板子當懸浮板
所以實用性還是很廣的,可以放心~
這目前還有許多問題沒有修復
如果真的需要比較完整的功能還是建議去Assetstore買成品吧
成果的樣子↓
建議稍微了解Unity的物理再來看,因為有些基礎的東西我不一定會解釋
本篇教學會依照這部影片的概念解說,我自己做主要也是照著這部的解說做的
在開始做前建議先看過一次
想自己挑戰的也可以自己試試
因為圖文教學沒辦法像影片一樣一行一行解說
所以建議在觀看教學時盡量來回比對程式碼以及解說
豪
進入正題!
//
Unity 街機物理車 - 第一部份
生成懸吊點、計算懸吊距離
首先你只需要建立一個方塊,並把他拉成你想要的形狀
然後在方塊上建立一個新的腳本
接下來的一切都會在這個腳本上進行
腳本名隨意(我是取 ArcadeVehicle)
(圖A - 1)
打開腳本~
首先是變數的部分
懸吊點是動態生成的,所以需要一些基本數據
Vector3 - 懸吊點的位置
float - 懸吊長度
LayerMask - 地面的Layer
Suspensions[] - 用來儲存懸吊的資料
(B - 1)
//
然後是顯示出懸吊的預覽
在OnDrawGizmos()
首先判斷編輯器的狀態是否不在遊玩狀態中,因為這是預覽
因為計算公式的關西,所以懸吊點必須要對稱,這就是我用動態生成的原因
迴圈的概念不多解釋,就是對稱
DrawSphere也不解釋,就畫點
DrarLine的部分,因為車子可能會旋轉,所以得要用(-transform.up)來代替(Vector3.down)
你也可以試試看用(Vector3.down)會發生什麼事
(B - 2)
回到編輯器
你的車子應該要出現懸吊點(紅點)、懸吊長度(紅線)
沒出現可能是你沒開Gizmos
旁邊的參數可以依自己的喜好(遊戲需求)調整
(A - 2)
//
現在有了預覽,接下來來就是生成懸吊點
迴圈跟計算位置就沒啥好說的,跟剛剛的預覽一樣
因為懸吊點只需要是一個EmptyGameObject
所以這裡是用(GameObject suspension = new GameObject();)來生成懸吊點
然後設計一些基本的Trnsform,不多解釋
最後記得要把懸吊點存入 (Suspensions[]suspensions)用來之後的計算
(B - 3)
然後記得要在Start()中調用
(B - 4)
回到編輯器檢查懸吊點有沒有正常生成~
//
現在可以開始計算懸吊需要的數據了
這個函式需要回傳一個(RaycastHit[])用來給之後的計算
迴圈不解釋,就把每個懸吊點跑一次
然後用Physics.Raycast來偵測懸吊的數據,這部分我也不多說
懸吊的距離就用剛剛Raycast出的數據
最後再把資料加入要回傳的陣列,迴圈結束後回傳
(B- 5)
然後記得在FixedUpdate()中調用,原因不解釋,就物理計算
建立一個RaycastHit[]儲存剛剛回傳的資料
(B- 6)
現在他已經有進行懸吊的偵測了
你可以把RaycastHit的數據Print出來,檢查看看有沒有成功
記得要設置groundLayer
//
它現在已經有在做懸吊的偵測了
但看不到還是有點怪怪的,所以現在要讓它顯示出來
變數
加入兩個用來Debug的變數
記得要using UnityEngine.UI;
(B - 7)
然後在場景中建立Canvas及4個Test
並把它們放入變數中(bounceText)
(A - 3)
建立一個函式用來顯示懸吊
Text的位置不解釋,就是轉成UI座標
LinePoint就是計算懸吊的接觸點(取錯名了,應該是LineEnd)
LineColor也不解釋
然後畫線、把LinePoint傳入全域變數,等等會用、讓text顯示出懸吊距離
(B- 8)
回到OnDrawGizmos()
讓懸吊的碰撞點顯示一顆球
(B - 9)
最後再到SuspensionBounce()
建立一個變數,就是懸吊的距離,但是四捨五入到小數2位
並調用剛剛的顯示懸吊函式
(B - 10)
最後!
回到編輯器檢查成果
Text可能會有點偏移,只要更改錨點就好了
記得要設置groundLayer
好了~
這樣第一部份就完成了,接下來是計算懸吊的施力
輕鬆的部分完成了,接下來是痛苦的部分,我是指我自己
換了一種寫法,這種寫法看大家起來應該不會像之前Fog of War那樣吃力~
第二部分