射線檢查(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)
這樣一來系統就會畫出和判斷式相同的射線
所以, 當我們在播放一次成果時 可以看到場景視圖畫出了一條預覽射線