Unity中LayerMask的学习手记

Unity中是用int32来表示32个Layer层。int32表示二进制一共有32位(0—31)。LayerMask实际上是用Int32的32个位来表示每个层级,当这个位为1时表示使用这个层,为0时表示不用这个层。

代码释义:

LayerMask mask = 1 << 你需要开启的Layers层。

LayerMask mask = 0 << 你需要关闭的Layers层。   等价于  LayerMask mask = ~( 1 << 你需要关闭的Layers层。)

 	public static int OnlyIncluding(params int[] layers)
        {
            return MakeMask(layers);
        }

        public static int EverythingBut(params int[] layers)
        {
            return ~MakeMask(layers);
        }

        static int MakeMask(params int[] layers)
        {
            int mask = 0;
            for (int i = 0; i < layers.Length; i++)
            {
                mask |= 1 << layers[i];
            }
            return mask;
        }

layer常用于相机渲染的控制和射线碰撞检测。

相关API:

1、Ray Camera.main.ScreenPointToRay(Vector3 pos)  ---  返回一条射线Ray从摄像机到屏幕指定一个点

2、RaycastHit  --- 光线投射碰撞信息

3、Ray --- 射线类

4、bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)  --- 当光线投射与任何碰撞器交叉时为真,否则为假。

bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)  --- 在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息()。

bool Physics.Raycast(Ray ray, float distance, int layerMask) --- 当光线投射与任何碰撞器交叉时为真,否则为假。

bool Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit out hit,float distance, int layerMask)   ---  当光线投射与任何碰撞器交叉时为真,否则为假。

PS: 如果从一个球型体的内部到外部用光线投射,返回为假。

参数释义:

origin : 在世界坐标中射线的起始点

direction: 射线的方向

distance: 射线的长度

hit: 碰撞信息类。可以得到碰撞物体的transform,rigidbody,point等信息。

layerMask: 只选定Layermask层内的碰撞器,其它层内碰撞器忽略。

<span style="white-space:pre">			</span>if (Input.GetMouseButtonDown (0)) 
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>GameCamera tempGameCamera = GameCameraManager.GetSingle().getCurrentState() as GameCamera;
<span style="white-space:pre">				</span>if(tempGameCamera == null)
<span style="white-space:pre">				</span>{
<span style="white-space:pre">					</span>return ;
<span style="white-space:pre">				</span>}
<span style="white-space:pre">				</span>Camera tempCurrentCamera = tempGameCamera.pCamera;
<span style="white-space:pre">				</span>Ray ray = tempCurrentCamera.ScreenPointToRay(Input.mousePosition);
<span style="white-space:pre">				</span>
<span style="white-space:pre">				</span>RaycastHit  hit;
<span style="white-space:pre">				</span>Physics.Raycast(ray.origin,ray.direction,out hit);
<span style="white-space:pre">				</span>Debug.DrawRay(ray.origin, ray.GetPoint(100000.0f), Color.red);
<span style="white-space:pre">			</span>}

5、Ray Camera.main.ViewportPointToRay(Vector3 pos) --- 返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点

6、RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask) --- 投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。

时间: 2024-11-08 18:20:15

Unity中LayerMask的学习手记的相关文章

针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码。

Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添加新的视图,最后由开发者自行打包生成IPA包,发布程序.而Unity for Android打包直接生成APK包,等于说源代码开发者是看不到的,但是Unity的自身确实有些局限,针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码.本章我们的目标是使用Unity的脚本打开Activity.首先我们创建一个普通的Android

菜鸟学习 - Unity中的热更新 - Lua和C#通信

孙广东 2015-4-6 热更新我是个菜鸟,感谢网上的各位的奉献,这次又当一回搬运工. 准备: 1.了解Lua的语法 推荐书籍<Lua程序设计 第二版> 2.使用ULua插件进行通信 尽量早上真机.因为Bug问题特别多. 大杂烩: 更新LUa其实也是更新资源. Lua被看作一个资源么.Lua代码都是运行时才编译的,不运行的时候就如同一张图片.一段音频一样,都是文件资源:所以更新逻辑只需要更新脚本,不需要再编译,因而Lua能轻松实现"热更新".运行效率由于使用反射,所以成为它

Unity中实现网格轮廓效果

问题背景: 最近要实现选中实体的高亮效果,要那种类似于unity中Outline的效果,网格轮廓高亮效果. 效果图: 具体代码: OutlineEffect.cs 实体高亮效果类: 轮廓边总控制类,该脚本需要挂载到场景相机上 1 using UnityEngine; 2 using System.Collections.Generic; 3 using UnityEngine.Rendering; 4 5 namespace Tx3d.Framework 6 { 7 [DisallowMulti

在Unity中使用事件/委托机制(event/delegate)进行GameObject之

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 一对多的观察者模式机制有什么缺点? 如果你对如何在Unity中使用事件/委托机制还不太了解,建议您查看我的前一篇文章:[Unity3D技巧]在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 在前一篇博客里面,我们写到

Unity插件之NGUI学习(4)—— 创建UI2DSprite动画

创建一个新的Scene,并按 Unity插件之NGUI学习(2)创建UI Root,并在UI Root的Camera下创建一个Panel. 然后在选中Panel,在菜单中选择NGUI->Create->Unity 2D Sprite 查看Inspector窗口 接着是在Unity中制作Sprite: 在Project窗口创建Textures文件夹,并从外部拖入一些图片素材,然后选中需要转成Sprite的图片,然后在Inspector窗口进行转变Sprite的操作,如图. 选择Sprite(2D

unity中使用FingerGestures插件3.0

FingerGestures是一个unity3D插件,用来处理用户动作,手势. 译自FingerGestures官方文档 目录 FingerGestures包结构 FingerGestures例子列表 设置场景 教程:识别一个轻敲手势 教程:手势识别器 教程:轻击手势识别器 教程:拖拽手势识别器 教程:滑动手势识别器 教程:长按手势识别器 教程:缩放手势识别器 教程:旋转手势识别器 教程:自定义手势识别器 教程:识别手势事件 建议:使用.net代理事件 fingerGestures包结构 路径,

【原创翻译】初识Unity中的Compute Shader

一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位,反而与作者的愿意相悖.所以我想很多时候,国内的译者也是无奈吧,下次再看到译作也会抱着一些感同身受的态度去读.这是我第一次翻译整篇文章,能力有限,望见谅,翻译不好的地方也希望大家指出来. 其实ComputeShader在Unity中出现已经有蛮长的一段时间了,因为自己一直对Shader比较感兴趣,所

在Unity中使用贝塞尔曲线(转)

鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天因为工作的原因需要将贝塞尔曲线加在工程中,那么MOMO迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的任意角度的曲线,这两个点一个是起点,一个是终点.在这条曲线之上还会有两个可以任意移动的点来控制贝塞尔曲线的角度.如下图所示,点1 和点4 就是起点和终点,点2 和点3 就是控制曲线角度的两个动态点. 如下图所示.使用拖动条来让曲线发生旋转,大家会看的更加清晰.目前我们看到的被塞尔曲线是在平面中完成的,其实贝塞尔曲线是完全 支持3

【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&amp;混合操作合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.  文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/164.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文算是固定功能Shader的最后一篇,下一次更新应该就会开始讲解表面Shader,而