前言

在用Unity2018的时候,新的Prefab的特性在带来方便的同时,也会造成有很多困扰。比如有的修改(更改UI元素的层级、删除某个UI元素)一定要打开Prefab之后才能使用。

同时,对于一些UI的Prefab,发现在游戏中是正常的,但是打开Prefab就变得非常奇怪:所有的UI都混乱地排列在一堆,完全不是设定的相对关系。

unity exe 打印崩溃日志 unity2018崩溃_unity exe 打印崩溃日志

就如上图所示,可见游戏中是正常的布局,但是Prefab打开之后的样子就一言难尽了……

 

正文

1、Prefab上挂载了Canvas

上面提到的问题最后排查原因,结果就是这个:我的Prefab上挂载了Canvas。其实这种操作也很常见,在游戏的UI比较复杂的情况下,会通过子Canvas来区别各个面板。也就是说,每一个独立的面板都是会在最外层挂上一个Canvas。

在游戏中,这个Canvas作为父Canvas的子Canvas,其显示分辨率是跟着父Canvas走的。这种情况下,你看到Cnavas组件长这样:

unity exe 打印崩溃日志 unity2018崩溃_UGUI_02

但是,当你打开Prefab之后,这个Canvas默认就会变成这样:

unity exe 打印崩溃日志 unity2018崩溃_Unity_03

这就是问题的所在,你的Canvas的尺寸已经不是你预设的尺寸了,所以你看到的各个UI组件的位置也就不一样了。这种情况下,设置Canvas的RenderMode为ScreenSpace-Overlay:

unity exe 打印崩溃日志 unity2018崩溃_Unity2018_04

这种情况下你的Canvas的尺寸就是按照Game视图里的尺寸设置的。一般情况下,你可以将Game里的分辨率设置成你的最适配分辨率,如1920*1080 ,这样就能看到在游戏中展示的效果了。

 

2、预制属于网格布局的一部分

有时候我们的预制是网格布局的一个子物体,当他在游戏中时,因为网格布局的原因,尺寸发生了改变。但是在Prefab视图中,因为没有了网格布局,其展现的样子就是最原始的样子。

unity exe 打印崩溃日志 unity2018崩溃_Unity2018_05

就如图所示,下方的Game视图是因为有网格布局,其每个Item 的尺寸都被重新设置过,但是在Prefab视角中则是原始尺寸。因此要编辑就只有在Scene里面编辑才能看到效果,而在Prefab视图中编辑则看不到真实尺寸。

这种情况下,要么把子Prefab解绑,要么就重新设置子Prefab的大小,要么就重新设置一下子Prefab的锚点使其能够任意比例缩放而满足显示需求。

 

结论

其实一开始使用新的Prefab系统还是有很多不适应,觉得不如老的好用。但其实我个人感觉,新的Prefab系统对程序员来讲更友好。Prefab的嵌套、继承都是编程中的常规操作,程序员理解起来还是比较轻松的。