ResourceManager(八)—— 在安卓机子上实现加载AssetBundle

原创 2017年10月06日 20:23:46
上一篇的demo只能在windows上运行,这一篇看看在安卓上怎么搞。
1.首先肯定还是要先点击工具栏Build/BuildAndroid生成assetbundle。
2.把Assets/assetbundles里面的东西全拖到Assets/StreamingAssets文件夹下面。
3.可以打包运行了。

接下来看看在安卓机上的运行流程:
1.从StreamingAssets文件夹下先复制AssetInfo.bytes,Resource.bytes,Version.bytes三个文件到PersistentAssets目录下。
2.读取AssetInfo.bytes中保存的路径信息,然后把对应的StreamingAssets下的资源复制PersistentAssets目录下。
3.点击button。跳转到TestScene。

就这样吧,手机截图不好上传,就不截图了。

这一篇相对于上一篇只有UpdateSceneScript.cs改变了的:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Xml;

public class UpdateSceneScript : MonoBehaviour 
{
    //这个路径是可以用的,测试过了
    string StreamingAssetPath;
    string PersistentPath;

    //存放所有资源的路径
    List<string> mAllAssetPath = new List<string> ();

    void Start () 
    {
        StreamingAssetPath = "jar:file://" + Application.dataPath + "!/assets/";
        PersistentPath = Application.persistentDataPath + "/";

        //靠AssetInfo.bytes文件是否存在来判断是否已经复制过了
        if (File.Exists(PersistentPath + "AssetInfo.bytes"))
        {
            Debug.Log ("files exist already, do not neead to copy files from StreamAssetPath to PersistentDataPath!!!");
        }
        //开始复制
        else
        {
            //1.复制AssetInfo.bytes
            StartCoroutine (CopyAssetInfoFile ());
            //1.复制Resource.bytes
            StartCoroutine (CopyResourceFile ());
            //1.复制Version.bytes
            StartCoroutine (CopyVersionFile ());
        }
    }

    //复制AssetInfo.bytes文件
    private IEnumerator CopyAssetInfoFile()
    {
        Debug.Log ("Copying AssetInfo.bytes File !!!");
        WWW www = new WWW (StreamingAssetPath + "AssetInfo.bytes");
        yield return www;

        if (!string.IsNullOrEmpty(www.error))
        {
            Debug.Log ("Copying AssetInfo.bytes should not error!!!");
            www.Dispose ();
        }
        else
        {
            //把AssetInfo.bytes写到persitentPath下面去
            File.WriteAllBytes (PersistentPath + "AssetInfo.bytes", www.bytes);
            www.Dispose ();

            //因为AssetInfo.bytes对于复制其他资源文件是必须的,所以必须先复制了才行
            //2.开始读取AssetInfo.bytes内的信息
            GetAssetPaths ();
        }
    }

    //复制Resource.bytes文件
    private IEnumerator CopyResourceFile()
    {
        Debug.Log ("Copying Resource.bytes file !!!");
        WWW www = new WWW (StreamingAssetPath + "Resource.bytes");
        yield return www;

        if (!string.IsNullOrEmpty(www.error))
        {
            Debug.Log ("Copying Resource.bytes should not error!!!");
            www.Dispose ();
        }
        else
        {
            //把AssetInfo.bytes写到persitentPath下面去
            File.WriteAllBytes (PersistentPath + "Resource.bytes", www.bytes);
            www.Dispose ();
        }
    }

    //复制Version.bytes文件
    private IEnumerator CopyVersionFile()
    {
        Debug.Log ("Copying Version.bytes file !!!");
        WWW www = new WWW (StreamingAssetPath + "Version.bytes");
        yield return www;

        if (!string.IsNullOrEmpty(www.error))
        {
            Debug.Log ("Copying Version.bytes should not error!!!");
            www.Dispose ();
        }
        else
        {
            //把AssetInfo.bytes写到persitentPath下面去
            File.WriteAllBytes (PersistentPath + "Version.bytes", www.bytes);
            www.Dispose ();
        }
    }

    //获取AssetInfo.bytes中路径信息
    private void GetAssetPaths()
    {
        if (File.Exists(PersistentPath + "AssetInfo.bytes"))
        {
            FileStream fs =  File.Open (PersistentPath + "AssetInfo.bytes", FileMode.Open, FileAccess.Read, FileShare.Read);
            StreamReader assetInfoSW = new StreamReader (fs, System.Text.Encoding.Default);
            XmlDocument doc = new XmlDocument ();
            doc.LoadXml (assetInfoSW.ReadToEnd ());
            XmlElement root = doc.DocumentElement;

            IEnumerator iter = root.GetEnumerator ();
            while (iter.MoveNext())
            {
                XmlElement child_root = iter.Current as XmlElement;
                string name = child_root.GetAttribute ("name");
                mAllAssetPath.Add (name);
            }
            fs.Close ();
            assetInfoSW.Close ();

            Debug.Log ("Get all assets path completed!!!");
        }

        Debug.Log ("Start Copy ! ! !");
        //3.开始复制
        StartCopy ();

        Debug.Log ("ALl files copied completed");

    }

    void OnGUI()
    {
        //6.全部加载完了就开始加载TestScene
        if (GUI.Button(new Rect(10, 10, 100, 100), "button"))
        {
            //完成初始化
            ResourcesManager.Instance.Init ();

            //加载场景
            ResourcesManager.Instance.loadLevel ("Scenes/TestScene", null);
        }
    }

