当前位置: 首页 > news >正文

Unity LayerMask 的位运算


文章目录[点击展开](?)[+]

  1. Unity的Layer
  2. 看几个例子
    1. 开启layer 2
    2. 开启layer 0和layer 2
    3. 开启Layer0 并关闭 Layer2
    4. 开启Layer Default
    5. 脚本例子
  3. 实际应用
    1. Unity的碰撞检测
    2. 物理碰撞互斥
  4. 资料文献

Unity的Layer

Unity是用 int32来表示32个Layer层,int32用二进制来表示一共有32位。

0000 0000 0000 0000 0000 0000 0000 0000

31                                                                 0

看几个例子

开启layer 2

LayerMask mask = 1<<2;

其中 <<左边的 1表示有[开启],0表示没有该layer[忽略] 。右边的2表示左移2位即是 layer2层的位置。

 

开启layer 0和layer 2

LayerMask mask = 1 << 0 |  1 << 2;

 

开启Layer0 并关闭 Layer2

LayerMask mask = 1 << 0 | 0 << 2

 

开启Layer Default

LaserMask mask=1 << LayserMask.NameToLayer(“Default”);

脚本例子

下面是一个脚本例子,把它绑定在Camera上

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(Camera))]
public class LayerMaskTest : MonoBehaviour {

    //打开Npc层,变1 或 运算符
    private void Show()
    {
        //camera.cullingMask |= 1 << LayerMask.NameToLayer("Npc");
        camera.cullingMask = (int) 1<<LayerMask.NameToLayer("Npc");//写法二
    }

    // 关闭Npc层,变0 按位与 &  按位取反 ~
    private void Hide()
    {
        camera.cullingMask &= ~(1 << LayerMask.NameToLayer("Npc"));
    }

    // 开关Npc层,按位异或    ^
    private void Toggle()
    {
        camera.cullingMask ^= 1 << LayerMask.NameToLayer("Npc");
    }

    void OnGUI()
    {
        if (GUILayout.Button("Show")) Show();
        if (GUILayout.Button("Hide")) Hide();
        if (GUILayout.Button("Toggle")) Toggle();
    }
}

实际应用

Unity的碰撞检测

static bool Raycast(Vector3 origin, Vector3 direction, float distance = Mathf.Infinity, int layerMask = DefaultRaycastLayers);

物理碰撞互斥

我们项目中自己写的物理碰撞互斥

//开启Npc层的碰撞
LayerMask mask = 1 << (int)GameLayerDef.Npc;
float bounds = 2;
RaycastHit2D raycastHit = Physics2D.CircleCast(transform.position, bounds, Vector2.right, Mathf.Infinity, mask.value);

资料文献

部分内容参考自: 【风宇冲】二进制:四 Unity


本文转自赵青青博客园博客,原文链接:http://www.cnblogs.com/zhaoqingqing/p/3820414.html,如需转载请自行联系原作者

相关文章:

  • 搭建千万PV高可用系统—DNS
  • eclipse再见,android studio 新手入门教程(一)基本设置
  • CentOS 7.2 安装jdk1.8.x版本
  • UVA 725 division【暴力枚举】
  • angularjs $$phase
  • 安装PHP5,安装PHP7
  • CSS 为什么这么难学?
  • sql server 索引总结一
  • 『TensorFlow』读书笔记_Word2Vec
  • Android UI进阶之旅15 SVG的使用
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • Android的一些命名规范
  • 零元学Expression Blend 4 - Chapter 13 用实例了解布局容器系列-「Pathlistbox」I
  • Spring源码系列-容器刷新
  • WPF用样式实现TextBox的虚拟提示效果
  • [LeetCode] Wiggle Sort
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Cookie 在前端中的实践
  • eclipse的离线汉化
  • Java,console输出实时的转向GUI textbox
  • JavaScript HTML DOM
  • JavaScript-Array类型
  • learning koa2.x
  • Leetcode 27 Remove Element
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • python 装饰器(一)
  • ucore操作系统实验笔记 - 重新理解中断
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue.js 移动端适配之 vw 解决方案
  • 浮现式设计
  • 普通函数和构造函数的区别
  • 前嗅ForeSpider中数据浏览界面介绍
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 微信小程序:实现悬浮返回和分享按钮
  • 微信小程序--------语音识别(前端自己也能玩)
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​ubuntu下安装kvm虚拟机
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #define
  • #NOIP 2014# day.2 T2 寻找道路
  • $ git push -u origin master 推送到远程库出错
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (03)光刻——半导体电路的绘制
  • (12)Hive调优——count distinct去重优化
  • (5)STL算法之复制
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (二)Eureka服务搭建,服务注册,服务发现