前言
在用Unity2018的时候,新的Prefab的特性在带来方便的同时,也会造成有很多困扰。比如有的修改(更改UI元素的层级、删除某个UI元素)一定要打开Prefab之后才能使用。
同时,对于一些UI的Prefab,发现在游戏中是正常的,但是打开Prefab就变得非常奇怪:所有的UI都混乱地排列在一堆,完全不是设定的相对关系。
就如上图所示,可见游戏中是正常的布局,但是Prefab打开之后的样子就一言难尽了……
正文
1、Prefab上挂载了Canvas
上面提到的问题最后排查原因,结果就是这个:我的Prefab上挂载了Canvas。其实这种操作也很常见,在游戏的UI比较复杂的情况下,会通过子Canvas来区别各个面板。也就是说,每一个独立的面板都是会在最外层挂上一个Canvas。
在游戏中,这个Canvas作为父Canvas的子Canvas,其显示分辨率是跟着父Canvas走的。这种情况下,你看到Cnavas组件长这样:
但是,当你打开Prefab之后,这个Canvas默认就会变成这样:
这就是问题的所在,你的Canvas的尺寸已经不是你预设的尺寸了,所以你看到的各个UI组件的位置也就不一样了。这种情况下,设置Canvas的RenderMode为ScreenSpace-Overlay:
这种情况下你的Canvas的尺寸就是按照Game视图里的尺寸设置的。一般情况下,你可以将Game里的分辨率设置成你的最适配分辨率,如1920*1080 ,这样就能看到在游戏中展示的效果了。
2、预制属于网格布局的一部分
有时候我们的预制是网格布局的一个子物体,当他在游戏中时,因为网格布局的原因,尺寸发生了改变。但是在Prefab视图中,因为没有了网格布局,其展现的样子就是最原始的样子。
就如图所示,下方的Game视图是因为有网格布局,其每个Item 的尺寸都被重新设置过,但是在Prefab视角中则是原始尺寸。因此要编辑就只有在Scene里面编辑才能看到效果,而在Prefab视图中编辑则看不到真实尺寸。
这种情况下,要么把子Prefab解绑,要么就重新设置子Prefab的大小,要么就重新设置一下子Prefab的锚点使其能够任意比例缩放而满足显示需求。
结论
其实一开始使用新的Prefab系统还是有很多不适应,觉得不如老的好用。但其实我个人感觉,新的Prefab系统对程序员来讲更友好。Prefab的嵌套、继承都是编程中的常规操作,程序员理解起来还是比较轻松的。