Unity GUI的抉择与评价

Unity GUI的选择与评价

        由于Unity自带的GUI无论从开发效率还是运行效率上都非常不给力,所以衍生出很多的GUI插件,该选择什么插件,就是非常值得考虑的了。

        既然是评价,就会有很多的主观意识,这不一定成为选择的依据。再比如,我已经习惯用NGUI插件了,那么无论你把NGUI说的再难用也无法得到我的认同。所以这篇文章更多的是给新手或者没接触过Unity的人作为参考的。

1、Unity自带的GUI,或者对其进行封装自己开发一套GUI框架

      这两个选择都是非常不明智的。Unity自带的GUI效率很低,每次渲染都是一个DrawCall,并且非常难用,也无法做到所见即所得,所以没有太大的实用价值。而依托于这个系统自己封装一下也不会改变什么,这绝对是浪费时间的举措。  Unity自带的GUI现在唯一的存在价值就是编辑器扩展或者顺手写一个测试代码添加一个Button。   不过话又说回来,如果编辑器扩展也可以所见即所得的编辑GUI,那岂不是更加方便?这绝对是正确的发展思路。


2、Unity4.6之后的新GUI系统

      我今天尝试了一下新的GUI系统,感觉是中规中矩,不是很差,但是也没有太大的亮点。 而且完成度不是很高,希望4.6正是版本发布之后这个可以改善一些。

      据说这个新的GUI系统是由NGUI的作者参与开发的。 感觉核心思路上与NGUI是相似的,由模型渲染打到合并DrawCall和所见即所得的编辑是正确的死路。细节实现上又具备Unity自身的风格。 整体感觉非常干净,用起来也十分的方便。

      不过缺点上面已经说了,控件不全,完成度不高,很多东西都要自己实现,比如富文本、输入框等等。

      另外,它的事件系统我还没有看,不知道这里是否方便,是否支持无限的ScrollView。


3、NGUI

      老牌的GUI插件,售价95美元。作为一个MMO的GUI插件来说已经绰绰有余了。 Unity的强大之处在这里体现的淋漓尽致,明明只是个GUI插件,但是开发效率和实际效果不输于那些昂贵的或者是开源N年的老牌GUI框架。

      NGUI的优点有三个:

      1、完整,开发一个MMO所需要的控件或者功能它都有。

      2、效率,它的DrawCall控制非常好,多个控件渲染只需要一个DrawCall

      3、3D GUI的支持。通过这个你可以实现出倾斜的或者有透视效果的UI。

      缺点说白了就一个,Bug太多,更新频繁导致功能混乱、难用:

      作者患了更新综合症,三天更新一个版本。这原本没有什么大问题,但是这些更新不仅仅是Bug修正,还有很多是接口或者操作方式的修改。NGUI并没有很完善的文档,这导致你只能参考例子去琢磨该如何实现。网上的教程很多都是针对早期版本的,你如果看那些教程反而会被误导。插件的功能中很多都是被废弃的,有的时候你真的不知道一个Button究竟如何创建才是正确的,是通过向导界面、还是拖一个Prefab、还是菜单中的某一个选项。 

      频繁更新其中一个原因是Bug太多。不知道是不是作者背负的历史包袱太重了,Hold不住了。很多时候新增的功能是正确且合理的,但是总会伴随着很多Bug。 比如新的锚点系统,这原本是比较强大的,但是适配多分辨率的时候运行时的分辨率会修改编辑时候的控件坐标,这就致命了。


4、Daikon Forge GUI

      这个是13年9月份推出的新的GUI插件,但是非常的完整和优秀,也是我正在使用的GUI插件。 主要跟NGUI进行对比。

      1、虽然很新,但是非常完整,各种空间一应俱全,甚至直接内嵌了基于Html的富文本显示,这个NGUI还要再买另外一个插件来支持。  各种图片显示(例如九宫格切分)都支持,输入框、ScrollView也都支持,Demo中的例子也很多,比如3D场景中的GUI应用、CoverFlow效果等等。

      2、DrawCall合并处理上比NGUI弱很多,你必须要给UIRoot指定一个Default Atlas,然后它才能给子控件合并DrawCall,否则就是有一个控件多一个DrawCall。正常来说,一个MMO的游戏UI元素非常多,不可能用一个图集就把所有的元素都包含在内,所以这个功能非常的鸡肋,也是急需优化的。

      3、一些细节还需要优化,比如Label控件的中文换行,文本阴影对半透明的支持。

      4、与NGUI相比,DF GUI最大的优点就是整洁、干净,使用起来非常方便,比如它很人性化的添加了右键菜单创建控件、绑定事件的功能。绑定事件就是只需要添加一个public的函数,然后就可以通过下拉列表选择。 或者直接给控件上面绑定的脚本添加一个OnClick函数,然后就可以响应点击事件。这些都是很小的细节,但是却让开发变得高效、方便,而一个框架,能够让使用者用的方便,本身就是最大的价值。

      5、NGUI中两个比较粗陋的部分DF GUI都实现得非常漂亮。

             一个是界面之间的层级遮挡,也就是Depth管理,NGUI早期可以通过z-order和Depth来管理,这使得界面一多管理层级关系无比困难,后面NGUI在3.0版本终于改进了一下,但是与DF GUI相比仍显得不够智能。NGUI中你需要自己分配Depth数值,并且编辑修改同层级的错误情况,而DF GUI中指定Depth后,会自动修正其他的Panel的Depth,就像DF GUI的作者说的那样,你不需要知道它是如何保证正确的,但是它就是正确的。使用DF GUI很多时候你不需要关心其内部实现,因为它自然而然的就是正确的。

            二是锚点处理。 锚点在实现多分辨率适配的时候是非常重要的。NGUI的新锚点系统按理说是比较强大的,它可以指定控件基于哪个对象对齐,但是这个系统真正实现起来想要完善是非常困难的,而且真正实现了实用价值也没有想象中大。反观DF GUI的锚点系统就非常漂亮,它可以指定控件或者Panel基于父窗口的对齐或者拉伸方式,通过这个就可以非常方便的进行多分辨率适配。


5、EZ GUI或者2dTookit自带的GUI

      这些可以代表很多GUI插件,这些插件功能不是很完善,但是麻雀虽小五脏俱全。比如2d tookit中的GUI,各种控件都有,拿来做一些小游戏绰绰有余。但是由于不具备一些复杂的功能比如锚点或者富文本控件等,所以拿来做MMO还是有些困难。

      这些GUI插件,如果用来做小游戏,或者是自己非常喜欢、熟悉,那么同样可以成为选择之一。


总结一下,如果熟悉NGUI的,那么可以使用NGUI,否则Daikon Forge GUI是最好选择。 4.6提供的新GUI系统需要等待时间使其完善。