ue3dUnity蒙版层的使用方法

Unity蒙版层的使用方法

分类:
ue3d - Unity蒙版层的使用方法

层掩码是一个32位的标志,用整数表示,位移位用于更改图层蒙版标志的值。

例如

位移位 (C#)32 位标志整数值
1<<00000 0000 0000 0000 0000 0000 0000 00011个
1<<80000 0000 0000 0000 0000 0001 0000 0000256
1<<90000 0000 0000 0000 0000 0010 0000 0000512

在Unity软件中的右上角可以看到Layer菜单,可以通过单击编辑图层下拉选项来添加和编辑图层,前8层(0-7)是无法编辑的内置层,但可以添加接下来的24层(8-31),称为用户层。

ue3d - Unity蒙版层的使用方法

如果想要对某些特定层的光线投射碰撞器进行光线投射时,层蒙版非常有用,例如在游戏中只想将子弹打到敌人或任何特定的游戏对象,那么就可以使用图层蒙版。

Raycast使用图层蒙版来实现

先从这里下载本案例的演示项目。

在场景中添加三种类型的游戏对象,现在在场景中添加了立方体球体圆柱体

ue3d - Unity蒙版层的使用方法

为这三种类型的游戏对象添加三个不同的层

ue3d - Unity蒙版层的使用方法

在Unity软件中为每种类型的游戏对象添加合适的图层,现在正在为立方体类型的游戏对象等添加立方体层。

ue3d - Unity蒙版层的使用方法

仅命中蒙版层碰撞器

在项目的资产文件夹中创建脚本LayerMaskDemo,按照下面给定的代码编辑脚本并将其附加到Main Camera(主摄像机)游戏对象。

using UnityEngine;
using System.Collections;

public class LayerMaskDemo : MonoBehaviour {
	RaycastHit rayhit;
	int CubeLayerMask;
	int SphereMask;
	int CylinderMask;

	// Use this for initialization
	void Start () {
		CubeLayerMask = 1 << 8;
		SphereMask = 1 << 9;
		CylinderMask = 1 << 10;
		Debug.Log ("Cube Layer Mask: " + CubeLayerMask);
	}
	
	// Update is called once per frame
	void Update () {
		// Hide the game object on click if it is cube
		if (Input.GetMouseButtonDown (0)) {
			if (Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out rayhit, 100f, CubeLayerMask)) {
				if (rayhit.collider != null) {
					rayhit.collider.gameObject.SetActive(false);
				}
			}
		}
	}
}

现在运行应用程序并单击场景中的游戏对象,如果单击的游戏对象是立方体,它将从场景中隐藏起来

ue3d - Unity蒙版层的使用方法

还可以使用图层名称获取图层NameToLayerLayerToName方法可用于将图层名称转换为其索引,反之亦然。

// will print "8" in console
Debug.Log(LayerMask.NameToLayer("Cube"));
// will print "Cube" in console
Debug.Log(LayerMask.LayerToName(8));

// create variable of type LayerMask or Integer
LayerMask CubeLayerMask = 1 << LayerMask.NameToLayer("Cube");

可以使用逻辑运算符来屏蔽多个层,如下所示编辑LayerMaskDemo脚本。

void Update () {
		// Hide the game object on click if it is cube
		if (Input.GetMouseButtonDown (0)) {
			if (Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out rayhit, 100f, CubeLayerMask | CylinderMask)) {
				if (rayhit.collider != null) {
					rayhit.collider.gameObject.SetActive(false);
				}
			}
		}
	}

现在运行软件,因为已经屏蔽了立方体和圆柱体,所以它们会在点击时隐藏。

ue3d - Unity蒙版层的使用方法

不要击中蒙版层碰撞体

如果想打所有其他层而不是蒙版层,也可以使用图层蒙版,再次更改脚本。

using UnityEngine;

public class Demo2 : MonoBehaviour {
	RaycastHit rayhit;
	int CubeLayerMask;

	// Use this for initialization
	void Start () {
		CubeLayerMask = 1 << 8;
		CubeLayerMask = ~CubeLayerMask;
	}
	
	// Update is called once per frame
	void Update () {
		// Hide the game object on click if it is not cube
		if (Input.GetMouseButtonDown (0)) {
			if (Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out rayhit, 100f, CubeLayerMask)) {
				if (rayhit.collider != null) {
					rayhit.collider.gameObject.SetActive(false);
				}
			}
		}
	}
}

再次运行代码。现在立方体类型的游戏对象不会隐藏,但其他人会隐藏。

ue3d - Unity蒙版层的使用方法

以上是3D天堂关于了解Unity图层蒙版的全部内容,如果你有任何反馈,请随时在本页面下方留言。

相关信息

  • 类型:知识
  • 字数:734
  • 字符:3691
  • 适用软件:Unity
  • 说明:无
  • 编号:155742

热门内容

提示:3D天堂作为服务提供者,尊重网络版权及知识产权,对某些行为的发生不具备充分的监控能力,若无意间侵犯到您的权利,请 联系我们,我们会在收到信息后尽快给予处理。

本站文章版权归本站自创作者所有,未经允许不得转载!