Unity中Android加载assetbundle需要注意的两点问题

1、打包需要用Android的路径打包

 

 

using UnityEngine;
using System.Collections;
using UnityEditor;

public class Test : Editor
{

[MenuItem("Custom Editor/Create AssetBunldes Main")]
static void CreateAssetBunldesMain()
{
//获取在Project视图中选择的所有游戏对象
Object[] SelectedAsset = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);

//遍历所有的游戏对象
foreach (Object obj in SelectedAsset)
{
//本地测试:建议最后将Assetbundle放在StreamingAssets文件夹下,如果没有就创建一个,因为移动平台下只能读取这个路径
//StreamingAssets是只读路径,不能写入
//服务器下载:就不需要放在这里,服务器上客户端用www类进行下载。
string targetPath = Application.dataPath + "/StreamingAssets/" + obj.name + ".assetbundle";
//BuildPipeline.BuildAssetBundle(obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies
if (BuildPipeline.BuildAssetBundle(obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies, BuildTarget.Android))
{
Debug.Log(obj.name + "资源打包成功");
}
else
{
Debug.Log(obj.name + "资源打包失败");
}
}
//刷新编辑器
AssetDatabase.Refresh();

}

[MenuItem("Custom Editor/Create AssetBunldes ALL")]
static void CreateAssetBunldesALL()
{

Caching.CleanCache();


string Path = Application.dataPath + "/StreamingAssets/ALL.assetbundle";


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

foreach (Object obj in SelectedAsset)
{
Debug.Log("Create AssetBunldes name :" + obj);
}

//这里注意第二个参数就行
if (BuildPipeline.BuildAssetBundle(null, SelectedAsset, Path, BuildAssetBundleOptions.CollectDependencies))
{
AssetDatabase.Refresh();
}
else
{

}
}

[MenuItem("Custom Editor/Create Scene")]
static void CreateSceneALL()
{
//清空一下缓存
Caching.CleanCache();
string Path = Application.dataPath + "/MyScene.unity3d";
string[] levels = { "Assets/Level.unity" };
//打包场景
BuildPipeline.BuildPlayer(levels, Path, BuildTarget.WebPlayer, BuildOptions.BuildAdditionalStreamedScenes);
AssetDatabase.Refresh();
}

}

 

 

 

2、加载也需要用Android的路径加载

 

using UnityEngine;
using System.Collections;
using System.IO;

public class RunScript : MonoBehaviour
{
string DownPath = "";

////不同平台下StreamingAssets的路径是不同的,这里需要注意一下。
//public static readonly string PathURL =
//#if UNITY_ANDROID
// "jar:file://" + Application.dataPath + "!/assets/";
//#elif UNITY_IPHONE
// Application.dataPath + "/Raw/";
//#elif UNITY_STANDALONE_WIN || UNITY_EDITOR
// "file://" + Application.dataPath + "/StreamingAssets/";
//#else
// string.Empty;
//#endif

void OnGUI()
{
if (GUI.Button(new Rect(50, 100, 100, 100), "Main Assetbundle"))
{
StartCoroutine(LoadMainGameObject("http://10.131.229.166/MyItems/Cube.assetbundle"));
StartCoroutine(LoadMainGameObject("jar:file://" + Application.dataPath + "!/assets/" + "Cube.assetbundle"));

}
}
//读取一个资源

private IEnumerator LoadMainGameObject(string path)
{
WWW bundle = new WWW(path);
yield return bundle;
//加载到游戏中
yield return Instantiate(bundle.assetBundle.mainAsset);
Debug.Log("+++++++++++++++++++++++++++Load successful!!");
bundle.assetBundle.Unload(false);
}

//从服务器下载资源
private IEnumerator DownLoadToLocal(string url)
{
WWW.EscapeURL(url); //url编码
WWW www = new WWW(url);//访问url
WWW.UnEscapeURL(url); //url解码
string filename = url.Substring(url.LastIndexOf('/') + 1); //根据URL获取文件的名字。
yield return www; //等待下载
if (www.error == null)
{

FileStream fs = File.Create(Application.persistentDataPath + "/" + filename); //path为你想保存文件的路径。
DownPath = Application.persistentDataPath + "/" + filename; //把下载的数据写到文件
fs.Write(www.bytes, 0, www.bytes.Length);
fs.Close();
Debug.Log(filename + "下载完成");

}
else
{
Debug.Log(www.error);
}
}

}

 

 

文件夹的名字也不要弄错了。

 

posted @ 2016-07-03 22:19  Fei非非  阅读(6054)  评论(0编辑  收藏  举报