Unity C# 打包AssetBundle与场景

Unity2018已经把打包过程简化很多了
我们只需要关心两个API:
1.BuildPipline.BuildAssetBundles() 打包AssetBundle
2.BuildPipline.BuildPlayer() 打包场景

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()进行打包
为方便使用 先把要打包的场景放入指定的文件夹 通过脚本批量打包
场景放入指定文件夹

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

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值