Unity关于Layer的管理

这算一个给一些多人合作的中型以上的项目提供的一个避坑建议,即layer管理。

在这里插入图片描述

没错,就是如图这个东西,应该大部分人都知道有这么个东西和大概的用途,但是基本没怎么动过。当然,在大部分项目中也不需要怎么处理这玩意,顶多增加个层级某些物体设置对应层级,这部分的api也很简单。

在这里插入图片描述

不过一般使用到layer的项目,大家更喜欢直接赋值,我们应该不难看到项目中有类似的代码

 	public static void SetLayerContainsChildren(Transform transform, int layer)
    {
    
    
        transform.gameObject.layer = layer;
        transform.GetComponentsInChildren<Transform>().ForEach(t => t.gameObject.layer = layer);
    }

    public static void SetLayer(GameObject gameObject, int layer)
    {
    
    
        gameObject.layer = layer;
    }

现在聊一下这样会出什么问题,比如后期的时候你需要调整一些层级的先后顺序,你去设置里面改了layer顺序之后发现,显示的效果稀碎。因为你设置的layer 对应的int值变化了。所有你代码设置的各种物体的层级都凉凉了。然后你去搜layer,发现还有几千行Player的代码。

所以,为了避免后期的坑,在项目之初还是又管理layer的必要的。

以下是我的两种简单思路。

方案1,增加layer层级的枚举,所有layer都通过枚举转换来进行,layer变更的话更新对应枚举即可。
方案2,赋值按名称来赋值。LayerMask实际上是一个位码操作,在Unity3D中一共有32个Layer层,并且不可增加。所以我们只要遍历一遍,找到名称对应的layer的int来赋值,即可保证我层级始终和我预期一致。

    public static void SetLayerByName(GameObject gameObject, string layername)
    {
    
    
        int layer = 0;
        for (int i = 0; i < 32; i++)
        {
    
    
            if (LayerMask.LayerToName(i) == layername)
            {
    
    
                layer = i;
                break;
            }
        }
        gameObject.layer = layer;
    }

以上。

猜你喜欢

转载自blog.csdn.net/qq_39860954/article/details/125912692