这算一个给一些多人合作的中型以上的项目提供的一个避坑建议,即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来赋值,即可保证我层级始终和我预期一致。文章来源:https://www.toymoban.com/news/detail-527995.html
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;
}
以上。文章来源地址https://www.toymoban.com/news/detail-527995.html
到了这里,关于Unity关于Layer的管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!