1. 程式人生 > >射線碰撞-Unity3D總結

射線碰撞-Unity3D總結

方法一:Physics.Raycast 光線投射

1.static function Raycast (origin : Vector3, direction : Vector3, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : bool

一個靜態的發射射線的方法,在場景中投下可與所有碰撞器碰撞的一條光線。

引數解釋:

origin:射線起始點

direction:射線方向

distance:射線長度

layerMask:只選定Layermask層內的碰撞器,其它層內碰撞器忽略。

返回布林型別,當光線投射與任何碰撞器交叉時為真,否則為假。

(注意:如果從一個球型體的內部到外部用光線投射,返回為假。 )這一點測試不成功!

2.static function Raycast (origin : Vector3, direction : Vector3, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : bool

在場景中投下可與所有碰撞器碰撞的一條光線,並返回碰撞的細節資訊。

Parameters引數

origin

The starting point of the ray in world coordinates.

在世界座標,射線的起始點。

direction

The direction of the ray.

射線的方向。

distance

The length of the ray

射線的長度。

hitInfo

If true is returned, hitInfo will contain more information about where the collider was hit (See Also: RaycastHit).

如果返回true,hitInfo將包含碰到器碰撞的更多資訊。

layerMask

A Layer mask that is used to selectively ignore colliders when casting a ray.

只選定Layermask層內的碰撞器,其它層內碰撞器忽略。

Returns

當光線投射與任何碰撞器交叉時為真,否則為假。

使用c#中out關鍵字傳入一個空的碰撞資訊類,然後碰撞後賦值。可以得到碰撞物體的transform,rigidbody,point等資訊。

詳細解釋一下: LayerMask 層蒙版

如圖所示,每一個物體都有一個Tag和Layer標籤,tag就是一個簡單的標籤,可以用來區分不同的物體,LayerMask的作用是可以選擇性地過濾物體,例如當投射射線時,比如camera.cullingmask和光線投射時候。

如圖,可以在TagManager中編輯tag和Layer

然後設定物體的Layer層級,在攝像機中設定camera.cullingmask,可以控制攝像機的渲染層級,用在射線上,可以控制射線碰撞什麼,不碰撞什麼。

//Raycast hit

RaycastHit hit;

LayerMask mask = 1 << 8;

void testRay(){

if(Physics.Raycast(transform.position,Vector3.right,out

hit,100, mask.value)){

Debug.DrawLine(transform.position,hit.point,Color.red,1);

}

}

上面的例子是從當前指令碼所繫結的物體做標點向右發射長度100的射線,射線碰撞層級為8,其他層級忽略。

為了測試,我們在碰撞到物體後畫一條紅色線條,表示射線,停留一秒鐘。

上面這些是射線的一些基本操作。

方法二:Physics.RaycastAll 光線投射

static function RaycastAll (ray : Ray, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : RaycastHit[]

static function RaycastAll (origin : Vector3, direction : Vector3, distance : float = Mathf.Infinity, layermask : int = kDefaultRaycastLayers) : RaycastHit[]

投射一條光線並返回所有碰撞,也就是投射光線並返回一個RaycastHit[]結構體。