0:00:00.000,0:00:08.770 射線檢查(Raycasting)會從指定座標和軸向[br]投射一條隱形線並偵測是否有碰撞體在線上 0:00:08.770,0:00:10.770 就像開槍的原理一樣 0:00:10.770,0:00:16.870 舉例來說, 我們的主角[br]想要射死那背叛他父親的邪惡方塊 0:00:17.370,0:00:20.100 射線檢查函式的結構是這樣 0:00:20.100,0:00:22.100 一開始可能有點難以理解 0:00:22.100,0:00:26.200 但當你明白每個參數所代表的內容[br]就會變得容易理解 0:00:26.200,0:00:30.200 首先, 射線的原點(origin)是一個世界座標的點 0:00:30.200,0:00:32.200 以我們的範例來說 0:00:32.200,0:00:37.580 我們將原點設定在槍口的位置[br]利用一個三維向量(Vector3)儲存X, Y和Z軸座標 0:00:37.920,0:00:41.930 由於世界座標軸向不一定和射擊軸向相同 0:00:41.930,0:00:46.210 因此我們還需要第二個向量值[br]來儲存我們的射擊軸向(direction) 0:00:46.210,0:00:48.210 這兩個變數組成了我們的射線 0:00:48.210,0:00:51.160 我們也可以帶入一個射線變數(Ray) 0:00:51.160,0:00:55.690 因為射線變數是一個可以儲存[br]兩個三維向量的資料類別 0:00:55.690,0:00:57.690 射線變數用法會長得像這樣 0:01:02.380,0:01:08.140 下一個參數是射線碰撞參數(RaycastHit)[br]用來儲存射線碰到的碰撞體資料 0:01:08.450,0:01:12.850 有了這個變數程式就可以呼叫[br]並找到射線路徑上的遊戲物件 0:01:13.150,0:01:15.610 最後還有兩個選擇性參數 0:01:15.610,0:01:19.610 第一個是射線距離(Distance)[br]用來設定射線的長度 0:01:19.610,0:01:21.610 如果沒有指定的話預設是無限距離 0:01:21.610,0:01:26.550 然後是圖層遮罩(Layer Mask)[br]用來指定射線檢查可忽略的Unity圖層 0:01:26.550,0:01:30.220 如果你希望射線忽略某些物件[br]那你可以指定到圖層遮罩裡 0:01:30.220,0:01:33.510 我們在來看一個射線檢查的範例 0:01:33.510,0:01:39.200 這個範例裡我們有一個空投箱[br]它在接近地面時會打開它的降落傘 0:01:40.460,0:01:44.030 這個空投箱是由兩個部分組成[br]降落傘和箱子 0:01:44.030,0:01:46.030 降落傘有兩個動畫 0:01:46.530,0:01:48.040 開傘動畫 0:01:48.600,0:01:50.030 和收傘動畫 0:01:50.920,0:01:55.330 同時我們需要射線檢查的軸向往下[br]這樣才知道空投箱與場景地表的距離 0:01:55.330,0:02:00.010 然後透過搜尋environment標籤來計算碰撞體距離 0:02:00.010,0:02:04.690 場景的地表已經設定了environment的標籤 0:02:05.400,0:02:09.200 我們就可以在程式腳本裡搜尋這個標籤 0:02:10.880,0:02:17.660 我們將射線函式放在IF判斷式內[br]所以當傳回True時表示線上有碰撞體 0:02:17.660,0:02:25.240 然後就會進入判斷式[br]並將射線碰撞參數用hit帶出 0:02:26.240,0:02:29.180 所以判斷式內我們寫入射線的檢查函式 0:02:29.180,0:02:35.710 並設定landingRay來儲存空投箱座標 0:02:35.710,0:02:39.710 利用往下的簡寫Vector3.down來指定軸向 0:02:39.710,0:02:44.370 然後將landingRay帶入檢查射線函式[br]而被帶出射線碰撞參數叫hit 0:02:44.370,0:02:48.370 它儲存了射線上碰到的碰撞體 0:02:48.370,0:02:53.410 我們已設定了deployment height變數[br]來儲存射線距離 0:02:53.410,0:03:01.800 所以當射線碰到了environment標籤的碰撞體[br]就會執行開啟降落傘的函式 0:03:02.300,0:03:08.190 在此函式裡會把deployed布林值設為True[br]用來限制這行為只能被執行一次 0:03:08.690,0:03:13.900 然後我們把物件剛體的線性阻力指到[br]parachuteEffectiveness這個變數 0:03:13.900,0:03:17.580 所以當降落傘開啟時[br]空降箱的移動速度會變慢 0:03:17.580,0:03:21.580 然後讓降落傘物件播放開傘動畫 0:03:21.580,0:03:25.160 開傘動畫就是我們會指定到[br]全域遊戲物件變數(parachute)的物件 0:03:25.360,0:03:27.940 然後我們加入一個碰撞進入函式(OnCollisionEnter) 0:03:27.940,0:03:34.720 讓空降箱在碰到地面或其他物件時[br]播放收傘動畫 0:03:36.440,0:03:41.810 我們設定射線距離為4[br]所以將Deplayment Height設定為4 0:03:42.030,0:03:48.620 設定剛體的線性阻力為8[br]所以將Parachute Effectiveness設定為8 0:03:48.620,0:03:54.270 然後將降落傘物件拖曳到Parachute設定 0:03:54.270,0:04:01.120 因為它是附有動畫元件的降落傘物件[br]這樣我們就可以播放開傘和關傘的動畫 0:04:01.120,0:04:03.120 讓我們在一次執行成果 0:04:06.680,0:04:08.680 有一點值得注意的是 0:04:08.680,0:04:13.090 雖然在遊戲或場景視圖裡你看不到射線 0:04:13.090,0:04:18.010 但你可以在程式腳本內加入一行[br]Debug.DrawRay函式來畫出射線 0:04:18.010,0:04:21.050 這樣一來你就可以知道射線的位置與方向 0:04:21.050,0:04:25.500 Debug.DrawRay函式內[br]我們帶入了空降箱的座標(transform.position) 0:04:25.500,0:04:33.730 以及軸向往下的簡寫(Vector3.down)[br]然後將它乘上射線距離(deploymentHeight) 0:04:33.730,0:04:38.240 這樣一來系統就會畫出和判斷式相同的射線 0:04:38.550,0:04:45.890 所以, 當我們在播放一次成果時[br]可以看到場景視圖畫出了一條預覽射線