游戏引擎 Unity 的入门易精通难在哪?
有人说 Unity 入门简单,也有人说难。下文将为大家详细讲解游戏引擎 Unity 入门易、精通难具体体现在哪些方面。
为何说 Unity 入门容易
观点一:学习资源与基础结构优势
通过查看官网的文档和视频教程,初学者在看完几段视频和示例后,就能做出可玩的游戏,这是其他同类商业引擎难以做到的。Unity 采用物体 + 组件的结构以及所见即所得的编辑方式,将初学者的入门门槛降到了最低。
观点二:多方面的便捷特性
- 脚本驱动逻辑简单:在渲染对象上挂载一个脚本组件,就可以驱动该对象的逻辑。基于 MonoBehaviour 的脚本预先留出了初始化(Awake、Start)和更新(Update、FixedUpdate)的接口,初学者无需考虑程序框架问题,直接填充代码即可,这与早期制作 flash 游戏的体验类似。
- 强大的编辑器:Unity 编辑器支持所见即所得的编辑方式,可随时暂停、单帧执行游戏逻辑,还提供场景和游戏多个窗口进行实时调试与效果观察。在脚本组件面板上,能实时查看所有变量的当前值,极大地方便了游戏逻辑的调试工作。
- 完善的 3D 引擎功能:与自研 5 - 6 年的 3D 引擎相比,Unity 3D 引擎功能更为完善。它支持前向和后向的多种渲染管线以及各种后渲染效果,还内置了基于 Beast 的 LightMap 烘焙、基于 Umbra 的遮挡剔除等商业中间件。若单独采购这些中间件,费用高达数十万人民币。因此,即使是 3D 新手,也能较轻松地实现炫酷的 3D 效果。虽然在渲染效果上可能不及 Unreal、Cry 等引擎,但对于主要面向移动平台的开发而言,Unity 目前的 3D 效果已足够使用,且在中国它基本可免费使用。
- 丰富的游戏组件:Unity 拥有基于 PhyX 的物理系统,对于开发类似《疯狂小鸟》《割绳子》这类游戏十分容易。此外,还具备基于 NavMesh 的导航系统、音乐音效系统(音效开发者曾就职于 FMOD)等。
- 良好的开发者社区生态:Unity 建立了 Asset Store,全球的 Unity 开发者在此售卖自己开发的代码、组件、美术资源,并分享经验,大大降低了开发者的学习成本。
- 便捷的多平台发布:Unity 支持一键发布到多种平台,包括 iOS、Android、WP、网页、Windows、Mac 等。若不涉及接入其他平台相关的库(如内购等),开发者几乎无需学习平台相关的编程知识(如 Object - C、Java 等)。
- 实际案例证明:本人在刚开始学习 Unity 时,利用一个半月的业余时间开发了一款推币小游戏,并发布到 App Store,每月能获得几千元的收入。以下是该游戏的链接(非广告,仅作示例):iTunes 的 App Store 中的“小丑马戏团”。
为何说 Unity 精通困难
观点一:技术层面的挑战
- 脚本架构风险:过度依赖基于 MonoBehaviour 的脚本会带来较大的架构风险。在项目开发过程中,容易出现 A 组件引用 B 组件,B 组件又引用 A 组件的情况,导致项目代码在规模增大时变得混乱。虽然其他引擎和语言也存在类似问题,但 Unity 的一些特性必须通过 MonoBehaviour 类实现,因此设计一个健壮的 MVC 架构需要克服诸多困难。
- 组件初始化顺序不明确:基于 MonoBehaviour 的脚本,组件的初始化顺序无法明确,这是开发过程中容易遇到的一个问题。
- 底层代码不开源:Unity 底层代码不开源,Asset Store 上的资源开发者也习惯将代码封装为 dll,导致一些底层修改需求难以实现,给开发者带来困扰。
- C# 的 GC 问题:C# 的垃圾回收(GC)问题虽然不能完全归咎于 Unity,但对于游戏这种对内存敏感的应用程序而言,C# 开发者在内存管理方面的敏感度相对 C/C++ 开发者较弱。开发者需要时刻关注 C# 的内存分配情况,尤其是在每帧更新时的小内存分配,否则容易出现频繁 GC 导致的游戏顿卡现象。开发者可善用 Unity 自带的内存和性能分析工具来解决此类问题。
- 3D 图形学知识门槛高:Unity 作为 3D 引擎,深入开发项目需要掌握较高的 3D 图形学知识。在开发大型项目时,若遇到 Unity 官方未提供解决方案,且 Asset Store 中也找不到相关资源的 3D 需求和问题,新手往往会感到棘手。
- iOS 发布异常:在 iOS 发布时,会遇到与 AOT 编译有关的运行时异常。Unity 采用 mono 对 C# 进行跨平台编译,但在 iOS 平台中,Mono 以 Full AOT 模式运行,无法使用 JIT 引擎,导致游戏在 PC 和 Android 平台运行正常,但在 iOS 平台运行时可能崩溃。具体限制请参照:http://docs.xamarin.com/guides/ios/advanced_topics/limitations/#.NET.c2.a0API.c2.a0Limitations
- 实际项目耗时证明:公司一个跨时代炫酷国际大作的 Unity 项目,已开发约 8 个月,预计还需近 1 年才能完成,这也从侧面反映了精通 Unity 的难度。
观点二:引擎特性带来的问题
实际上,任何可用于开发高端酷炫游戏的商业引擎都难以精通,这是由引擎的功能深度和泛用性决定的。Unity 集成了众多商业中间件,涵盖动画系统、GUI、光照系统、寻路、物理等各个部分,每个部分都需要用户深入学习。从这个角度来看,Unity 和 Unreal 情况类似。
Unity 特有的一些问题如下:
- 脚本执行顺序问题:MonoBehavior 是 Unity 组件系统的核心,脱离该类,其易上手和高效开发的特性将无法发挥。但多个组件脚本的执行顺序控制一直是个难题,不了解这一点的用户容易陷入隐藏 bug 的困境。
- 团队协作责任划分问题:组件式功能结构赋予了开发者更大的控制权,但不利于区分团队不同成员的责任。与 Unreal 将编程分为 C++、UnrealScript 和 Kismet 三层的做法不同,Unity 允许每个开发者查看脚本源码并在需要时进行修改。对于个人开发者而言,这十分方便,但当游戏逻辑受到脚本程序、prefab 参数配置和场景引用关联三方制约时,维护工作会变得混乱,出现问题时也难以快速明确责任。
- 内存分配与垃圾回收效率问题:Unity 为了扩大受众群体,故意隐藏了许多复杂的使用方法,如全自动的垃圾回收机制,让不懂内存分配的用户也能顺利使用。然而,进阶用户会发现大量运行时垃圾回收会导致游戏性能下降,成为入门阶段常见的陷阱。若官方文档能明确告知用户哪些操作会分配内存,情况将得到改善。
- 功能迭代问题:Unity 功能迭代迅速,会产生大量不成熟、不完善的工作流程。虽然对于很多用户来说,能第一时间使用新功能是好事,但对于商业项目的技术负责人而言,需要谨慎对待。一般来说,官方推出的功能至少需要一年时间,其稳定性和适用性才会超过 Asset Store 上的同类第三方插件。
总体而言,由于 Unity 具有优秀的可扩展性,上述问题并非致命。不断有人开发优秀的工具来弥补该引擎的不足,结合其出色的易用性,Unity 的整体技术方向是非常成功的。