Unity C#打包AssetBundle与场景详解
作者:冰封百度 发布时间:2022-02-19 14:04:13
标签:unity,c#,assetbundle
Unity2018已经把打包过程简化很多了
我们只需要关心两个API:
1.BuildPipline.BuildAssetBundles()
打包AssetBundle
2.BuildPipline.BuildPlayer()
打包场景
1.打包AssetBundle
先在资源的Inspector面板最下方 填写资源所属的AssetBundle名称和后缀(后缀可以不填)
再利用BuildPipeline.BuildAssetBundles()
进行打包
2.打包Scene
利用BuildPipeline.BuildPlayer()
进行打包
为方便使用 先把要打包的场景放入指定的文件夹 通过脚本批量打包
3.脚本批量打包
4.打包完毕
5.加载测试
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


猜你喜欢
- 1.kotlin的字符串操作和Java有些不同,有些新增。1)先看字符串比较java中==比较的是变量的引用是否指向同一个地址,Kotlin
- Java(和其他语言)通过内部类支持嵌套类。要使其正常工作,需要编译器执行一些技巧。这是一个例子:public class Outer {
- 本文实例讲述了Android实现给TableLayou绘制边框的方法。分享给大家供大家参考,具体如下:效果如下:思路:使用share作为背景
- 本文实例为大家分享了java实现猜数字小游戏的具体代码,供大家参考,具体内容如下介绍:电脑随机生成一个1-100的随机数,用户输入一个数;电
- java加载properties文件的六种方法总结java加载properties文件的六中基本方式实现java加载properties文件
- 微信小程序 navigator 跳转url传递参数使用方法说明(1)传值:在navigator的属性url后拼接?id(参数名字
- 一、final概述子类可以在父类的基础上改写父类内容,比如,方法重写。那么我们能不能随意的继承API中提供的类,改写其内容呢?显然这是不合适
- 前言需求是上传Excel文件并读取Excel文件中的内容,根据获取的数据执行完某些业务操作后再将一些数据写回到excel中。前台使用Form
- BeanFactory接口:IoC容器的顶级接口,是IoC容器的最基础实现,也是访问Spring容器的根接口,负责对bean的创建,访问等工
- SpringBoot2底层注解一、@ImportResource@Conditional注解,是根据条件进行装配。满足了 Condition
- 一、利用距离感应器监听听筒靠近耳朵事件准确的说距离感应器并不能监听到你是否把手机靠近耳朵,也许是你用手挡在了距离感应器前面,但这不是我们关心
- protobuf对象不能直接使用jsonlib去转,因为protobuf生成的对象的get方法返回的类型有byte[],而只有String类
- 1.预警需求为了更好的管理商品日期,需要对仓库的商品进行预警管理,对商品的保质期控制在一个范围内提示出来,也可以通过该功能间接的展示出一个商
- InputStreamReader和OutputStreamWriter源码分析1. InputStreamReader 源码(基于jdk1
- 一、pom.xml<dependency> <groupId>net.sf.ehcache
- 本文以实例形式讲述了C#通过反射创建自定义泛型的实现方法,分享给大家供大家参考。具体如下:比如有这样一个泛型:Demo.GenericsSi
- 在mybatis中sql是写在xml映射文件中的,如果sql中有一些特殊字符的话,在解析xml文件的时候就会被转义,如若不希望被转义,那该怎
- 在定义一个Rest接口时通常会利用GET、POST、PUT、DELETE来实现数据的增删改查;这几种方式有的需要传递参数,后台开发人员必须对
- jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过
- 在Android开发中,经常会遇到这样一种情况,即需要将用户偏好设置(如用户偏好的app色彩主题)、与特定登录用户相关的设置(如不同登陆用户