本文摘要
本文首先描述了Unity3.0在支持大型游戏项目开发时的两个不足:即对模块化和svn协同缺乏支持。随后,分析了Unity自带的Export/Import Package 功能,并提出了使用此功能与svn配合实现多人项目协同的方法。
Unity项目协同的挑战
在使用Unity开发游戏项目时,一般都需要多人同时工作。例如每人负责不同的场景,或者一些人负责调试光照和渲染,另一些负责编写程序逻辑。总之一个人全包的情况对于稍大一点的项目而言少之又少。但遗憾的是Unity对协同项目工作和大型项目的支持可以用糟糕来形容。
首先,Unity没有模块化开发的概念。我们知道模块化是开发大型项目必须的一种实践方法。例如用VC开发大型程序时,我们可以把程序拆分成多个dll项目来开发,由此减少单个项目的复杂度和编译时间。另一个例子是flash程序的开发,同样可以把工作拆分成多个flash项目,最后将每个项目生成的swf或者swc合在一起工作。
然而到目前的3.0版本为止,Unity仍然不支持类似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无法管理这些数据的缺陷,我们就可以将二者配合使用,达到多人在一个项目中协同工作的效果。具体建议如下: 1.首先用SVN建立对整个项目文件夹的管理,包括asset和library目录以及下面的文件;
2.由负责集成的项目组成员管理并提交该项目更新到svn数据库
3.其他协作人员从svn数据库下载最新的项目文件
4.协作人员对自己负责的内容进行工作,然后将成果输出。输出时不要钩选依赖
5.将输出的unitypackage文件提交给集成人员(通过svn或者其他途径都可以)
6.集成人员将新的unitypackage导入项目,然后再提交到svn数据库
如果对人员分工、规范以及项目目录规划得好的话,采用这种方式完全可以实现多人同时工作,提高项目开发和迭代的效率。