铁锹   发表于 2012-12-12 17:39
  • 我们在使用Unity3D制作大型场景的时候,往往需要加载大容量的数据文件,特别是对于三维数据而言,模型、材质、贴图、特效等资源都是组成项目不可或缺的一部分。数据体量越大,数据加载就越明显。对于良好的人机交互体验而言,让用户处于长时间的等待,是一种非常差的体验感,很多用户很可能就是因为没有耐心等待,就直接关闭你的应用,离开。

    所以,做任何的项目之前,必须要先解决场景数据管理的问题。针对Unity3D而言,该引擎提供了一种称为AssetBundles的外部整合数据,可以让我们把编辑器中的物件分门别类的输出,这种方法是目前为止最好的管理unity3D的方法,如果还有好的,请大家多多推荐。

    这种称为AssetBundles的东西,其实是一种文件格式unity3d,它能在需要的时候重新被加载到场景中,而这种文件格式可以是模型、贴图、声音,甚至是场景文件。虽然看上去,输出这种类型的文件对于整个场景资源是一种浪费,但其简便的使用方法,不失为一种有效地入门手段。

    项目组在开发阶段,AssetBundles数据资源通过unity3D编辑器被分别输出出来,这部分是本文的重点。然后通过一些外部的上传方法,存储到服务器中,这部分unity3D本身并没有提供,可以使用的方法很多,比如FTP、ASP结合数据库等。

    Unity3D


    项目运行阶段,用户首先通过局域网、互联网来下载数据资源AssetBundles,一旦下载完毕后,就可以对数据资源进行加载等一系列操作。

     

    unity3d

    下面演示创建AssetBundles的过程和方法:

    在AssetBundles中,共有三种方法来创建数据资源。

    • BuildPipeline.BuildAssetBundle, 可以创建任意类型的的资源包,这是一个压缩好的,包含所有预置物(prefabs)、贴图、模型和动画信息的unity3d文件。
    • BuildPipeline.BuildStreamedSceneAssetBundle,用来创建数据流文件,是数据远程加载的方法,利用这种方法建立的数据文件,通常是一个单一的unity3d文件。使用WWW类来进行传输,加载完毕后使用WWW.LoadFromCacheOrDownload来加载下载好的场景文件。
    • BuildPipeline.BuildAssetBundleExplicitAssetNames,这种方法同BuildPipeline.BuildAssetBundle类似,但是提供额外的参数来指定每个物体的自定义的字符串(名字)。

    实例如下:

    现在unity3d的帮助文档BuildPipeline.BuildAssetBundle中,复制以下C#代码。

    // C# Example

    // Builds an asset bundle from the selected objects in the project view.

    // Once compiled go to "Menu" -> "Assets" and select one of the choices

    // to build the Asset Bundle

     

    using UnityEngine;

    using UnityEditor;

     

    public class ExportAssetBundles {

    [MenuItem("Assets/Build AssetBundle From Selection - Track dependencies")]

    static void ExportResource () {

    // Bring up save panel

    string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d");

    if (path.Length != 0) {

    // Build the resource file from the active selection.

    Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);

    BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets);

    Selection.objects = selection;

    }

    }

    [MenuItem("Assets/Build AssetBundle From Selection - No dependency tracking")]

    static void ExportResourceNoTrack () {

    // Bring up save panel

    string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d");

    if (path.Length != 0) {

    // Build the resource file from the active selection.

    BuildPipeline.BuildAssetBundle(Selection.activeObject, Selection.objects, path);

    }

    }

    }

    以上为代码部分

    在unity3d编辑器中,新建C# script,取名为ExportAssetBundles,该脚本必须存储在unity3d项目(Project)面板的Editor目录下。

    这时候,在菜单Assets中,我们会发现多了两项新的菜单列表。

    1. Build AssetBundle From Selection - Track dependencies,顾名思义,它能通过当前选中的物体创建AssetBundles数据资源,并且该数据资源包含所有的关联物体。比如,子物体和其他组件(components)。
    2. Build AssetBundle From Selection - No dependency tracking,很明显,这种方法同上面是相对应的,它不包含关联物体,而仅仅输出选中物体本身。

    在这个例子中,我们在编辑器中创建一个cube,通过菜单GameObject - Create Other - Cube,在层级视图(Hierachy View)中,会创建了一个新的cube物体,把他拖动到项目视图(Project View)中,称为预置物(Prefabs)。在项目视图中,鼠标右键点击cube,选择Build AssetBundle From Selection - Track dependencies,生成数据资源,并把它存储到项目的AssetBundles目录中。

    生成完毕的Cube.unity3d文件,可以根据项目的要求,存储到磁盘的任何位置,或者上传到服务器。

    这种手动存储的方法,在项目建立之初能快速的帮助项目建立原型,但随着资源文件的壮大,通过手动来输出明显是不可能的。比较有效的方法,就是写一个函数,来自动创建项目中所有的AssetBundles,同时用一个text文本来标示项目中要创建数据资源的列表清单。(更多Unity3D教程资讯分享尽在Web3D纳金网http://www.narkii.com/



[关键字:Unity3d动态数据管理(Export AssetBundles)] 
posted on 2013-03-12 10:27  陈峰  阅读(1899)  评论(0编辑  收藏  举报