-
射線檢查(Raycasting)會從指定座標和軸向
投射一條隱形線並偵測是否有碰撞體在線上
-
就像開槍的原理一樣
-
舉例來說, 我們的主角
想要射死那背叛他父親的邪惡方塊
-
射線檢查函式的結構是這樣
-
一開始可能有點難以理解
-
但當你明白每個參數所代表的內容
就會變得容易理解
-
首先, 射線的原點(origin)是一個世界座標的點
-
以我們的範例來說
-
我們將原點設定在槍口的位置
利用一個三維向量(Vector3)儲存X, Y和Z軸座標
-
由於世界座標軸向不一定和射擊軸向相同
-
因此我們還需要第二個向量值
來儲存我們的射擊軸向(direction)
-
這兩個變數組成了我們的射線
-
我們也可以帶入一個射線變數(Ray)
-
因為射線變數是一個可以儲存
兩個三維向量的資料類別
-
射線變數用法會長得像這樣
-
下一個參數是射線碰撞參數(RaycastHit)
用來儲存射線碰到的碰撞體資料
-
有了這個變數程式就可以呼叫
並找到射線路徑上的遊戲物件
-
最後還有兩個選擇性參數
-
第一個是射線距離(Distance)
用來設定射線的長度
-
如果沒有指定的話預設是無限距離
-
然後是圖層遮罩(Layer Mask)
用來指定射線檢查可忽略的Unity圖層
-
如果你希望射線忽略某些物件
那你可以指定到圖層遮罩裡
-
我們在來看一個射線檢查的範例
-
這個範例裡我們有一個空投箱
它在接近地面時會打開它的降落傘
-
這個空投箱是由兩個部分組成
降落傘和箱子
-
降落傘有兩個動畫
-
開傘動畫
-
和收傘動畫
-
同時我們需要射線檢查的軸向往下
這樣才知道空投箱與場景地表的距離
-
然後透過搜尋environment標籤來計算碰撞體距離
-
場景的地表已經設定了environment的標籤
-
我們就可以在程式腳本裡搜尋這個標籤
-
我們將射線函式放在IF判斷式內
所以當傳回True時表示線上有碰撞體
-
然後就會進入判斷式
並將射線碰撞參數用hit帶出
-
所以判斷式內我們寫入射線的檢查函式
-
並設定landingRay來儲存空投箱座標
-
利用往下的簡寫Vector3.down來指定軸向
-
然後將landingRay帶入檢查射線函式
而被帶出射線碰撞參數叫hit
-
它儲存了射線上碰到的碰撞體
-
我們已設定了deployment height變數
來儲存射線距離
-
所以當射線碰到了environment標籤的碰撞體
就會執行開啟降落傘的函式
-
在此函式裡會把deployed布林值設為True
用來限制這行為只能被執行一次
-
然後我們把物件剛體的線性阻力指到
parachuteEffectiveness這個變數
-
所以當降落傘開啟時
空降箱的移動速度會變慢
-
然後讓降落傘物件播放開傘動畫
-
開傘動畫就是我們會指定到
全域遊戲物件變數(parachute)的物件
-
然後我們加入一個碰撞進入函式(OnCollisionEnter)
-
讓空降箱在碰到地面或其他物件時
播放收傘動畫
-
我們設定射線距離為4
所以將Deplayment Height設定為4
-
設定剛體的線性阻力為8
所以將Parachute Effectiveness設定為8
-
然後將降落傘物件拖曳到Parachute設定
-
因為它是附有動畫元件的降落傘物件
這樣我們就可以播放開傘和關傘的動畫
-
讓我們在一次執行成果
-
有一點值得注意的是
-
雖然在遊戲或場景視圖裡你看不到射線
-
但你可以在程式腳本內加入一行
Debug.DrawRay函式來畫出射線
-
這樣一來你就可以知道射線的位置與方向
-
Debug.DrawRay函式內
我們帶入了空降箱的座標(transform.position)
-
以及軸向往下的簡寫(Vector3.down)
然後將它乘上射線距離(deploymentHeight)
-
這樣一來系統就會畫出和判斷式相同的射線
-
所以, 當我們在播放一次成果時
可以看到場景視圖畫出了一條預覽射線