prefab:预置是一种资源类型——存储在项目视图中的一种可重复使用的游戏对象。预置可以多次放入到多个场景中。当你添加一个预置到场景中,就创建了它的一个实例。所有的预置实例链接到原始预置,基本上是它的克隆。不管你的项目存在多少实例,当你对预置进行任何更改,你将看到这些更改将应用于所有实例。

    当预置源发生变化,这些变化将应用于所有已链接的游戏对象。例如,如果添加一个新的脚本到预置,所有已链接的游戏对象都将立刻包含该脚本。但是,它有可能改变一个单独实例的属性,同时保持链接。改变任何一个预置实例的属性,可以看到变量名称变为粗体,现在该变量可以被重写,所有的重写属性不会影响预置源的变化。这使你可以修改预置实例使它们变得独一无二,而不破坏它们与预置源之间的链接。

    我的理解是,prefab保存了Object及其子Object的属性,但是不包含纹理、材质、脚本,而只是记录了使用的这些资源的guid。所以如果想要和别的开发人员共享prefab,则必须将工程中用到的这些资源上传到svn上,或者将资源、.meta一起copy过去。

    

    assetbundle:是 Unity 编辑器在编辑环境中(edit-time)创建的一些列的文件,这些文件可以被用在项目的运行环境中(run-time)。 AssetBundles 可以包括的资源文件有模型文件(models)、材质(materials)、纹理(textures)和场景(scenes)。AssetBundles 不能包含脚本文件。具体来说,一个 AssetBundle 就是把一系列的资源文件或者场景文件以某种方式紧密保存的一个文件。这个 AssetBundle 文件可以被单独加载到可执行的应用程序中。AssetBundles 可以由被 Unity 构建的游戏或者应用按需加载使用。这允许对像模型、纹理、音频、甚至是整个的游戏场景这样的资源进行流式加载和异步加载。AssetBundles 可以预缓存(pre-cached)和存储在本地,这样在运行时就可以立即加载它们。但是 AssetBundles 技术的主要的目的是在需要的时候能够从远端的服务器上按需请求特定的资源,并加载到游戏中。AssetBundles 可以包含 Unity 可以识别的任何类型的资源,包括自定义的二进制数据。唯一的例外是,脚本资源是不被允许的。

    一个项目中肯定不止一个AssetBundle包,而每个AB包可能不止一个asset。而如何取组织资源文件,也就是把哪些资源打包到一起,哪些分开是值得商议的。每一个 AssetBundle 都有一些技术开销。AssetBundles 是一些封装资源的文件。这种封装会增大了 AssetBundle 的整体大小,尽管这种大小的增加不会太明显,而且是可测量的。当组织 AssetBundles 时,是更多的小的 AssetBundles 还是更少的大的 AssetBundles 呢?这是需要我们根据自己的项目的实际情况来好好权衡的。更多的小的 AssetBundles 会面临更多的跟踪和创建相关的开销,太少的 AssetBundles 会使单个AssetBundle 本身的大小变大,也会导致它们可能包含一些冗余的数据。


    

    Unity的Export/Import Package功能主要用途是在不同的项目之间实现asset复用。该功能的基本介绍和操作详见官方文档,本文将进一步描述该功能的具体表现,以及如何利用该功能实现多人项目的协作。

    导入导出包功能具有下列特性:

    在导出时,Unity会记录导出内容在项目中的完整路径,并在导入时重建对应的目录结构。因此我们可以方便地在项目间同步目录。

导出时,Unity会让你选择是否导出被依赖的内容。如果钩选择会自动添加被依赖的内容,并显示在列表中。如下图。

p_w_picpathp_w_picpath

不导出依赖

导出依赖

    导入时,Unity会判断当前项目中是否存在名称、路径完全相同的文件。若有,则判断修改时间是否一致,若一致就忽略,否则会提示是否覆盖。注意Unity并不管文件的新旧,只是简单地询问用户是否用包中的文件覆盖项目中的同名文件。如下图:

p_w_picpath

    最重要的是,Unity输出包时,还包含了asset对应的元数据。用WinRAR或者其他压缩软件打开Unity导出的.unitypackage文件,就可以看到这些元数据文件,如下图:

p_w_picpath

      正是由于导出的包自动包含了相关元数据信息,弥补了用SVN无法管理这些数据的缺陷,我们就可以将二者配合使用,达到多人在一个项目中协同工作的效果。具体建议如下:

  1. 首先用SVN建立对整个项目文件夹的管理,包括asset和library目录以及下面的文件;

  2. 由负责集成的项目组成员管理并提交该项目更新到svn数据库

  3. 其他协作人员从svn数据库下载最新的项目文件

  4. 协作人员对自己负责的内容进行工作,然后将成果输出。输出时不要钩选依赖

  5. 将输出的unitypackage文件提交给集成人员(通过svn或者其他途径都可以)

  6. 集成人员将新的unitypackage导入项目,然后再提交到svn数据库

    

    如果对人员分工、规范以及项目目录规划得好的话,采用这种方式完全可以实现多人同时工作,提高项目开发和迭代的效率。


    所以,归纳如下:

    prefab是为了开发中模块重用而出现的,仅保存属性等设置信息。

    assetbundle是用于打包游戏资源,在运行时获取这些资源,不能打包C#脚本。

    unitypackage是为了开发时多人协同工作而出现的,实现插件开发,模块重用。


    参考:http://blog.sina.com.cn/s/blog_5373cec90100p4ow.html