Unity5 AssetBundle 打包和下载
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity5 AssetBundle 打包和下载相关的知识,希望对你有一定的参考价值。
打包
using UnityEngine; using System.Collections; using UnityEditor; using System.IO; /// <summary> /// 把Resource下的资源打包成.unity3d 到StreamingAssets目录下 /// </summary> public class Builder : Editor { public static string sourcePath = Application.dataPath + "/Resources"; const string AssetBundlesOutputPath = "Assets/StreamingAssets"; [MenuItem("Tools/AssetBundle/Build")] public static void BuildAssetBundle() { Caching.CleanCache(); ClearAssetBundlesName(); Pack(sourcePath); string outputPath = Path.Combine(AssetBundlesOutputPath, Platform.GetPlatformFolder(EditorUserBuildSettings.activeBuildTarget)); if (!Directory.Exists(Application.dataPath + "/../Assetbundle")) { Directory.CreateDirectory(Application.dataPath + "/../Assetbundle"); } Debug.Log(outputPath); //根据BuildSetting里面所激活的平台进行打包 // BuildPipeline.BuildAssetBundles(outputPath, 0, EditorUserBuildSettings.activeBuildTarget); BuildPipeline.BuildAssetBundles(Application.dataPath + "/../Assetbundle", BuildAssetBundleOptions.UncompressedAssetBundle); AssetDatabase.Refresh(); Debug.Log("打包完成"); } /// <summary> /// 清除之前设置过的AssetBundleName,避免产生不必要的资源也打包 /// 之前说过,只要设置了AssetBundleName的,都会进行打包,不论在什么目录下 /// </summary> static void ClearAssetBundlesName() { int length = AssetDatabase.GetAllAssetBundleNames().Length; Debug.Log(length); string[] oldAssetBundleNames = new string[length]; for (int i = 0; i < length; i++) { oldAssetBundleNames[i] = AssetDatabase.GetAllAssetBundleNames()[i]; } for (int j = 0; j < oldAssetBundleNames.Length; j++) { AssetDatabase.RemoveAssetBundleName(oldAssetBundleNames[j], true); } length = AssetDatabase.GetAllAssetBundleNames().Length; Debug.Log(length); } static void Pack(string source) { DirectoryInfo folder = new DirectoryInfo(source); FileSystemInfo[] files = folder.GetFileSystemInfos(); int length = files.Length; for (int i = 0; i < length; i++) { if (files[i] is DirectoryInfo) { Pack(files[i].FullName); } else { if (!files[i].Name.EndsWith(".meta")) { file(files[i].FullName); } } } } static void file(string source) { string _source = Replace(source); string _assetPath = "Assets" + _source.Substring(Application.dataPath.Length); string _assetPath2 = _source.Substring(Application.dataPath.Length + 1); //Debug.Log (_assetPath); //在代码中给资源设置AssetBundleName AssetImporter assetImporter = AssetImporter.GetAtPath(_assetPath); string assetName = _assetPath2.Substring(_assetPath2.IndexOf("/") + 1); assetName = assetName.Replace(Path.GetExtension(assetName), ".unity3d"); //Debug.Log (assetName); assetImporter.assetBundleName = assetName; } static string Replace(string s) { return s.Replace("\\", "/"); } } public class Platform { public static string GetPlatformFolder(BuildTarget target) { switch (target) { case BuildTarget.android: return "Android"; case BuildTarget.ios: return "IOS"; case BuildTarget.WebPlayer: return "WebPlayer"; case BuildTarget.StandaloneWindows: case BuildTarget.StandaloneWindows64: return "Windows"; case BuildTarget.StandaloneOSXIntel: case BuildTarget.StandaloneOSXIntel64: case BuildTarget.StandaloneOSXUniversal: return "OSX"; default: return null; } } }
- 读取
using UnityEngine; using System.Collections; using System.Collections.Generic; public class Test : MonoBehaviour { AssetBundle manifestBundle = null; AssetBundle cubeBundle = null; private string buildPath = Application.dataPath + "/../Assetbundle/"; public Dictionary<string, AssetBundle> bundleList = new Dictionary<string, AssetBundle>(); // Use this for initialization void Start() { LoadBundle(""); } public void LoadBundle(string name) { } //单独读取资源 private IEnumerator LoadGameObjectPackedByThemselves(string path) { Debug.Log(path); //WWW bundle = new WWW(path); //yield return bundle; WWW www = WWW.LoadFromCacheOrDownload(path, 5); yield return www; //加载 //Instantiate(bundle.assetBundle); //www.assetBundle.Unload(false); } void OnGUI() { if (GUILayout.Button("LoadAssetbundle")) { //首先加载Manifest文件; if (bundleList.ContainsKey(buildPath + ResourceConfig.MainAssetBundle)) { manifestBundle = bundleList[buildPath + ResourceConfig.MainAssetBundle]; } else { manifestBundle = AssetBundle.LoadFromFile(buildPath + ResourceConfig.MainAssetBundle); bundleList.Add(buildPath + ResourceConfig.MainAssetBundle, manifestBundle); } //manifestBundle = AssetBundle.LoadFromFile(Application.dataPath + "/../Assetbundle/Assetbundle"); Debug.Log(buildPath + ResourceConfig.MainAssetBundle); if (manifestBundle != null) { AssetBundleManifest manifest = (AssetBundleManifest)manifestBundle.LoadAsset("AssetBundleManifest"); if (manifest == null) { Debug.Log("manifest == null"); } //获取依赖文件列表; string[] cubedepends = manifest.GetAllDependencies(ResourceConfig.BundleTextPrefabPath); AssetBundle[] dependsAssetbundle = new AssetBundle[cubedepends.Length]; for (int index = 0; index < cubedepends.Length; index++) { //加载所有的依赖文件; if (bundleList.ContainsKey(buildPath + cubedepends[index])) { continue; } dependsAssetbundle[index] = AssetBundle.LoadFromFile(buildPath + cubedepends[index]); bundleList.Add(buildPath + cubedepends[index], dependsAssetbundle[index]); } //加载我们需要的文件; if (bundleList.ContainsKey(buildPath + ResourceConfig.BundleTextPrefabPath)) { cubeBundle = bundleList[buildPath + ResourceConfig.BundleTextPrefabPath]; } else { cubeBundle = AssetBundle.LoadFromFile(buildPath + ResourceConfig.BundleTextPrefabPath); bundleList.Add(buildPath + ResourceConfig.BundleTextPrefabPath , cubeBundle); } GameObject cube = cubeBundle.LoadAsset("bundletextprefab") as GameObject; if (cube != null) { //GameObject o = Instantiate(cube); //o.transform.parent = GameObject.Find("Camera").transform; GameObject obj = NGUITools.AddChild(GameObject.Find("Camera"), cube); } } } } public AssetBundle DownBundle(string path) { if (bundleList.ContainsKey(buildPath + ResourceConfig.MainAssetBundle)) { manifestBundle = bundleList[buildPath + ResourceConfig.MainAssetBundle]; } else { manifestBundle = AssetBundle.LoadFromFile(buildPath + ResourceConfig.MainAssetBundle); bundleList.Add(buildPath + ResourceConfig.MainAssetBundle, manifestBundle); } if (manifestBundle != null) { AssetBundleManifest manifest = (AssetBundleManifest)manifestBundle.LoadAsset("AssetBundleManifest"); if (manifest == null) { Debug.Log("manifest == null"); } //获取依赖文件列表; string[] cubedepends = manifest.GetAllDependencies(ResourceConfig.IconPath); AssetBundle[] dependsAssetbundle = new AssetBundle[cubedepends.Length]; for (int index = 0; index < cubedepends.Length; index++) { //加载所有的依赖文件; if (bundleList.ContainsKey(buildPath + cubedepends[index])) { continue; } dependsAssetbundle[index] = AssetBundle.LoadFromFile(buildPath + cubedepends[index]); bundleList.Add(buildPath + cubedepends[index], dependsAssetbundle[index]); } //加载我们需要的文件; if (bundleList.ContainsKey(buildPath + ResourceConfig.IconPath)) { cubeBundle = bundleList[buildPath + ResourceConfig.IconPath]; } else { cubeBundle = AssetBundle.LoadFromFile(buildPath + ResourceConfig.IconPath); bundleList.Add(buildPath + ResourceConfig.IconPath , cubeBundle); } } return cubeBundle; } public void Removebundle() { cubeBundle.Unload(false); bundleList.Remove(Application.dataPath + "/../Assetbundle/icon.unity3d"); } }
-
这里是 我给资源做的一个全局路径记录 用来 加载
using UnityEngine; using System.Collections; using System.Collections.Generic; public class ResourceConfig { public const string MainAssetBundle = "Assetbundle"; public const string BundleItemPath = "Prefabs/BundleItem.prefab"; public const string BundleTextPrefabPath = "Prefabs/BundleTextPrefab.prefab"; public const string item1Path = "item1.prefab"; public const string itemPath = "item.prefab"; public const string IconPath = "icon.unity3d"; }
- 这里是 View层的调用
using UnityEngine; using System.Collections; public class BundleTextPrefab : MonoBehaviour { public UITexture tex; public UITexture tex1; Test tt; // Use this for initialization void Start () { tt = GameObject.Find("UI Root").gameObject.GetComponent<Test>(); AssetBundle bundle = tt.DownBundle(""); if (bundle == null) Debug.Log("bundle == null"); tex.mainTexture = bundle.LoadAsset("icon") as Texture2D; } // Update is called once per frame void Update () { if (Input.GetKeyDown(KeyCode.Y)) { tt = GameObject.Find("UI Root").gameObject.GetComponent<Test>(); AssetBundle bundle = tt.DownBundle(""); if (bundle == null) Debug.Log("bundle == null"); tex1.mainTexture = bundle.LoadAsset("icon") as Texture2D; } if (Input.GetKeyDown(KeyCode.T)) { tt.Removebundle(); } } }
- 我刚刚 研究Assetbundle 不是很了解 这里只是想做一下记录 上面的代码写的很简陋,是临时做实验写的,以后会慢慢完善,我是打算写出一个游戏的底层框架,包括UI、和异步加载!加油!!
以上是关于Unity5 AssetBundle 打包和下载的主要内容,如果未能解决你的问题,请参考以下文章
Unity5版本的AssetBundle打包方案之打包Scene场景
unity系统模块开发Unity5.5.2UI打包AssetBundle