首页 > 代码库 > Unity5 AssetBundle系列——简单的AssetBundleManager
Unity5 AssetBundle系列——简单的AssetBundleManager
一个AssetBundle同时只能加载一次,所以实际使用中一般会伴随着AssetBundle包的管理。
下面是一个简单的AssetBundle管理器,提供了同步和异步加载函数:
using UnityEngine;using System.Collections;using System.Collections.Generic;public class AssetBundleManager{ public static AssetBundleManager Instace { get { if (_instace == null) _instace = new AssetBundleManager(); return _instace; } } private static AssetBundleManager _instace = null; private AssetBundleManifest manifest = null; private Dictionary<string, AssetBundle> dicAssetBundle = new Dictionary<string, AssetBundle>(); // filename : Assets全路径,比如Assets/Prefab/***.prefab public AssetBundle GetAssetBundle(string filePath) { AssetBundle ab = null; dicAssetBundle.TryGetValue(AssetsNameToBundleName(filePath), out ab); return ab; } // 加载manifest,用来处理关联资源 public void LoadManifest() { AssetBundle bundle = AssetBundle.LoadFromFile(MainifestFilePath()); manifest = bundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); // 压缩包直接释放掉 bundle.Unload(false); bundle = null; } // filename : Assets全路径,比如Assets/Prefab/***.prefab public AssetBundle Load(string filename) { string bundleName = AssetsNameToBundleName(filename); if (dicAssetBundle.ContainsKey(bundleName)) { return dicAssetBundle[bundleName]; } string[] dependence = manifest.GetAllDependencies(bundleName); for (int i = 0; i < dependence.Length; ++i) { LoadInternal(dependence[i]); } return LoadInternal(bundleName); } // filename : Assets全路径,比如Assets/Prefab/***.prefab public IEnumerator LoadAsync(string filename) { string bundleName = AssetsNameToBundleName(filename); if (dicAssetBundle.ContainsKey(bundleName)) { yield break; } string[] dependence = manifest.GetAllDependencies(bundleName); for (int i = 0; i < dependence.Length; ++i) { yield return LoadInternalAsync(dependence[i]); } yield return LoadInternalAsync(bundleName); } public void Unload(string filename, bool force = false) { string bundleName = AssetsNameToBundleName(filename); AssetBundle ab = null; if (dicAssetBundle.TryGetValue(bundleName, out ab) == false) return; if (ab == null) return; ab.Unload(force); ab = null; dicAssetBundle.Remove(bundleName); } public void UnloadUnusedAssets() { Resources.UnloadUnusedAssets(); System.GC.Collect(); } public void Release() { foreach(var pair in dicAssetBundle) { var bundle = pair.Value; if(bundle != null) { bundle.Unload(true); bundle = null; } } dicAssetBundle.Clear(); } private AssetBundle LoadInternal(string bundleName) { if (dicAssetBundle.ContainsKey(bundleName)) { return dicAssetBundle[bundleName]; } AssetBundle bundle = AssetBundle.LoadFromFile(BundleNameToBundlePath(bundleName)); dicAssetBundle.Add(bundleName, bundle); return bundle; } private IEnumerator LoadInternalAsync(string bundleName) { if (dicAssetBundle.ContainsKey(bundleName)) { yield break; } AssetBundleCreateRequest req = AssetBundle.LoadFromFileAsync(BundleNameToBundlePath(bundleName)); yield return req; dicAssetBundle.Add(bundleName, req.assetBundle); } // 名字依赖于存放目录 private string MainifestFilePath() { return Application.dataPath + "/StreamingAssets/StreamingAssets"; } // Assets/Prefab/***.prefab --> assets.prefab.***.prefab.assetbundle private string AssetsNameToBundleName(string file) { string f = file.Replace(‘/‘, ‘.‘); f = f.ToLower(); f += ".assetbundle"; return f; } // assets.prefab.***.prefab.assetbundle --> C:/***path***/assets.prefab.***.prefab.assetbundle private string BundleNameToBundlePath(string bundleFilename) { return System.IO.Path.Combine(Application.dataPath + "/StreamingAssets/", bundleFilename); }}
当然bundle也可以通过WWW或其他的方式来加载,这一块Unity5到没有什么变化,具体使用方式可以参考我以前的博客。
Unity5 AssetBundle系列——简单的AssetBundleManager
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。