1. 程式人生 > >直播筆記 | Unity中射線檢測詳解

直播筆記 | Unity中射線檢測詳解

本文首發於洪流學堂微信公眾號。
洪流學堂,學Unity快人幾步

什麼是射線(Ray)?

射線檢測能用來做什麼?

  • 檢測游標位置的三維物體
  • 檢測角色前面的物體(自動開門)
  • 從空中向下檢測(凹凸不平的地形的瞬移)
  • 測量距離(鐳射測距)
  • ……

API

public static bool Raycast(Ray ray, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
public
static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal); public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int
 layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal); public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

其實你只要記住呼叫是使用 Physics.Raycast()就行啦

引數RaycastHit

可以獲取到射線碰撞後的一些引數。

常用的有:
- collider 射線檢測到的collider,這個非常常用,因為能根據collider.gameObject獲取到對應GameObject
- distance 射線發射源與檢測到的位置的距離
- normal 射線碰撞位置的法線
- point 射線碰撞位置的世界座標
- transform 射線碰撞物體的transform元件

LayerMask引數

LayerMask是一個比較難懂的引數

Layer與LayerMask的關係

Layer是0-31的數字
LayerMask是按位對應0-31

如Layer9:Enemy
LayerMask用二進位制表示:00000000 00000000 000000**1**0 00000000
從右往左第10位,等於表示式:1<<9

這是一種二進位制思想,使用mask(掩碼)表示時,可以同時表示多個狀態的有無。

二進位制思想小測驗
1000 個瓶子中有一瓶毒藥,一隻老鼠吃到毒藥一週之內會死,如果要在一週之內檢測出有毒藥的一瓶,問至少需要幾隻老鼠?
A 8
B 10
C 32
D 999
洪流學堂公眾號 回覆 老鼠 獲取答案

如何根據Layer獲取LayerMask

如果你知道Layer的名字,可以通過LayerMask.GetMask()方法獲取,注意這個方法可以傳入一個或多個string型別引數。

int mask = LayerMask.GetMask("Player", "NPC");

如果你知道Layer的數字,比如Layer9,可以通過移位操作1<<9來獲取

int playerMask = 1<<9;
int npcMask = 1<<10;
int mask = playerMask | npcMask; // 通過位操作“或(|)”同時檢測player 和 npc層
int reverse = ~mask; // 通過位操作"求反(~)",檢測除了player 和 npc的其他層

除錯小技巧

使用Debug.DrawRay()方法可以在Scene中畫出射線或者檢測到的位置,更好的方便除錯。

小結

本週直播的精華內容筆記如上,直播通知QQ群:492325637。
洪流學堂公眾號內回覆log可以獲取最新除錯外掛的下載地址。

你有沒有朋友遇到過射線檢測的問題?你可以把今天的內容分享給他,或許你能幫到他。