Unity - Raycast 射線檢測
阿新 • • 發佈:2019-10-24
本文簡要分析了Unity中射線檢測的基本原理及用法,包括:
- Ray 射線
- RaycastHit 光線投射碰撞資訊
- Raycast 光線投射
- SphereCast 球體投射
- OverlapSphere 相交球等
專案地址:Raycast - SouthBegonia
Ray 射線
- 含義:官方解釋為一條無窮的線,開始於origin點,朝向direction方向(但是,根據專案驗證來看其預設長度為單位向量,只有對direction進行乘以倍率,才可實現延長射線,而非無窮)
- 用法:
Ray ray = new Ray(transform.position,transform.forward)
Ray camerRay = Camera.main.ScreenPointToRay(Input.mousePosition)
:產生一條從攝像機產生、經過螢幕上游標的射線。當相機為perspective模式,射線在相機梯形視野內發散;若為orthoGraphic,則為垂直與相機面的直線段(見上圖)
RaycastHit 光線投射碰撞資訊
- 含義:取得從Raycast函式中得到的碰撞資訊(注意不是collider哈,是包含collider資訊)
- 關鍵變數:point、collider、rigidbody、transform
檢測方法 - 線型檢測
Physics.Raycast 光線投射
- 功能:在已有一條射線(也可無)的基礎上,使用射線(新建射線)進行一定距離內的定向檢測。可修改射線長度,限制其檢測的Layer層,並且可以得到射線檢測到的碰撞資訊。但僅能檢測到第一個被射線碰撞的物體,後面的物體無法被檢測到
- 用法:
Raycast(transform.position, Vector.forward, distance, LayerMask.GetMask("Enemy"))
: 從物體中心點起,朝向Vector3.forward方向發射一條射線,該射線長度為distance,射線可檢測到的層為Enemy層,返回bool型別Raycast(transform.position, Vector.forward, distance, out RaycastHitInformation ,LayerMask.GetMask("Enemy"))
:從物體中心點起,朝向Vector3.forward方向發射一條射線,該射線長度為distance,將碰撞資訊反饋到RaycastHitInformation上,射線可檢測到的層為Enemy層,返回bool型別Raycast (MyRay, distance, LayerMash.GetMask("Enemy"))
:從已有的射線MyRay出發,長度延伸至distance,射線可檢測到的層為Enemy層,返回bool型別Raycast (MyRay, out RaycastHitInformation, distance, LayerMask.GetMask("Enemy"))
- 適用場合:配合相機座標轉換實現各類互動
Physics.RaycastAll 所有光線投射
- 功能:機理用法大致同Raycast,當區別在於可檢測射線路徑上的所有物體,返回檢測資訊的陣列。其他帶All字尾的方法也同理
- 用法:
RaycastHit[] hits = RaycastAll(Vector3.zero, Vector.forward, distance, LayerMask.GetMask("Enemy"))
RaycastHit[] hits = RaycastAll(MyRay, distance, LayerMash.GetMask("Enemy"))
- 適用場合:穿透性檢測
Physics.Linecast 線段投射
- 功能:建立某兩點之間的射線進行檢測,返回bool型別
- 用法:
Linecast(startPos, endPos, LayerMask.GetMask("Enemy"))
Linecast(startPos, endPos, out RaycastHit, LayerMask.GetMask("Enemy"))
- 適用場合:特定地點區域性距離射線檢測
檢測方法 - 體型檢測
Physics.SphereCast 球體投射
- 功能:擴充套件檢測範圍為球形,返回bool型別。但是該投射用法需要萬分小心,見下
- 用法:
SphereCast (originPos, radius, direction, out RaycastHit, distance, LayerMask.GetMask("Enemy"))
:含義是在originPos點建立半徑為radius的球體;以朝向direction方向的球面為起始面(另一面捨棄),移動distance距離,期間半球面經過的區域即為檢測區域。那麼originPos到originPos+radius內的半球區域呢?答案是捨棄,用官方的話來說,是邊界而不是包圍體。(立體結構:以左右球球心為軸線,建立半徑為radius、高為distance的圓柱體,左球挖去右半體積,右球新增右半體積)SphereCast (Ray, radius, out RaycastHit, distance, LayerMask.GetMask("Enemy"))
- 適用場合:檢測目的地是否可抵達,從而判斷可移動性
Physics.Boxcast 塊體投射/ CapsuleCast 膠囊體投射
- 功能:同球體投射
- 用法:同球體投射
Physics.OverlapSphere 相交球
- 功能:同樣檢測球形,但與SphereCast存在較大區別
- 用法:
Collider[] hits = Physics.OverlapSphere(startPos, radius, LayerMask.GetMask("Enemy"))
:以startPos為原點,建立半徑為radius的球形,檢測區域為整個球形包圍體(實心),檢測Enemy層上的物體,返回所有碰撞物體的collider而不是RaycastHit
- 適用場合:檢測掛載物體球形範圍內是否存在碰撞,常用方法
Physics.IgnoreCollision 忽略碰撞
- 功能:遮蔽兩個collider的碰撞,第三個引數為bool
- 用法:
IgnoreCollision (collider1, collider2, ignore)
參考
- Physics.Raycast - UnityDocumentation
- Unity常用射線檢測方法 - 暱稱好難寫
- Unity的學習筆記(射線檢測) - 小鳥遊
- Unity3DAPI射線檢測 - 碼迷