Unity - LayerMask简析
本文简述了LayerMask的定义,后通过项目实战充分解析 LayerMask中的GetMask、LayerToName、NameToLayer 等函数的使用方法及其注意事项。
项目地址:3D坦克大战 - SouthBegonia
LayerMask 定义
用来表示32个Layer层级的位掩码,类型为Int32,。前面8个是引擎使用的,后面24个供开发人员使用的。通过LayerMask我们可以实现诸多类似 层判定、层限制、层检测 的方法。的我们可以在Edit->Project Setting->Tags and Layers->Layers 中看到这32层(见下图)

LayerMask 方法
GetMask
函数原型:public static int GetMask(params string[] layerNames)
功能:传入一个图层名称列表,返回这个图层列表的等效图层蒙版。此处大家再回看上面的函数原型可能会产生疑问:何为等效图层蒙版,为何它的类型为int?它的用处是什么?
解析:我们先Debug看看上图中第1层和第5层看看:
//Way1:GetMask方法
Debug.Log(LayerMask.GetMask("Default");	       -->1
Debug.Log(LayerMask.GetMask("Default", "UI"));	-->33
一个非常奇怪的数据,但是我们转换成二进制呢?
1 --> 0001
33 --> 0010 0001
不难发现,这是Int32的位掩码,即LayerMask,第1、5位数为1表示开启了这两个层。因此可以说:等效图层蒙版 == 启用/关闭某几层的LayerMask位掩码, 1表示开启,0表示关闭。此外我们还可以使用位运算实现等效图层蒙版:
//Way2:位操作方法
LayerMask layer1 = (1 << 0);
LayerMask layer2 = (1 << 0) | (1 << 5);
Debug.Log(layer1.value);	  -->1
Debug.Log(layer2.value);	  -->33
//等效于:
LayerMask layer3 = LayerMask.GetMask("Default","UI");
Debug.Log(layer3.value);	  -->33
//其他位操作方法:
LayerMask layer4 = (0 << 5);  	 //关闭索引为5的层
LayerMask layer5 =  ~(1 << 5);     //打开除了索引为5的层之外的层
那么怎么落实到项目中呢?在此提供一个项目示例(地址在文章首):我们在开发坦克大战游戏,有红蓝绿三方阵营,我们想让各自阵营的炮弹不伤害到友军,这时我们就需要用到LayerMask:
//设置LayerMask的类:
public class LayerManager : MonoBehaviour
{
    public static int blueLayer = 10;
    public static int greenLayer = 11;
    public static int redLayer = 12;
	//传入玩家所在Team的结构体变量,返回敌人所在的图层蒙版
    static public LayerMask GetEnemyLayer(Team team)
    {
        LayerMask mask = 0;
        switch (team)
        {
            case Team.Blue:
                mask = (1 << redLayer) | (1 << greenLayer);     //开启redLayer层和greenLayer层
                break;
            case Team.Green:
                mask = (1 << redLayer) | (1 << blueLayer);
                break;
            case Team.Red:
                mask = (1 << blueLayer) | (1 << greenLayer);
                break;
        }
        return mask;
    }
}
//炮弹脚本的碰撞检测片段:
public void OnCollisionEnter(Collision collision)
{
	//射线检测球形范围内enemyLayers层敌人的collider
	Collider[] cols = Physics.OverlapSphere(transform.position, explotionRadius, enemyLayers);
	//炮弹仅对敌人阵营(敌人所在图层)造成伤害
}
//机理概述:
//1. 通过传入坦克自身所在阵营信息如蓝方阵营到GetEnemyLayer(),得到敌人红绿阵营的 layermask 并设置为 enemyLayers
//2. 我们在发射出的炮弹的脚本中就通过该 enemyLayers 限制了仅能检测到敌方layer层的碰撞体
//3. 实现炮弹对敌伤害而友军安全
LayerToName / NameToLayer
函数原型:public static string LayerToName(int layer)、public static int NameToLayer(string layerName)
功能:将索引值k转换为第k层的名称、将第k层的名称转换为k索引值
示例:
Debug.Log(LayerMask.NameToLayer("Blue"));	-->10
Debug.Log(LayerMask.LayerToName(10));	    -->Blue
//检测物体是否在某Layer
if (gameObject.layer == LayerMask.NameToLayer("Default"))
	Debug.Log("Yes!");
总述
LayerMask是Unity中 操控Layer层的类,我们在使用时需要注意数据类型转换,其用法常体现在物理检测、射线检测等
关于射线检测可移步博主拙作:Unity射线检测 - SouthBegonia
参考
Unity - LayerMask简析的更多相关文章
- Unity5中新的Shader体系简析
		
一.Unity5中新的Shader体系简析 Unity5和之前的书写模式有了一定的改变.Unity5时代的Shader Reference官方文档也进一步地变得丰满. 主要需要了解到的是,在原来的Un ...
 - Entitas实现简析
		
Entitas实现简析 这里主要讲Entitas的执行原理,不讲Entitas的代码生成方面. ECS简介 ECS(实体-组件-系统)是一种常用于游戏开发的架构模式. 实体: 实体只是一个 ...
 - 简析.NET Core 以及与 .NET Framework的关系
		
简析.NET Core 以及与 .NET Framework的关系 一 .NET 的 Framework 们 二 .NET Core的到来 1. Runtime 2. Unified BCL 3. W ...
 - 简析 .NET Core 构成体系
		
简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...
 - RecycleView + CardView 控件简析
		
今天使用了V7包加入的RecycleView 和 CardView,写篇简析. 先上效果图: 原理图: 这是RecycleView的工作原理: 1.LayoutManager用来处理RecycleVi ...
 - Java Android 注解(Annotation) 及几个常用开源项目注解原理简析
		
不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义. ...
 - PHP的错误报错级别设置原理简析
		
原理简析 摘录php.ini文件的默认配置(php5.4): ; Common Values: ; E_ALL (Show all errors, warnings and notices inclu ...
 - Android 启动过程简析
		
首先我们先来看android构架图: android系统是构建在linux系统上面的. 所以android设备启动经历3个过程. Boot Loader,Linux Kernel & Andr ...
 - Android RecycleView + CardView 控件简析
		
今天使用了V7包加入的RecycleView 和 CardView,写篇简析. 先上效果图: 原理图: 这是RecycleView的工作原理: 1.LayoutManager用来处理RecycleVi ...
 
随机推荐
- UDF——计算壁面边界合力矩(旋转机械)
 - Centos7 .net core 2.0安装使用
			
一.添加dotnet产品Feed sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc sudo sh -c 'ech ...
 - C++的static_cast、dynamic_cast和const_cast用法
			
static_cast.dynamic_cast和const_cast static_cast:  用法: static_cast < type-id > (expression)  ...
 - 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'TableName'中的标识列指定显式值
			
当某表的一个列为自动增长列,是无法直接通过insert语句向给字段写入指定值,解决方法: SET IDENTITY_INSERT TABLE_NAME ON; INSERT INTO TABLE_NA ...
 - Win7下msys64安装mingw工具链
			
1. 安装msys64 安装到指定目录, 例如C:\msys64 2. 命令行更新 运行msys2.exe打开命令行窗口, 执行命令 pacman -Syuu 3. 修改安装源 进入msys64/et ...
 - CatBoost使用GPU实现决策树的快速梯度提升CatBoost Enables Fast Gradient Boosting on Decision Trees Using GPUs
			
python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&ut ...
 - python开源项目聚合推荐【1】
			
******************************************************* 01项目名:unimatrix 功能介绍:Python模拟“黑客帝国”影片中的终端动画脚 ...
 - fiddler抓包详解
			
image.png 前言 fiddler是一个很好的抓包工具,默认是抓http请求的,对于pc上的https请求,会提示网页不安全,这时候需要在浏览器上安装证书. 一.网页不安全 1.用fiddler ...
 - SQL 对比,移动累计
			
数据对比 两种常用模型 1.对比下一行,判断增长.减少.维持现状 -- 建表 drop table sales create table sales( num int, soc int ); inse ...
 - 深入浅出依赖注入容器——Autofac
			
1.写在前面 相信大家对IOC和DI都耳熟能详,它们在项目里面带来的便利大家也都知道,微软新出的.NetCore也大量采用了这种手法. 如今.NetCore也是大势所趋了,基本上以.Net为技术主导的 ...