1. 程式人生 > >Unity之射線穿透

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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!