• Unity3D Layer要点


    简介

            Layer可以用于光照的分层和物理碰撞的分层,这样可以很好地进行性能优化

    数据结构

            Layer在Unity中有3中呈现方式:1、string名字,2、int层索引,3、LayerMask数据

           一般地,在编辑器中,我们设置GameObject的Layer,是直接使用的层的名字,比如Default、UI等等。

            而在代码中,使用的是GameObject的Layer属性,该属性是int型,取值在0到31之间,代表层索引,并且和名称一一对应。可以在Tags And Layers面板中设置对应关系(操作方法Editor->ProjectSetting->Tags And Layers)。

           另外,我们常常会使用到LayerMask结构定义字段,这样可以在编辑器中选择层。LayerMask的value属性虽然是一个int型,但是和GameObject的Layer属性不同。顾名思义LayerMask.value是一种Mask(通常用二进制表示),他的取值为1<<0到1<<31,即2^0到2^31(<<为二进制左移运算符,即1的二进制左移31位,所以结果为2^31)。另外一个LayerMask可以包含多个层,举个例子0x0001(1)表示1层,0x1001(9)表示第4层和第1层。

            要达到这样表示多个层的效果,需要使用|运算(|为二进制或运算,0|1=1,0|0=0,1|0=1,1|1=1,即有1则1),反过来要想判定一个LayerMask中是否有指定的Mask只要使用&运算(&为二进制且运算,0&1=0,1&0=0,1&1=1,0&0=0,即有0则0)判定运算的结果是否为这个Mask值即可。举个例子比如0x1001&0x1000=0x1000,所以可以判定0x1001的Mask值中包含了0x1000这个Mask值。

           上述了Unity的3种Layer的表示方法。在进行相互转化时可以使用Unity提供的LayerMask操作的相关方法,即LayerMask. NameToLayer(string layername),可以将一个名称转化为一个int型层索引,或者LayerMask. LayerToName(int layerindex)。而将int型转化为LayerMask,则需要做移位操作。或者使用LayerMsk.GetMask(param string[] name)方法将一组名称直接转成一个LayerMask

    常用方法

    • 将一个GameObject的layer转成LayerMask为

    1<<GameObject.Layer

    • 通过名称复合某二个层的操作为

    1<<LayerMask. NameToLayer(“layer1”)| 1<<LayerMask. NameToLayer(“layer2”)

              或者

    LayerMask.GetMask(“layer1”,”layer2”)

    • 判定一个GameObject是否在LayerMask中

    Return (layermask&1<<GameObject.Layer)==1<< GameObject.Layer

             或者

    Return (layermask&1<<GameObject.Layer)!=0

    • 判定一个GameObject是否在某一个名称(比如“layer”)的层上

    Return GameObject.Layer== LayerMask. NameToLayer(“layer”)

    个人博客请访问:http://www.cnblogs.com/CodeGize/
  • 相关阅读:
    Func<T>、Action<T> 的区别于说明
    Invoke()/BeginInvoke()区别
    C# Linq处理list数据
    C# 的三种序列化方法
    P3368 【模板】树状数组 2
    P2058 海港
    2019.6.24 校内测试 NOIP模拟 Day 2 分析+题解
    2019.6.20 校内测试 NOIP模拟 Day 1 分析+题解
    2019.6.18 校内测试 分析+题解
    P1310 表达式的值
  • 原文地址:https://www.cnblogs.com/CodeGize/p/5518881.html
Copyright © 2020-2023  润新知