温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Unity C#如何打包AssetBundle

发布时间:2021-08-17 10:30:19 来源:亿速云 阅读:167 作者:小新 栏目:编程语言

小编给大家分享一下Unity C#如何打包AssetBundle,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Unity2018已经把打包过程简化很多了

我们只需要关心两个API:

1.BuildPipline.BuildAssetBundles() 打包AssetBundle

2.BuildPipline.BuildPlayer() 打包场景

1.打包AssetBundle

先在资源的Inspector面板最下方 填写资源所属的AssetBundle名称和后缀(后缀可以不填)

再利用BuildPipeline.BuildAssetBundles()进行打包

Unity C#如何打包AssetBundle

2.打包Scene

利用BuildPipeline.BuildPlayer()进行打包

为方便使用 先把要打包的场景放入指定的文件夹 通过脚本批量打包

Unity C#如何打包AssetBundle

3.脚本批量打包

Unity C#如何打包AssetBundle

4.打包完毕

Unity C#如何打包AssetBundle

5.加载测试

Unity C#如何打包AssetBundle

6.打包和测试脚本

AssetBundleBuilder.cs

using UnityEngine; using UnityEditor; using System.IO; /// <summary> /// 资源包打包工具 /// <para>打包AssetBundle和场景(Unity 2018.2.20)</para> /// <para>ZhangYu 2019-02-26</para> /// </summary> public class AssetBundleBuilder {  [MenuItem("打包/Windows/资源包和场景")]  public static void BuildAbsAndScenesWindows() {   BuildAbsAndScenes(BuildTarget.StandaloneWindows);  }  [MenuItem("打包/Android/资源包和场景")]  public static void BuildAbsAndScenesAndroid() {   BuildAbsAndScenes(BuildTarget.Android);  }  [MenuItem("打包/IOS/资源包和场景")]  public static void BuildAbsAndScenesIOS() {   BuildAbsAndScenes(BuildTarget.iOS);  }  [MenuItem("打包/Windows/资源包")]  public static void BuildAbsWindows() {   BuildAssetBundles(BuildTarget.StandaloneWindows);  }  [MenuItem("打包/Android/资源包")]  public static void BuildAbsAndroid() {   BuildAssetBundles(BuildTarget.Android);  }  [MenuItem("打包/IOS/资源包")]  public static void BuildAbsIOS() {   BuildAssetBundles(BuildTarget.iOS);  }  [MenuItem("打包/Windows/场景")]  public static void BuildScenesWindows() {   BuildScenes(BuildTarget.StandaloneWindows);  }  [MenuItem("打包/Android/场景")]  public static void BuildScenesAndroid() {   BuildScenes(BuildTarget.Android);  }  [MenuItem("打包/IOS/场景")]  public static void BuildScenesIOS() {   BuildScenes(BuildTarget.iOS);  }  // 打包AssetBundle和Scenes  public static void BuildAbsAndScenes(BuildTarget platform) {   BuildAssetBundles(platform);   BuildScenes(platform);  }  // 打包AssetBundles  private static void BuildAssetBundles(BuildTarget platform) {   // 输出路径   string outPath = Application.streamingAssetsPath + "/Abs";   if (!Directory.Exists(outPath)) Directory.CreateDirectory(outPath);   EditorUtility.DisplayProgressBar("信息", "打包资源包", 0f);   BuildPipeline.BuildAssetBundles(outPath, BuildAssetBundleOptions.DeterministicAssetBundle, platform);   AssetDatabase.Refresh();   Debug.Log("所有资源包打包完毕");  }  // 打包Scenes  private static void BuildScenes(BuildTarget platform) {   // 指定场景文件夹和输出路径   string scenePath = Application.dataPath + "/AbResources/Scenes";   string outPath = Application.streamingAssetsPath + "/Abs/";   if (Directory.Exists(scenePath)) {    // 创建输出文件夹    if (!Directory.Exists(outPath)) Directory.CreateDirectory(outPath);    // 查找指定目录下的场景文件    string[] scenes = GetAllFiles(scenePath, "*.unity");    for (int i = 0; i < scenes.Length; i++) {     string url = scenes[i].Replace("\\", "/");     int index = url.LastIndexOf("/");     string scene = url.Substring(index + 1, url.Length - index - 1);     string msg = string.Format("打包场景{0}", scene);     EditorUtility.DisplayProgressBar("信息", msg, 0f);     scene = scene.Replace(".unity", ".scene");     Debug.Log(string.Format("打包场景{0}到{1}", url, outPath + scene));     BuildPipeline.BuildPlayer(scenes, outPath + scene, BuildTarget.StandaloneWindows, BuildOptions.BuildAdditionalStreamedScenes);     AssetDatabase.Refresh();    }    EditorUtility.ClearProgressBar();    Debug.Log("所有场景打包完毕");   }  }  /// <summary> 获取文件夹和子文件夹下所有指定类型文件 </summary>  private static string[] GetAllFiles(string directory, params string[] types) {   if (!Directory.Exists(directory)) return new string[0];   string searchTypes = (types == null || types.Length == 0) ? "*.*" : string.Join("|", types);   string[] names = Directory.GetFiles(directory, searchTypes, SearchOption.AllDirectories);   return names;  } }

LoadTest.cs

using UnityEngine; using UnityEngine.SceneManagement; public class LoadTest : MonoBehaviour {  private void Start () {   LoadAB();   LoadScene();  }  // 加载资源包  private void LoadAB() {   // 资源包路径   string path = Application.streamingAssetsPath + "/Abs/test.ab";   // WWW下载   Http http = gameObject.AddComponent<Http>();   http.get(path, OnLoadABComplete);  }  // 加载场景  private void LoadScene() {   // 资源包路径   string path = Application.streamingAssetsPath + "/Abs/Test.scene";   // WWW下载   Http http = gameObject.AddComponent<Http>();   http.get(path, OnLoadSceneComplete);  }  // 加载AssetBundle完毕  private void OnLoadABComplete(WWW www) {   // 实例化预制   AssetBundle ab = www.assetBundle;   Object prefab = ab.LoadAsset("Test");   GameObject instance = (GameObject)Instantiate(prefab);   DontDestroyOnLoad(instance);  }  // 加载场景完毕  private void OnLoadSceneComplete(WWW www) {   // 必须写www.assetBundle这句 这样场景才能被读取到   AssetBundle ab = www.assetBundle;   SceneManager.LoadScene("Test");  } }

以上是“Unity C#如何打包AssetBundle”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI