1 00:00:00,000 --> 00:00:08,770 射線檢查(Raycasting)會從指定座標和軸向 投射一條隱形線並偵測是否有碰撞體在線上 2 00:00:08,770 --> 00:00:10,770 就像開槍的原理一樣 3 00:00:10,770 --> 00:00:16,870 舉例來說, 我們的主角 想要射死那背叛他父親的邪惡方塊 4 00:00:17,370 --> 00:00:20,100 射線檢查函式的結構是這樣 5 00:00:20,100 --> 00:00:22,100 一開始可能有點難以理解 6 00:00:22,100 --> 00:00:26,200 但當你明白每個參數所代表的內容 就會變得容易理解 7 00:00:26,200 --> 00:00:30,200 首先, 射線的原點(origin)是一個世界座標的點 8 00:00:30,200 --> 00:00:32,200 以我們的範例來說 9 00:00:32,200 --> 00:00:37,580 我們將原點設定在槍口的位置 利用一個三維向量(Vector3)儲存X, Y和Z軸座標 10 00:00:37,920 --> 00:00:41,930 由於世界座標軸向不一定和射擊軸向相同 11 00:00:41,930 --> 00:00:46,210 因此我們還需要第二個向量值 來儲存我們的射擊軸向(direction) 12 00:00:46,210 --> 00:00:48,210 這兩個變數組成了我們的射線 13 00:00:48,210 --> 00:00:51,160 我們也可以帶入一個射線變數(Ray) 14 00:00:51,160 --> 00:00:55,690 因為射線變數是一個可以儲存 兩個三維向量的資料類別 15 00:00:55,690 --> 00:00:57,690 射線變數用法會長得像這樣 16 00:01:02,380 --> 00:01:08,140 下一個參數是射線碰撞參數(RaycastHit) 用來儲存射線碰到的碰撞體資料 17 00:01:08,450 --> 00:01:12,850 有了這個變數程式就可以呼叫 並找到射線路徑上的遊戲物件 18 00:01:13,150 --> 00:01:15,610 最後還有兩個選擇性參數 19 00:01:15,610 --> 00:01:19,610 第一個是射線距離(Distance) 用來設定射線的長度 20 00:01:19,610 --> 00:01:21,610 如果沒有指定的話預設是無限距離 21 00:01:21,610 --> 00:01:26,550 然後是圖層遮罩(Layer Mask) 用來指定射線檢查可忽略的Unity圖層 22 00:01:26,550 --> 00:01:30,220 如果你希望射線忽略某些物件 那你可以指定到圖層遮罩裡 23 00:01:30,220 --> 00:01:33,510 我們在來看一個射線檢查的範例 24 00:01:33,510 --> 00:01:39,200 這個範例裡我們有一個空投箱 它在接近地面時會打開它的降落傘 25 00:01:40,460 --> 00:01:44,030 這個空投箱是由兩個部分組成 降落傘和箱子 26 00:01:44,030 --> 00:01:46,030 降落傘有兩個動畫 27 00:01:46,530 --> 00:01:48,040 開傘動畫 28 00:01:48,600 --> 00:01:50,030 和收傘動畫 29 00:01:50,920 --> 00:01:55,330 同時我們需要射線檢查的軸向往下 這樣才知道空投箱與場景地表的距離 30 00:01:55,330 --> 00:02:00,010 然後透過搜尋environment標籤來計算碰撞體距離 31 00:02:00,010 --> 00:02:04,690 場景的地表已經設定了environment的標籤 32 00:02:05,400 --> 00:02:09,200 我們就可以在程式腳本裡搜尋這個標籤 33 00:02:10,880 --> 00:02:17,660 我們將射線函式放在IF判斷式內 所以當傳回True時表示線上有碰撞體 34 00:02:17,660 --> 00:02:25,240 然後就會進入判斷式 並將射線碰撞參數用hit帶出 35 00:02:26,240 --> 00:02:29,180 所以判斷式內我們寫入射線的檢查函式 36 00:02:29,180 --> 00:02:35,710 並設定landingRay來儲存空投箱座標 37 00:02:35,710 --> 00:02:39,710 利用往下的簡寫Vector3.down來指定軸向 38 00:02:39,710 --> 00:02:44,370 然後將landingRay帶入檢查射線函式 而被帶出射線碰撞參數叫hit 39 00:02:44,370 --> 00:02:48,370 它儲存了射線上碰到的碰撞體 40 00:02:48,370 --> 00:02:53,410 我們已設定了deployment height變數 來儲存射線距離 41 00:02:53,410 --> 00:03:01,800 所以當射線碰到了environment標籤的碰撞體 就會執行開啟降落傘的函式 42 00:03:02,300 --> 00:03:08,190 在此函式裡會把deployed布林值設為True 用來限制這行為只能被執行一次 43 00:03:08,690 --> 00:03:13,900 然後我們把物件剛體的線性阻力指到 parachuteEffectiveness這個變數 44 00:03:13,900 --> 00:03:17,580 所以當降落傘開啟時 空降箱的移動速度會變慢 45 00:03:17,580 --> 00:03:21,580 然後讓降落傘物件播放開傘動畫 46 00:03:21,580 --> 00:03:25,160 開傘動畫就是我們會指定到 全域遊戲物件變數(parachute)的物件 47 00:03:25,360 --> 00:03:27,940 然後我們加入一個碰撞進入函式(OnCollisionEnter) 48 00:03:27,940 --> 00:03:34,720 讓空降箱在碰到地面或其他物件時 播放收傘動畫 49 00:03:36,440 --> 00:03:41,810 我們設定射線距離為4 所以將Deplayment Height設定為4 50 00:03:42,030 --> 00:03:48,620 設定剛體的線性阻力為8 所以將Parachute Effectiveness設定為8 51 00:03:48,620 --> 00:03:54,270 然後將降落傘物件拖曳到Parachute設定 52 00:03:54,270 --> 00:04:01,120 因為它是附有動畫元件的降落傘物件 這樣我們就可以播放開傘和關傘的動畫 53 00:04:01,120 --> 00:04:03,120 讓我們在一次執行成果 54 00:04:06,680 --> 00:04:08,680 有一點值得注意的是 55 00:04:08,680 --> 00:04:13,090 雖然在遊戲或場景視圖裡你看不到射線 56 00:04:13,090 --> 00:04:18,010 但你可以在程式腳本內加入一行 Debug.DrawRay函式來畫出射線 57 00:04:18,010 --> 00:04:21,050 這樣一來你就可以知道射線的位置與方向 58 00:04:21,050 --> 00:04:25,500 Debug.DrawRay函式內 我們帶入了空降箱的座標(transform.position) 59 00:04:25,500 --> 00:04:33,730 以及軸向往下的簡寫(Vector3.down) 然後將它乘上射線距離(deploymentHeight) 60 00:04:33,730 --> 00:04:38,240 這樣一來系統就會畫出和判斷式相同的射線 61 00:04:38,550 --> 00:04:45,890 所以, 當我們在播放一次成果時 可以看到場景視圖畫出了一條預覽射線