Unity之射線穿透
一般的射線射中物體後就被阻擋了,假如碰到物體後,就會被攔截。如果我們想實現穿透某些物體,或者使射線不穿透UI的話。這時候就需要穿透的知識了。
下面寫一個簡單的射線。
public Transform RayStartPoint;
private Ray ray;
// Use this for initialization
void Start ()
{
ray =new Ray(RayStartPoint.position, transform.forward);
RaycastHit hit;
if (Physics.Raycast(ray,out hit, 500))
{
//列印碰撞資訊
print(hit.collider.name);
//畫線,使其射線視覺化。
Debug.DrawLine(RayStartPoint.position, hit.point, Color.red,100);
}
}
射線只碰撞第一個方塊就截斷了。列印資訊也為第一個方塊的名字。
下面我們再來添兩句程式碼,使其實現穿透效果,讓射線可以穿透前兩個射到第三個方塊身上。
首先申請一個變數。
//定義一個公共的層級,只選定Layermask層內的碰撞器,其它層內碰撞器忽略。選擇性碰撞
**public LayerMask mask;**
//也可以這樣寫:
// public LayerMask mask = 1 << 8;開啟第8的層
// ~(1 << 10)開啟除了第10之外的層。
// ~(1 << 0)開啟所有的層。
// (1 << 10) | (1 << 8)開啟第10和第8的層。
然後將if條件,改為以下程式碼,就可以實現穿透效果啦。mask即為選擇的層,也就是隻和mask層相撞,否則不撞,或穿透。
**if (Physics.Raycast(ray, out hit, 500, mask))**
效果如下。
是不是很簡單呢。可能很多童鞋看不懂LayerMask。下面就來細說一下它。
這篇博文主要的知識點就是對LayerMask的理解。
LayerMask實際上是一個位碼操作,在Unity3D中一共有32個Layer層,並且不可增加。
按位運算子:~、|、&、^。位運算子主要用來對二進位制位進行操作。
按位運算子:左移運算子<<,左移表示乘以2,左移多少位表示乘以2的幾次冪。
舉個栗子:
var temp = 14 << 2; 表示十進位制數14轉化為二進位制後向左移動2位。
temp最後計算的值為14乘以2的平方,temp = 56;
同理,右移運算子>>,移動多少位表示除以2的幾次冪。
上面是個基礎知識的補充。
在Unity官方中給出的描述是:Layers通常被攝像機用來渲染部分場景,和燈光照射部分場景使用。但是它們也可以用來做射線檢測時忽略一些collider或Collision使用。
在程式碼中使用時如何開啟某個Layers?
LayerMask mask = 1 << 你需要開啟的Layers層。
LayerMask mask = 0 << 你需要關閉的Layers層。
舉幾個栗子:
LayerMask mask = 1 << 2; 表示開啟Layer2。
LayerMask mask = 0 << 5;表示關閉Layer5。
LayerMask mask = 1<<2|1<<8;表示開啟Layer2和Layer8。
LayerMask mask = 0<<3|0<<7;表示關閉Layer3和Layer7。
上面也可以寫成:
LayerMask mask = ~(1<<3|1<<7);表示關閉Layer3和Layer7。
LayerMask mask = 1<<2|0<<4;表示開啟Layer2並且同時關閉Layer4.
看了這些是不是就已經明白啦。
---------------------
作者:黑色最低調的奢華
來源:CSDN
原文:https://blog.csdn.net/qq_36282052/article/details/70225549
版權宣告:本文為博主原創文章,轉載請附上博文連結!