[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.00,0:00:08.77,Default,,0000,0000,0000,,射線檢查(Raycasting)會從指定座標和軸向\N投射一條隱形線並偵測是否有碰撞體在線上 Dialogue: 0,0:00:08.77,0:00:10.77,Default,,0000,0000,0000,,就像開槍的原理一樣 Dialogue: 0,0:00:10.77,0:00:16.87,Default,,0000,0000,0000,,舉例來說, 我們的主角\N想要射死那背叛他父親的邪惡方塊 Dialogue: 0,0:00:17.37,0:00:20.10,Default,,0000,0000,0000,,射線檢查函式的結構是這樣 Dialogue: 0,0:00:20.10,0:00:22.10,Default,,0000,0000,0000,,一開始可能有點難以理解 Dialogue: 0,0:00:22.10,0:00:26.20,Default,,0000,0000,0000,,但當你明白每個參數所代表的內容\N就會變得容易理解 Dialogue: 0,0:00:26.20,0:00:30.20,Default,,0000,0000,0000,,首先, 射線的原點(origin)是一個世界座標的點 Dialogue: 0,0:00:30.20,0:00:32.20,Default,,0000,0000,0000,,以我們的範例來說 Dialogue: 0,0:00:32.20,0:00:37.58,Default,,0000,0000,0000,,我們將原點設定在槍口的位置\N利用一個三維向量(Vector3)儲存X, Y和Z軸座標 Dialogue: 0,0:00:37.92,0:00:41.93,Default,,0000,0000,0000,,由於世界座標軸向不一定和射擊軸向相同 Dialogue: 0,0:00:41.93,0:00:46.21,Default,,0000,0000,0000,,因此我們還需要第二個向量值\N來儲存我們的射擊軸向(direction) Dialogue: 0,0:00:46.21,0:00:48.21,Default,,0000,0000,0000,,這兩個變數組成了我們的射線 Dialogue: 0,0:00:48.21,0:00:51.16,Default,,0000,0000,0000,,我們也可以帶入一個射線變數(Ray) Dialogue: 0,0:00:51.16,0:00:55.69,Default,,0000,0000,0000,,因為射線變數是一個可以儲存\N兩個三維向量的資料類別 Dialogue: 0,0:00:55.69,0:00:57.69,Default,,0000,0000,0000,,射線變數用法會長得像這樣 Dialogue: 0,0:01:02.38,0:01:08.14,Default,,0000,0000,0000,,下一個參數是射線碰撞參數(RaycastHit)\N用來儲存射線碰到的碰撞體資料 Dialogue: 0,0:01:08.45,0:01:12.85,Default,,0000,0000,0000,,有了這個變數程式就可以呼叫\N並找到射線路徑上的遊戲物件 Dialogue: 0,0:01:13.15,0:01:15.61,Default,,0000,0000,0000,,最後還有兩個選擇性參數 Dialogue: 0,0:01:15.61,0:01:19.61,Default,,0000,0000,0000,,第一個是射線距離(Distance)\N用來設定射線的長度 Dialogue: 0,0:01:19.61,0:01:21.61,Default,,0000,0000,0000,,如果沒有指定的話預設是無限距離 Dialogue: 0,0:01:21.61,0:01:26.55,Default,,0000,0000,0000,,然後是圖層遮罩(Layer Mask)\N用來指定射線檢查可忽略的Unity圖層 Dialogue: 0,0:01:26.55,0:01:30.22,Default,,0000,0000,0000,,如果你希望射線忽略某些物件\N那你可以指定到圖層遮罩裡 Dialogue: 0,0:01:30.22,0:01:33.51,Default,,0000,0000,0000,,我們在來看一個射線檢查的範例 Dialogue: 0,0:01:33.51,0:01:39.20,Default,,0000,0000,0000,,這個範例裡我們有一個空投箱\N它在接近地面時會打開它的降落傘 Dialogue: 0,0:01:40.46,0:01:44.03,Default,,0000,0000,0000,,這個空投箱是由兩個部分組成\N降落傘和箱子 Dialogue: 0,0:01:44.03,0:01:46.03,Default,,0000,0000,0000,,降落傘有兩個動畫 Dialogue: 0,0:01:46.53,0:01:48.04,Default,,0000,0000,0000,,開傘動畫 Dialogue: 0,0:01:48.60,0:01:50.03,Default,,0000,0000,0000,,和收傘動畫 Dialogue: 0,0:01:50.92,0:01:55.33,Default,,0000,0000,0000,,同時我們需要射線檢查的軸向往下\N這樣才知道空投箱與場景地表的距離 Dialogue: 0,0:01:55.33,0:02:00.01,Default,,0000,0000,0000,,然後透過搜尋environment標籤來計算碰撞體距離 Dialogue: 0,0:02:00.01,0:02:04.69,Default,,0000,0000,0000,,場景的地表已經設定了environment的標籤 Dialogue: 0,0:02:05.40,0:02:09.20,Default,,0000,0000,0000,,我們就可以在程式腳本裡搜尋這個標籤 Dialogue: 0,0:02:10.88,0:02:17.66,Default,,0000,0000,0000,,我們將射線函式放在IF判斷式內\N所以當傳回True時表示線上有碰撞體 Dialogue: 0,0:02:17.66,0:02:25.24,Default,,0000,0000,0000,,然後就會進入判斷式\N並將射線碰撞參數用hit帶出 Dialogue: 0,0:02:26.24,0:02:29.18,Default,,0000,0000,0000,,所以判斷式內我們寫入射線的檢查函式 Dialogue: 0,0:02:29.18,0:02:35.71,Default,,0000,0000,0000,,並設定landingRay來儲存空投箱座標 Dialogue: 0,0:02:35.71,0:02:39.71,Default,,0000,0000,0000,,利用往下的簡寫Vector3.down來指定軸向 Dialogue: 0,0:02:39.71,0:02:44.37,Default,,0000,0000,0000,,然後將landingRay帶入檢查射線函式\N而被帶出射線碰撞參數叫hit Dialogue: 0,0:02:44.37,0:02:48.37,Default,,0000,0000,0000,,它儲存了射線上碰到的碰撞體 Dialogue: 0,0:02:48.37,0:02:53.41,Default,,0000,0000,0000,,我們已設定了deployment height變數\N來儲存射線距離 Dialogue: 0,0:02:53.41,0:03:01.80,Default,,0000,0000,0000,,所以當射線碰到了environment標籤的碰撞體\N就會執行開啟降落傘的函式 Dialogue: 0,0:03:02.30,0:03:08.19,Default,,0000,0000,0000,,在此函式裡會把deployed布林值設為True\N用來限制這行為只能被執行一次 Dialogue: 0,0:03:08.69,0:03:13.90,Default,,0000,0000,0000,,然後我們把物件剛體的線性阻力指到\NparachuteEffectiveness這個變數 Dialogue: 0,0:03:13.90,0:03:17.58,Default,,0000,0000,0000,,所以當降落傘開啟時\N空降箱的移動速度會變慢 Dialogue: 0,0:03:17.58,0:03:21.58,Default,,0000,0000,0000,,然後讓降落傘物件播放開傘動畫 Dialogue: 0,0:03:21.58,0:03:25.16,Default,,0000,0000,0000,,開傘動畫就是我們會指定到\N全域遊戲物件變數(parachute)的物件 Dialogue: 0,0:03:25.36,0:03:27.94,Default,,0000,0000,0000,,然後我們加入一個碰撞進入函式(OnCollisionEnter) Dialogue: 0,0:03:27.94,0:03:34.72,Default,,0000,0000,0000,,讓空降箱在碰到地面或其他物件時\N播放收傘動畫 Dialogue: 0,0:03:36.44,0:03:41.81,Default,,0000,0000,0000,,我們設定射線距離為4\N所以將Deplayment Height設定為4 Dialogue: 0,0:03:42.03,0:03:48.62,Default,,0000,0000,0000,,設定剛體的線性阻力為8\N所以將Parachute Effectiveness設定為8 Dialogue: 0,0:03:48.62,0:03:54.27,Default,,0000,0000,0000,,然後將降落傘物件拖曳到Parachute設定 Dialogue: 0,0:03:54.27,0:04:01.12,Default,,0000,0000,0000,,因為它是附有動畫元件的降落傘物件\N這樣我們就可以播放開傘和關傘的動畫 Dialogue: 0,0:04:01.12,0:04:03.12,Default,,0000,0000,0000,,讓我們在一次執行成果 Dialogue: 0,0:04:06.68,0:04:08.68,Default,,0000,0000,0000,,有一點值得注意的是 Dialogue: 0,0:04:08.68,0:04:13.09,Default,,0000,0000,0000,,雖然在遊戲或場景視圖裡你看不到射線 Dialogue: 0,0:04:13.09,0:04:18.01,Default,,0000,0000,0000,,但你可以在程式腳本內加入一行\NDebug.DrawRay函式來畫出射線 Dialogue: 0,0:04:18.01,0:04:21.05,Default,,0000,0000,0000,,這樣一來你就可以知道射線的位置與方向 Dialogue: 0,0:04:21.05,0:04:25.50,Default,,0000,0000,0000,,Debug.DrawRay函式內\N我們帶入了空降箱的座標(transform.position) Dialogue: 0,0:04:25.50,0:04:33.73,Default,,0000,0000,0000,,以及軸向往下的簡寫(Vector3.down)\N然後將它乘上射線距離(deploymentHeight) Dialogue: 0,0:04:33.73,0:04:38.24,Default,,0000,0000,0000,,這樣一來系統就會畫出和判斷式相同的射線 Dialogue: 0,0:04:38.55,0:04:45.89,Default,,0000,0000,0000,,所以, 當我們在播放一次成果時\N可以看到場景視圖畫出了一條預覽射線