导入/导出Package功能和项目管理的研究
摘要
本文首先阐述了Unity 3.0在支持大型游戏项目开发时存在的两个不足,即缺乏对模块化和SVN协同的支持。随后,深入分析了Unity自带的Export/Import Package功能,并提出了结合此功能与SVN实现多人项目协同的方法。
Unity项目协同的挑战
在使用Unity进行游戏项目开发时,通常需要多人同时协作。例如,不同人员负责不同的场景,或者一部分人专注于调试光照和渲染,另一部分人负责编写程序逻辑。对于稍具规模的项目而言,单人包揽所有工作的情况极为少见。然而,Unity在协同项目工作和大型项目支持方面的表现欠佳。
缺乏模块化开发支持
Unity没有模块化开发的概念,而模块化是开发大型项目必不可少的实践方法。以VC开发大型程序为例,可以将程序拆分为多个DLL项目进行开发,从而降低单个项目的复杂度并减少编译时间。同样,在Flash程序开发中,也可将工作拆分为多个Flash项目,最后将每个项目生成的SWF或SWC文件整合使用。
截至Unity 3.0版本,仍然不支持类似DLL或者SWC/SWF这种模块化构建应用程序的方法。在Unity中,一个游戏就是一个工程。若游戏规模较大、资源众多,项目必然会变得臃肿且难以维护。同时,Unity在打开、刷新和编译这类工程时会消耗更多时间,这在Unity官方论坛上引发了诸多抱怨。
版本管理协同困难
Unity会将项目信息以二进制格式保存在library目录中,其中的元数据(Meta Data)记录了构成游戏的许多关键数据,如模型导入的各项设置、Asset之间的引用关系等。由于这些数据是二进制格式,且存放方式不清晰,在使用SVN等版本管理系统时,无法采用多人修改 - 合并的方式,只能一人修改完成后提交整个项目,再由下一人进行修改,这严重阻碍了项目协同。
Unity官方提供了收费的AssetServer,但未经过实际使用,不确定其能否解决该问题。若能通过一些手段让免费的SVN发挥作用,将是一个不错的选择。
对于Unity缺乏模块化开发支持这一问题,目前暂无有效的解决办法,只能期待Unity后续版本能提供相关支持。(Unity和ExitGame近期宣布展开合作,推出一款针对MMOG开发的产品组合。Unity将推出一个名为Legion的版本,与ExitGame的Photon配合使用,推测Legion对大型游戏项目的支持会更好。)
而对于版本管理协同困难的问题,可以利用Unity的输出/导入包(Export/Import Package)功能,结合SVN在一定程度上加以解决。
用“输出/导入包(Export/Import Package)”功能实现项目协同
Unity的Export/Import Package功能主要用于在不同项目之间实现Asset复用。该功能的基本介绍和操作详见官方文档,本文将进一步阐述其具体表现以及如何利用该功能实现多人项目协作。
导入导出包功能特性
- 目录结构同步:在导出时,Unity会记录导出内容在项目中的完整路径,并在导入时重建对应的目录结构,方便在项目间同步目录。
- 依赖内容处理:导出时,Unity会让用户选择是否导出被依赖的内容。若选择导出,会自动添加被依赖的内容并显示在列表中。
- 文件覆盖判断:导入时,Unity会判断当前项目中是否存在名称、路径完全相同的文件。若存在,则进一步判断修改时间是否一致,若一致则忽略,否则会提示用户是否覆盖。需要注意的是,Unity并不考虑文件的新旧,只是简单询问用户是否用包中的文件覆盖项目中的同名文件。
- 元数据包含:Unity输出包时,会包含Asset对应的元数据。使用WinRAR或其他压缩软件打开Unity导出的.unitypackage文件,即可看到这些元数据文件。
具体协作流程
由于导出的包自动包含相关元数据信息,弥补了SVN无法管理这些数据的缺陷,因此可以将二者配合使用,实现多人在一个项目中协同工作。具体建议如下:
- 首先使用SVN建立对整个项目文件夹的管理,包括Asset和library目录及其下面的文件。
- 由负责集成的项目组成员管理并将项目更新提交到SVN数据库。
- 其他协作人员从SVN数据库下载最新的项目文件。
- 协作人员对自己负责的内容进行工作,然后将成果输出,输出时不要勾选依赖。
- 将输出的unitypackage文件提交给集成人员(可通过SVN或其他途径)。
- 集成人员将新的unitypackage导入项目,然后再提交到SVN数据库。
如果对人员分工、规范以及项目目录进行合理规划,采用这种方式可以实现多人同时工作,提高项目开发和迭代的效率。