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);
    }
}

【Python全栈】第五周 Python Web项目开发实现(上)

-
  • 1970年01月01日 08:00

Unity 中的特殊文件夹

Unity官方文档: Special folder names You can usually choose any name you like for the folders...
  • qweewqpkn
  • qweewqpkn
  • 2018-02-04 11:21:47
  • 60

将场景导出二进制文件并且解析还原场景

这是上一篇文章的补充 最近在做客户端与服务器的交互,使用JSON 和XML会感觉数据量太大,影响效率。最后使用二进制的方式来完成。如下图所示,使用二进制可以把空间节省到803K ,是不是很不错呢...
  • lzhq1982
  • lzhq1982
  • 2013-10-31 15:19:55
  • 2635

Unity3D研究院之将场景导出XML或JSON或二进制并且解析还原场景(四十二)

导出Unity场景的所有游戏对象信息,一种是XML一种是JSON。本篇文章我们把游戏场景中游戏对象的、旋转、缩放、平移与Prefab的名称导出在XML与JSON中。然后解析刚刚导出的XML或JSON通...
  • cbbbc
  • cbbbc
  • 2015-10-27 20:21:55
  • 328

将场景导出二进制文件并且解析还原场景

这是上一篇文章的补充 最近在做客户端与服务器的交互,使用JSON 和XML会感觉数据量太大,影响效率。最后使用二进制的方式来完成。如下图所示,使用二进制可以把空间节省到803K ,是不是很不错呢...
  • lzhq1982
  • lzhq1982
  • 2013-10-31 15:19:55
  • 2635

Unity3D将场景导出XML或JSON或二进制并且解析还原场景(四十二)

 Unity3D研究院之将场景导出XML或JSON或二进制并且解析还原场景(四十二) 雨松MOMO 【Unity3D研究院之游戏开发】 围观18125次 85条评论 编辑日期:20...
  • chaixinke
  • chaixinke
  • 2015-01-26 16:17:12
  • 845

Unity3D将场景导出XML或JSON或二进制并且解析还原场景(四十二)

 Unity3D研究院之将场景导出XML或JSON或二进制并且解析还原场景(四十二) 雨松MOMO 【Unity3D研究院之游戏开发】 围观18125次 85条评论 编辑日期:20...
  • chaixinke
  • chaixinke
  • 2015-01-26 16:17:12
  • 845

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

前几天做了AssentBundle的例子,遇到了问题,在论坛上问了三天都没人解答,最后在一个朋友的帮助下解决了。下面介绍AssentBundle。 AssetBundles让你通过WWW类流式加载额...
  • s10141303
  • s10141303
  • 2014-02-25 14:19:15
  • 6845

Unity 编辑器环境下不能正确加载Android Assetbundle 中的 Shader 解决方法

UnityEditor 的确是没有正确从Assetbundle 中加载出来 Shader ,上面代码里面重新给Material 赋值一次,其实是 读取到了 没有被打成Assetbundle 的Shad...
  • cp790621656
  • cp790621656
  • 2016-01-20 22:28:32
  • 2868

Unity3d发布Android版通过WWW加载本地AssetBundle资源

不久之前买了小米平板,就想着用Unity3d做个小游戏放在平板上玩玩,匆匆做了个资源加载界面就发布apk到平板上,结果提示资源加载失败,找不到资源文件。在网上找了半天资料都没解决问题,最后发现自己犯了...
  • menghuangxiao
  • menghuangxiao
  • 2015-05-06 17:42:42
  • 4022
收藏助手
不良信息举报
您举报文章:ResourceManager(八)—— 在安卓机子上实现加载AssetBundle
举报原因:
原因补充:

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