Unity之射線穿透

2021-09-01 05:56:54 字數 1922 閱讀 4395

一般的射線射中物體後就被阻擋了,假如碰到物體後,就會被攔截。如果我們想實現穿透某些物體,或者使射線不穿透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.

unity發射斜射線 Unity發射射線

void update shootraya shootrayb private void shootraya 例項化射線,引數1 開始位置,引數2 結束位置 ray ray new ray vector3.zero,transform.position raycasthit hit 發射乙個長度為1...

Unity 射線檢測

要使用射線檢測,物體必須是觸發器或者碰撞器。什麼是觸發器,碰撞器請看 射線檢測函式在physics 類中。由於射線無法看見,除錯起來非常不方便。unity 給我們提供了乙個畫射線的方法debug.drawray,便於除錯。debug.drawray需要在update中使用,否則渲染一幀就會消失。一幀...

Unity 射線檢測

射線是乙個無窮的線,開始於origin並沿著direction方向。例 ray ray new ray new vector3 1,1,1 new vector3 0,0,0 例2 ray ray2 camera.main.screenpointtoray input.mouseposition 從...