1. 程式人生 > >Unity3D射線檢測如何使用Layers和LayerMask

Unity3D射線檢測如何使用Layers和LayerMask

在Unity中用int32資料型別來表示32個Layer層,int32表示二進位制一共有32位(0—31)。在Unity中每個GameObject都有Layer屬性,預設的Layer都是Default。在Unity中可編輯的Layer共有24個(8—31層),官方已使用的是0—7層,預設不可編輯!如圖:
這裡寫圖片描述 這裡寫圖片描述

在程式碼中使用layers時,先了解
按位運算子:左移運算子<<,左移表示乘以2,左移多少位表示乘以2的幾次冪。

在Unity中使用LayerMask時,如何正確開啟某個Layer?
LayerMask mask = 1 << 你需要開啟的Layers層。
LayerMask mask = 0 << 你需要關閉的Layers層。
左移運算子右端是你希望產生碰撞的層的層號,如上圖我想讓名為Icon的層和射線產生碰撞,程式碼裡應該這樣寫:

LayerMaks mask = 1 << 11;

或者:

LayerMaks mask = 1 << (LayerMask.NameToLayer("Icon"));

射線部分的程式碼:

if (Input.GetTouch(0).phase == TouchPhase.Began)
{
    Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
             RaycastHit rh = new RaycastHit();
             if (Physics.Raycast
(ray, out rh, Mathf.Infinity, mask.value)) { Log.log("碰撞體的名字:" + rh.collider.name); }

關於LayerMask的其他一些方法:

LayerMask.LayerToName 層轉名稱:

using UnityEngine;using System.Collections; 
public class ExampleClass : MonoBehaviour {   
    void Example() {        Debug.Log(LayerMask.LayerToName(1));   
  }}

LayerMask.NameToLayer 名稱轉層:

using UnityEngine;using System.Collections; 
public class ExampleClass : MonoBehaviour {    void Example() {        Debug.Log(LayerMask.NameToLayer("TransparentFX"));    }}

LayerMask.value 值:

using UnityEngine;
using System.Collections; 
public class ExampleClass : MonoBehaviour {    
public LayerMask mask = -1;    
void Update() {        
if (Physics.Raycast(transform.position, transform.forward, 100, mask.value))
            Debug.Log("Hit something");     }
            }

LayerMask.GetMask 獲取蒙版:

using UnityEngine;
using System.Collections; 
public class ExampleClass : MonoBehaviour {    void Example() {        Debug.Log(LayerMask.GetMask("UserLayerA", "UserLayerB"));    }}

Unity中射線預設是碰到碰撞體就停止發射
關於Physics.Raycast射線投射:
這裡寫圖片描述
Physics.Raycast(ray, out rh, Mathf.Infinity, mask_button.value)
注意第三個引數是距離,
(1)可以是10,100,2000等具體的值
(2)也可以是Mathf.NegativeInfinity負無窮,Mathf.Infinity正無窮等值