    //开始资源文件的复制
    private void StartCopy()
    {
        //文件路径
        string file = mAllAssetPath [0];

        mAllAssetPath.RemoveAt (0);

        //4.www加载
        StartCoroutine (WwwDownload (file, delegate(WWW www)
        {
                //5.www加载好了就开始复制
                CopyToPersistent(file, www);

                //销毁
                www.Dispose();

                //递归copy
                StartCopy();
        }));

    }

    private delegate void HandleCopyCompleted(WWW www);

    //WWW加载StreamingAssets下的资源
    private IEnumerator WwwDownload(string filePath, HandleCopyCompleted handle)
    {
        //源路径
        string filePathSrc = StreamingAssetPath + filePath + ".bytes";

        WWW www = new WWW (filePathSrc);
        yield return www;
        if (!string.IsNullOrEmpty(www.error))
        {
            Debug.Log ("should not error!!!");
            www.Dispose ();
        }
        else
        {
            if (handle != null)
            {
                handle (www);
            }
            //www.Dispose ();
        }
    }

    //复制操作
    private void CopyToPersistent(string filePath, WWW www)
    {       
        //目标路径
        string filePathDest = PersistentPath + filePath + ".bytes";
        string filePathDestFolder = ResourceCommon.getPath (PersistentPath + filePath);

        if (!Directory.Exists(filePathDestFolder))
        {
            Directory.CreateDirectory (filePathDestFolder);
            Debug.Log ("Create Directory!!!");
            Debug.Log ("filePathDestFolder: + " + filePathDestFolder);
        }

        File.WriteAllBytes (filePathDest, www.bytes);
    }
}

unity动态加载之AssetBundle应用

前言 unity通过Assetbundle技术来解决在游戏运行中,对资源进行动态的下载和加载,开发者将游戏中所需要的各类资源打包压缩上传至网络服务器上,在运行游戏时可以从服务器上下载资源,从而实现资源...
  • u014735301
  • u014735301
  • 2014年12月29日 09:59
  • 2261

AssetBundle打包和各种加载方式

1:什么是AssetBundle。 AssetBundle是从unity项目中打包出来的资源文件,可用于资源的更新等。AssetBundle支持3中格式的压缩选择,分别是LZMA,LZ4,无压缩。默...
  • u010989951
  • u010989951
  • 2017年03月31日 14:59
  • 2557

Unity游戏开发使用Assetbundle加载场景的原理

Assetbundle 是Unity Pro提供提供的功能,它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中,提供了封装与解包的方法使用起来很便利。 1.预设         ...
  • davidliu0327
  • davidliu0327
  • 2015年11月05日 22:41
  • 1096

AssetBundle最新内存加载细节

通过讲解ab加载到内存的损耗细节,来说明Unity5.4版本后的ab将让热更新管理方案变得比之前更简洁和便利。...
  • bloodshadow
  • bloodshadow
  • 2016年10月25日 16:02
  • 1068

Unity Assetbundle的加载方式的效率和内存占用

首先,简要介绍一下加载AssetBundle的主要两种方式,分别是new WWW(url)和WWW.LoadFromCacheOrDownload,两种方式的具体用法,自己查官方API,这里不再叙述 ...
  • u011926026
  • u011926026
  • 2017年04月13日 10:36
  • 1350

Unity教程之-Unity5.x版本AssetBundle加载研究

之前说了 “unity4.x版本AssetBundle打包研究”,没看过的请先看一下《Unity教程之-Unity3d打包Assetbundle并加载》,再来看本文,有一定的连接性。 先梳理一下思路...
  • andyhebear
  • andyhebear
  • 2016年01月08日 11:44
  • 3627

关于AssetBundle的加载与卸载

一、如何下载AssetBundle    1、非缓存机制——通过创建一个WWW实例来对AssetBundle文件进行下载。下载后的AssetBundle文件将不会进入Unity引擎特定的缓存区。 ...
  • cbbbc
  • cbbbc
  • 2015年10月14日 16:42
  • 2063

Unity3D 关于资源加载(Resources和AssetBundle)和内存管

http://blog.csdn.net/fenrir_sun/article/details/50207909 Unity3D 里有两种动态加载机制:一个是Resources.Load,另...
  • anypkv
  • anypkv
  • 2016年10月25日 17:01
  • 1337

Unity教程之-Unity3d打包Assetbundle并加载(全面)

此文为转发,如果有看不懂的直接看我之前一篇灰常初级的教程然后再来看这篇。初级地址http://blog.csdn.net/alayeshi/article/details/52885735 本篇...
  • alayeshi
  • alayeshi
  • 2016年10月21日 18:42
  • 2295

[Unity3d]安卓无法加载assetbundle的问题

前几天做了AssentBundle的例子,遇到了问题,在论坛上问了三天都没人解答,最后在一个朋友的帮助下解决了。下面介绍AssentBundle。 AssetBundles让你通过WWW类流式加载额...
  • s10141303
  • s10141303
  • 2014年02月25日 14:19
  • 6581
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ResourceManager(八)—— 在安卓机子上实现加载AssetBundle
举报原因:
原因补充:

(最多只允许输入30个字)