Unity3D射線檢測如何使用Layers和LayerMask
阿新 • • 發佈:2019-01-06
在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正無窮等值