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正無窮等值

發佈了41 篇原創文章 · 獲贊 74 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章