Unity C#打包AssetBundle与场景详解

作者:冰封百度 时间:2022-02-19 14:04:13 

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");
}

}

来源:https://segmentfault.com/a/1190000018320573

标签:unity,c#,assetbundle
0
投稿

猜你喜欢

  • 简单了解java标识符的作用和命名规则

    2022-06-18 17:49:09
  • JavaFx实现拼图游戏

    2022-04-20 01:05:05
  • 基于@Bean修饰的方法参数的注入方式

    2022-09-16 06:45:14
  • Java8中stream和functional interface的配合使用详解

    2023-02-27 22:44:51
  • 浅谈Spring Boot 整合ActiveMQ的过程

    2022-03-22 05:20:27
  • Java中Collections.sort的使用

    2022-08-20 04:31:49
  • 初识MyBatis及基本配置和执行

    2021-11-12 05:53:40
  • Spring基于常用AspectJ切点表达式使用介绍

    2023-12-08 19:58:37
  • Maven打包jar包没有主属性问题解决方案

    2023-11-25 06:56:32
  • Android WebView使用的技巧与一些坑

    2022-10-18 12:57:23
  • Java对xls文件进行读写操作示例代码

    2023-08-04 17:55:31
  • Java建造者设计模式详解

    2022-09-19 13:14:11
  • idea中同一SpringBoot项目多端口启动

    2023-05-09 06:39:27
  • 详解Java中List的正确的删除方法

    2021-09-19 13:20:42
  • MyBatis-Plus工具使用之EntityWrapper解析

    2021-10-09 06:13:48
  • 解析SpringBoot整合SpringDataRedis的过程

    2022-07-05 06:45:37
  • 详解Kotlin和anko融合进行Android开发

    2021-08-15 19:34:16
  • MyBatis通用的10种写法总结大全

    2022-08-01 12:04:02
  • 深入Java Final

    2022-06-22 09:38:14
  • C#中标准的IDispose模式代码详解

    2022-03-27 01:40:05
  • asp之家 软件编程 m.aspxhome.com