加载AssetBundle方法

先介绍一种常用的加载AssetBundle方法

  

using UnityEngine;
using System.Collections;
using System.IO;
public class LoadUnity3d : MonoBehaviour
{      // Use this for initialization
    void Start()
    {
        StartCoroutine(LoadScene());
    }
    // Update is called once per frame
    void Update()       {   

   }
    IEnumerator LoadScene()     {
        //文件路径,也就是我们打包的那个
        WWW www = new WWW("file:///" + Application.dataPath + "/Bundles/My Prefab.unity3d");
        yield return www;
        Instantiate(www.assetBundle.mainAsset);
    }
}

第二种,将www文件读成字节进行同步加载

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public class ExampleClass : MonoBehaviour
 5 {
 6     /// <summary>
 7     /// 返回字节数组
 8     /// </summary>
 9     /// <param name="binary"></param>
10     /// <returns></returns>
11     byte[] MyDecription(byte[] binary)
12     {
13         byte[] decrypted;
14         return decrypted;
15     }
16     IEnumerator Start()
17     {
18         WWW www = new WWW("http://myserver/myBundle.unity3d");  //带有后缀的文件路径,可以是网络也可以是本地
19         yield return www;
20         byte[] decryptedBytes = MyDecription(www.bytes);    //返回字节数组
21         AssetBundle assetBundle = AssetBundle.LoadFromMemory(decryptedBytes);   //从内存中同步加载资源资源包
22         yield return assetBundle;
23         if (assetBundle != null)            //如果资源包不为空
24         {
25             Instantiate(assetBundle.LoadAsset<GameObject>("myBundle");   //根据名字从资源包中加载对应资源
26         }
27     }
28 }

第三种 异步

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public class ExampleClass : MonoBehaviour
 5 {
 6     /// <summary>
 7     /// 返回字节数组
 8     /// </summary>
 9     /// <param name="binary"></param>
10     /// <returns></returns>
11     byte[] MyDecription(byte[] binary)
12     {
13         byte[] decrypted;
14         return decrypted;
15     }
16     IEnumerator Start()
17     {
18         WWW www = new WWW("http://myserver/myBundle.unity3d");  //带有后缀的文件路径,可以是网络也可以是本地
19         yield return www;
20         byte[] decryptedBytes = MyDecription(www.bytes);    //返回字节数组
21         AssetBundleCreateRequest bundle = AssetBundle.LoadFromMemoryAsync(decryptedBytes);//从内存中异步加载资源资源包
22         yield return bundle;
23         if (bundle != null && bundle.assetBundle != null)
24         {
25             Instantiate(bundle.assetBundle.LoadAsset<GameObject>("myBundle"));//根据名字从资源包中加载对应资源
26         }
27     }
28 }

下面贴上项目中使用的方法 和异步加载很像,只是有些简单的实现进行了封装

 1   private IEnumerator LoadBundle(ModelGouJian _model)
 2     {
 3         string filePath = string.Format("{0}/_lesson/ModelFbx/{1}/{2}.unity3d", PublicJs.Datapath, _model.JieDianID, _model.ModelFbx);
 4         byte[] decryptedData = FileHelp.Instance.GetFileTextByteEsc(filePath);      //返回字节数组
 5         AssetBundleCreateRequest bundle = AssetBundle.LoadFromMemoryAsync(decryptedData);   //从内存中加载资源包
 6         yield return bundle;
 7         if (bundle != null && bundle.assetBundle != null)
 8         {
 9             _model.ModelObj = Instantiate(bundle.assetBundle.LoadAsset<GameObject>(_model.ModelFbx));  //根据资源名加载资源包中资源。
10             _model.ModelObj.name = _model.ModelFbx;
11             _model.ModelObj.transform.localPosition = new Vector3(0, 0, 0);
12             if (_model.ModelObj.name != gouJianData.CurSelectGouJian.ModelFbx) { _model.ModelObj.SetActive(false); }
13             bundle.assetBundle.Unload(false);
14             bundle = null;
15         }
16         else
17         {
18             LogHelp.Write("模型下载错误:{0}", filePath);
19         }
20         yield return new WaitForSeconds(0.5f);
21         iNum++;
22         //判断模型是否下载完成
23         if (IsLoadModel == true && iNum == iCount)
24         {
25             IsLoadModel = false;
26             this.LoadModelEnd();
27         }
28     }

对加载AssetBundle做一小结,以后补充。

树欲静而风不止,子欲养而亲不待!

2016年12月22日

时间: 2024-10-08 13:14:01

加载AssetBundle方法的相关文章

Unity3d 同步加载 Assetbundle 方法 AssetBundle.CreateFromFile

今天在群里问朋友有没有 同步加载 Assetbundle 的方法,同事给我指点 Unity3d 不知道在哪一个版本新增了一个 AssetBundle.CreateFromFile 的接口,这个接口是同步读取Assetbundle的.于是到帮助文档查询相关资料. http://docs.unity3d.com/ScriptReference/AssetBundle.CreateFromFile.html 文章转自http://blog.csdn.net/huutu 星环游戏 http://www.

加载 AssetBundle 的四种方法

[加载 AssetBundle 的四种方法] 1.AssetBundle.LoadFromMemoryAsync(byte[] binary, uint crc = 0); 返回AssetBundleCreateRequest.Use assetBundle property to get an AssetBundle once it is loaded. Compared to LoadFromMemory, this version will perform AssetBundle deco

Android处理延时加载的方法

在项目开发中,经常需要通过延时加载来实现满足我们的项目要求.那到底怎样来实现延时,下面结合java与android的相关方法来实现延时问题. 一.利用线程的Sleep方法 <span style="font-family:Microsoft YaHei;font-size:18px;"><span style="white-space:pre"> </span>new Thread(new Runnable(){ @Overrid

js jquery 页面加载初始化方法

一.js页面加载初始化方法 // 1.在body里面写初始化方法. <body onload='init()'> </body> <script type="text/javascript"> function init(){ // 初始化内容 } </script> // 2.window.onload=function(){} <script type="text/javascript"> window

Fragment的可见再加载的方法(真正的Fragment的OnResume和OnPause)

一 起因 我们在做应用的过程中,一个应用的界面可能是多个Fragment切换而成的,但是如果在每次应用启动的时候就去加载大量的网络数据(假设你的每个Fragment都需要加载网络数据,你也可以理解为初始化大量资源)肯定是不好的,能不能有一种方法可以在我们看到我们的Fragment时再去加载对应的Fragment的数据呢? 当然是有的. 二 解决 Fragment虽然有onResume和onPause的,但是这两个方法是Activity的方法,调用时机也是与Activity相同,和ViewPage

html页面加载初始化方法

js: 方法一: window.onload=function(){内容} 方法二(自己定义方法): function onload(){内容} onload(); jQuery: 方法一: $(document).ready(function(){内容}); 方法二: $(function(){内容}); 方法三: jQuery(function($){内容}); 注意:由于jquery使用$符号,这样和有些组件 ,例如dwr就有冲突,为了解决这个问题,可以使用:var j = jQuery.

使用CSS、JavaScript及Ajax实现图片预加载的方法详解 

预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验.本文将分享使用CSS.JavaScript及Ajax实现图片预加载的三个不同技术,来增强网站的性能与可用性.一起来看看吧,希望对大家学习web前端有所帮助. 方法一:用CSS和JavaScript实现预加载 实现预加载图片有很多方法,包括使用CSS

关于文档加载的方法

怎么排版啊啊啊... 1.首先用的最多的jQuery中有3种针对文档加载的方法 1 $(document).ready(function() { 2 // ...代码... 3 }) //document ready 简写 $(function() { // ...代码... }) $(document).load(function() { // ...代码... }) 其中第二种是第一种的简写方式. .ready和.load区别 先了解DOM文档加载的步骤: (1) 解析HTML结构. (2)

ARM架构下linux设备树加载的方法

引入设备树后bootloader加载DTB方法: 1. 标准方法 将linux kernel放到内存地址为<kernel img addr>的内存中. 将DTB放到地址为<dtb addr>的内存中. 在u-boot下通过下面的命令启动内核: bootm <kernel img addr> – <dtb addr> 2.兼容方法 配置内核CONFIG_ARM_APPENDED_DTB选项,将DTB放到紧跟内核后面的地址. 具体方法如下: 1)将DTB放到内核