zoukankan      html  css  js  c++  java
  • 【转】>Unity3d动态数据管理(Export AssetBundles)

     铁锹   发表于 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)] 
  • 相关阅读:
    NSHashtable and NSMaptable
    架构的本质:构造定律与结合规则
    软件复用的基础和形式
    架构模式:循环模式、管道模式
    待整理
    functions and closures are reference types-函数和闭包是引用类型
    @autoclosure-可以让表达式自动封装成一个闭包:输入的是一个表达式
    Python 运算符优先级
    Linux下chkconfig命令详解
    Linux下Redis开机自启(Centos)
  • 原文地址:https://www.cnblogs.com/freebird92/p/2955180.html
Copyright © 2011-2022 走看看