Unity C# 打包AssetBundle与场景

冰封百度

转载请标明原文地址:https://segmentfault.com/a/11...

Unity2018已经把打包过程简化很多了
我们只需要关心1个API:
1.BuildPipline.BuildAssetBundles() 打包AssetBundle
2.BuildPipline.BuildPlayer() 打包场景 (场景可以打包进AssetBundle里动态加载 所以不推荐用这个API了)

1.打包AssetBundle
先在资源的Inspector面板最下方 填写资源所属的AssetBundle名称和后缀(后缀可以不填)
再利用BuildPipeline.BuildAssetBundles()进行打包
填写资源包名

2.打包Scene
(1)可以利用BuildPipline.BuildAssetBundles()进行打包。
注意:场景包内只能给.unity场景文件填写资源包名,不能给其他资源命名,否则打包会失败
一个场景ab包内可以包含多个场景文件,场景需要的资源会自动关联
有些资源是Editor下专用的。不会被打包进ab里 比如LightingData.asset
使用方式是www加载场景ab包后 先调用www.assetBundle 再调用SceneManager.LoadScene("name")
填写资源包名

(2)利用BuildPipeline.BuildPlayer()进行打包
为方便使用 先把要打包的场景放入指定的文件夹 通过脚本批量打包
推荐使用方法(1)打包

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>
/// <para>Blog:https://segmentfault.com/a/1190000018320573</para>
/// </summary>
public class AssetBundleBuilder {

    [MenuItem("批处理/打包AssetBundle")]
    private static void BuildAssetBundle() {
        BuildAssetBundles(CurrentBuildTarget);
    }

    // 打包AssetBundles
    private static void BuildAssetBundles(BuildTarget platform) {
        // 提示信息
        string msg = "当前平台:{0}\n输出路径:{1}";
        string output = Application.streamingAssetsPath + "/Abs";
        msg = string.Format(msg, platform.ToString(), output);
        if (EditorUtility.DisplayDialog("打包信息", msg, "确定", "取消")) {
            if (!Directory.Exists(output)) Directory.CreateDirectory(output);
            EditorUtility.DisplayProgressBar("信息", "打包资源包", 0f);
            BuildPipeline.BuildAssetBundles(output, BuildAssetBundleOptions.DeterministicAssetBundle, platform);
            AssetDatabase.Refresh();
            EditorUtility.DisplayDialog("提示", "打包AssetBundle完毕", "确定");
        }
    }

    // 当前平台
    private static BuildTarget CurrentBuildTarget {
        get {
            #if UNITY_STANDALONE
            return BuildTarget.StandaloneWindows;
            #elif UNITY_ANDROID
            return BuildTarget.Android;
            #elif UNITY_IPHONE
            return BuildTarget.iOS;
            #endif
        }
    }

}

LoadTest.cs

using UnityEngine;
using UnityEngine.SceneManagement;

/// <summary> 加载测试 </summary>
public class LoadTest : MonoBehaviour {

    private void Start () {
        LoadPrefab();
        LoadScene();
    }

    // 加载预制资源包
    private void LoadPrefab() {
        // 资源包路径
        string path = Application.streamingAssetsPath + "/Abs/test_prefab.ab";

        // WWW下载
        Http http = gameObject.AddComponent<Http>();
        http.get(path, OnLoadPrefabAbComplete);
    }

    // 加载场景资源包
    private void LoadScene() {
        // 资源包路径
        string path = Application.streamingAssetsPath + "/Abs/test_scene.ab";

        // WWW下载
        Http http = gameObject.AddComponent<Http>();
        http.get(path, OnLoadSceneAbComplete);
    }

    // 加载预制资源包完毕
    private void OnLoadPrefabAbComplete(WWW www) {
        // 实例化预制
        AssetBundle ab = www.assetBundle;
        Object prefab = ab.LoadAsset("Test");
        GameObject instance = (GameObject)Instantiate(prefab);
        DontDestroyOnLoad(instance);
    }

    // 加载场景资源包完毕
    private void OnLoadSceneAbComplete(WWW www) {
        // 必须写www.assetBundle这句 这样场景才能被读取到
        AssetBundle ab = www.assetBundle;
        SceneManager.LoadScene("Test", LoadSceneMode.Single);
    }

}

7.打包插件
官方插件Asset Bundle Browser里不但提供了资源包的浏览功能 也提供了资源包的打包功能
如果想详细、方便的了解打包参数 推荐使用该插件
打包插件
插件地址:https://assetstore.unity.com/...
图片描述

阅读 8.5k

冰封百度的学习笔记
程序生涯中的技术整理

Unity游戏程序员一枚。生命不息,学习不止。

193 声望
36 粉丝
0 条评论

Unity游戏程序员一枚。生命不息,学习不止。

193 声望
36 粉丝
文章目录
宣传栏