欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

试读《Unity3D游戏开发》有感 博客分类: 其他  

程序员文章站 2024-03-21 15:45:10
...

试读了一下《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是一款非常优秀的商业游戏引擎,它的出现给我们带来的新的视界,推动了游戏软件的开发向着越来越高效率的方向前进。