您的位置:首页 > 其它

AssetBundle 打包加载

2018-01-09 11:35 232 查看
很好用的 打包插件

git地址:https://github.com/Unity-Technologies/AssetBundles-Browser

也可以自己写打包的代码

using UnityEditor;
using System.IO;
public class CreatAssetBundles {
[MenuItem("Assets/BuildAssetBundles")]
static void BuildAllAssetBundles()
{
string dir = "AssetBundles";
if (Directory.Exists (dir) == false) {
Directory.CreateDirectory (dir);
}
BuildPipeline.BuildAssetBundles (dir, BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.StandaloneWindows64);
}
}
AssetBundle的几种加载方式
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEngine.Networking;

public class LoadFromFile : MonoBehaviour {

// Use this for initialization
void Start () {
/*
//如果一个物体有依赖关系 先加载他的依赖
AssetBundle shall = AssetBundle.LoadFromFile ("AssetBundles/shall.unity3d");
AssetBundle ab = AssetBundle.LoadFromFile ("AssetBundles/scene/wall.unity3d");
GameObject wall = ab.LoadAsset<GameObject> ("wall");
Instantiate (wall);

// Object[] objs = ab.LoadAllAssets ();
// foreach (Object obj in objs) {
// Instantiate (obj);
// }
// AssetBundle.LoadFromMemoryAsync 内存中加载
// AssetBundle.LoadFromFile 文件中加载
// WWW.LoadFromCacheOrDownload 网络加载
// UnityWebRequest unity 2017 推荐使用
//file:///Applications/Unity2017.2/Documentation/en/Manual/AssetBundles-Native.html
*/

//StartCoroutine("LoadFromMemoryAsync");
//LoadFromMemory();
StartCoroutine("LoadFromFileAsync");
//StartCoroutine("LoadFromCacheOrDownload");
//StartCoroutine("UnityWebRequest");
Debug.Log("Start");
ManifestAB();
}

//第一种加载AB的方式 LoadFromMemoryAsync
IEnumerator LoadFromMemoryAsync()
{
string path = "AssetBundles/scene/wall.unity3d";
// 异步
AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
yield return request;
AssetBundle ab = request.assetBundle;
//使用里面的资源
GameObject wall = ab.LoadAsset<GameObject> ("wall");
Instantiate (wall);
}

//第一种加载AB的方式 LoadFromMemory
void LoadFromMemory()
{
string path = "AssetBundles/scene/wall.unity3d";
//同步
AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes(path));
//使用里面的资源
GameObject wall = ab.LoadAsset<GameObject> ("wall");
Instantiate (wall);
}

//第二种加载AB的方式 LoadFromFileAsync
IEnumerator LoadFromFileAsync()
{
string path = "AssetBundles/scene/wall.unity3d";
AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync (path);
yield return request;
AssetBundle ab = request.assetBundle;
//使用里面的资源
GameObject wall = ab.LoadAsset<GameObject> ("wall");
Instantiate (wall);
}

//第三种加载AB的方式
IEnumerator LoadFromCacheOrDownload ()
{
Debug.Log ("捡来了");
while (Caching.ready == false)
{
yield return null;
}
//奇怪 这个路径怎么就不对呢
// string path = @"/Users/Scarlett/Documents/MyProject/Scarlett_TestTec/AssetBundle/AssetBundles/scene/wall.unity3d";
string path = @"http://locahost/AssetBundle/AssetBundles/scene/wall.unity3d";
WWW www = WWW.LoadFromCacheOrDownload(path,1);
yield return www;
if(string.IsNullOrEmpty(www.error))
{
Debug.Log(www.error);
yield break;
}
Debug.Log ("没有错");
AssetBundle ab = www.assetBundle;
//使用里面的资源
GameObject wall = ab.LoadAsset<GameObject> ("wall");
Instantiate (wall);
}

//远程服务器加载

IEnumerator MyUnityWebRequest()
{
string url = @"/Users/Scarlett/Documents/MyProject/Scarlett_TestTec/AssetBundle/AssetBundles/scene/wall.unity3d";

UnityWebRequest request = UnityWebRequest.GetAssetBundle (url);
yield return request.SendWebRequest ();
//AssetBundle ab = DownloadHandlerAssetBundle.GetContent (request);
AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
//使用里面的资源
GameObject wall = ab.LoadAsset<GameObject> ("wall");
Instantiate (wall);
}

//通过Manifest 得到当前依赖的包
void ManifestAB()
{
Debug.Log ("进来了");
AssetBundle manifestAB = AssetBundle.LoadFromFile ("AssetBundles/AssetBundles");
AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest> ("AssetBundleManifest");
//取得所有AssetBundle包的名字
foreach (string name in manifest.GetAllAssetBundles()) {
print (name);
}
string[] strs = manifest.GetAllDependencies ("scene/wall.unity3d");
foreach (string str in strs) {
Debug.Log ("------" + str);
AssetBundle.LoadFromFile ("AssetBundles/" + str);
}
}

/* AssetBundle的卸载
* 卸载有两个方面
* 1.减少内存使用
* 2.有可能导致丢失
*
* 什么时候卸载资源
* AssetBundle.Unload(true) 卸载所有资源.即使有资源被使用
* (1.在关卡切换/场景切换 2.资源没用的时候调用)
* AssetBundle.Unload(false) 卸载所有没用被使用的资源
* 个别资源怎么卸载
* 1.通过Resources.UnloadUnusedAssets
* 2.场景切换的时候
*
* 关于文件效验
* CRC MD5 SHA1(Hash)
* 不同点
* 算法不同
* 长度不同
* 称呼不同
* SHA1安全性最高 效率比较慢
*/
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: