试读《Unity3D游戏开发》有感
试读了一下《Unity3D游戏开发》这本树,感觉书写的很详尽,甚至还介绍了如何注册(我以前自己注册时在这上面可没少花功夫),非常适合初学者快速的掌握Unity3D。
Unity3D提供了一套强大的游戏引擎,其最大的优势是跨多平台,特别是现在很火的移动平台iOS和Android,这是很多优秀的游戏引擎所不具备的。除此之外,它还提供了一个很强大的可视化开发编辑环境,很多游戏功能的实现都不需要再写代码了,开发起游戏来非常方便。
书中第三章介绍了GUI类和GUILayout的区别,其中提到:用GUI进行控件不能自适应调整,而GUILayout更加灵活。但是从我已有的一些Unity3D编程经验,我稍有不同的看法,如果仅从一个相对简单用户界面小例子来看,的确如此,但是如果进行一个复杂的界面,情况可能未必如此。当界面存在类似装备清单之类的较复杂的布局时,需要使用GUILayout的BeginArea()和EndArea()函数来进行布局的嵌套,比如:
BeginArea(new Rect(x, y, w, h)...); ... BeginVertical(new Rect(x, y, w, h)); BeginArea(new Rect(x, y, w, h)...); ... EndArea(); ... EndVertical(); EndArea();
由于GUILayout是自动调整的,一个复杂交叉的布局常会出现无法预料的偏差,但是你又难于找到问题的所在。而且,BeginArea()本身也是需要传入Rect参数进行绝对定位的,这仍然需要你去针对不同分辨率去计算所处的位置,因此并未完全摆脱GUI类的模式。
而GUI看似不灵活,但是其绝对定位方式非常类似于HTML网页中的定位方式,直观而又可靠。其实只要掌握要点,用GUI.BeginGroup()按照固定坐标把整个界面分成几大块,然后在各块中分别进行局部的布局,使用起来也挺便捷的。至于控件的宽度和高度,完全可以按照纹理贴图Texture的宽度和高度属性来设置,你就可以随意修改图片的大小,也不会出现大小不一致的问题了。而且,GUILayout对于界面上存在大量Margin的布局是比较吃力的,你还要去考虑如何实现这些Margin,而GUI就只需要设定一个或几个偏移值就行了。因此,从实用角度来将,可能是GUI和GUILayout两种模式混合使用会比较实际。当然,仁者见仁,智者见智,等你用到了也许会有不同看法。
第四章介绍了Unity所支持的三种脚本语言,虽然我没学过Boo,但是Python语言的表达能力是很强的,既然Boo与之相似,那么相信应该是不错的选择,只是这门语言应该会的人很少吧,不易被接受。JavaScript也是非常不错的脚本语言,虽然由于历史原因有些地方设计的不好,但是它有着庞大的用户群,而且其语言的表达也是比较强的,因此选它应该是没错的。至于C#,应该在性能上会有些优势,但是其语法和实现太过于精细(还记得Int16, Int32和Int64吗?),使用起来较繁琐(我已厌倦了不停的转型,你呢?),其实并不太适合作为游戏脚本。游戏性能主要还是由引擎本身以及所实现的游戏逻辑决定的,而不是游戏脚本自身的性能,所以,我觉得选择JavaScript没错的!
Unity脚本的生命周期,是由实现一些既定的函数来使其完整的,这些函数分别代表了生命周期的不同阶段和作用。这些函数看上去像是“回调”函数,但是其实你并没有在起初“调用”过什么。它更多的是符合设计模式中的“策略模式”,每一段脚本都是一个有着各自不同的“策略”的执行体。Start()和OnDestroy()在脚本创建和销毁时执行一次。而OnGUI(), Update(), FixedUpdate()函数是游戏主循环,它们以各自的方式不停的循环执行,分别负责处理游戏每一帧的不同内容的刷新。
总之,Unity3D是一款非常优秀的商业游戏引擎,它的出现给我们带来的新的视界,推动了游戏软件的开发向着越来越高效率的方向前进。