• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

LuaFramework-打包AssetBundle工具

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2018/1203/219.html

LuaFramework-打包AssetBundle工具

 

下面我们常州微信公众平台开发网站达人-幻天网络给大家介绍luaframework的打包,前提是大家要了解assetbundle的热更原理和流程,把prefab打包成.asset格式作为传输的数据。

using UnityEngine;

using System.Collections.Generic;

using UnityEditor;

using System.IO;

using System.Text;

public enum SuffixEnum

{

    Prefab,

    Png,

    Csv,

    Txt,

}

public class AddBuildMapUtility : EditorWindow

{

    int count = 0;

    List<string> bundleNameList = new List<string>();

    List<SuffixEnum> suffixList = new List<SuffixEnum>();

    List<string> pathList = new List<string>();

    Vector2 scrollValue = Vector2.zero;

    [MenuItem("LuaFramework/AddBuildMapUtility")]

    static void SetAssetBundleNameExtension()

    {

        EditorWindow.GetWindow<AddBuildMapUtility>();

    }

    void OnGUI()

    {

        EditorGUILayout.BeginHorizontal();

        if (GUILayout.Button("添加一项"))

        {

            AddItem();

        }

        if (GUILayout.Button("清除所有项"))

        {

            Clear();

        }

        if (GUILayout.Button("读取文件(.csv)"))

        {

            Clear();

            string path = EditorUtility.OpenFilePanel("", Application.dataPath, "csv");

            string content = File.ReadAllText(path);

            string[] contents = content.Split(new string[] { "\r\n" }, System.StringSplitOptions.RemoveEmptyEntries);

            for (int i = 0; i < contents.Length; i++)

            {

                string[] a = contents[i].Split(',');

                AddItem(a[0], StringToEnum(a[1]), a[2]);

            }

        }

        if (GUILayout.Button("保存"))

        {

            string path = EditorUtility.SaveFilePanel("", Application.dataPath, "AssetBundleInfo", "csv");

            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < count; i++)

            {

                if (string.IsNullOrEmpty(bundleNameList[i])) break;

                sb.Append(bundleNameList[i] + ",");

                sb.Append(EnumToString(suffixList[i]) + ",");

                sb.Append(pathList[i] + "\r\n");

            }

            File.WriteAllText(path, sb.ToString());

            AssetDatabase.Refresh();

        }

        if (GUILayout.Button("自动填写(所有选中的)"))

        {

            int startIndex = count;

            for (int i = 0; i < Selection.objects.Length; i++)

            {

                AddItem();

                AutoFill(startIndex, Selection.objects[i]);

                startIndex++;

            }

        }

        EditorGUILayout.EndHorizontal();

        EditorGUILayout.LabelField("注意:请以文件夹为单位进行选择!!!文件夹名即为包名!!!");

        scrollValue = EditorGUILayout.BeginScrollView(scrollValue);

        for (int i = 0; i < count; i++)

        {

            EditorGUILayout.BeginVertical();

            EditorGUILayout.BeginHorizontal();

            EditorGUILayout.LabelField(i.ToString() + "AB包名");

            bundleNameList[i] = EditorGUILayout.TextField("", bundleNameList[i]);

            suffixList[i] = (SuffixEnum)EditorGUILayout.EnumPopup("类型", suffixList[i]);

            pathList[i] = EditorGUILayout.TextField("路径", pathList[i]);

            if (GUILayout.Button("自动填写(单个)"))

            {

                AutoFill(i, Selection.objects[0]);

            }

            if (GUILayout.Button("输出路径"))

            {

                Debug.Log(pathList[i]);

            }

            if (GUILayout.Button("删除该项"))

            {

                RemoveItem(i);

            }

            EditorGUILayout.EndHorizontal();

            EditorGUILayout.EndVertical();

        }

        EditorGUILayout.EndScrollView();

    }

    void Clear()

    {

        count = 0;

        bundleNameList = new List<string>();

        suffixList = new List<SuffixEnum>();

        pathList = new List<string>();

    }

    void AddItem(string bundleName = "", SuffixEnum suffix = SuffixEnum.Prefab, string path = "")

    {

        count++;

        bundleNameList.Add(bundleName);

        suffixList.Add(suffix);

        pathList.Add(path);

    }

    void RemoveItem(int index)

    {

        count--;

        bundleNameList.Remove(bundleNameList[index]);

        suffixList.Remove(suffixList[index]);

        pathList.Remove(pathList[index]);

    }

    void AutoFill(int index, Object selectedObject)

    {

        string path = AssetDatabase.GetAssetPath(selectedObject);

        bundleNameList[index] = path.Remove(0, path.LastIndexOf("/") + 1).ToLower() + LuaFramework.AppConst.ExtName;

        string[] files = Directory.GetFiles(path);

        string[] temp = files[0].Split('.');

        suffixList[index] = StringToEnum("*." + temp[1]);

        pathList[index] = path;

    }

    public static string EnumToString(SuffixEnum se)

    {

        switch (se)

        {

            case SuffixEnum.Prefab:

                return "*.prefab";

            case SuffixEnum.Png:

                return "*.png";

            case SuffixEnum.Csv:

                return "*.csv";

            case SuffixEnum.Txt:

                return "*.txt";

            default:

                return "null";

        }

    }

    public static SuffixEnum StringToEnum(string s)

    {

        switch (s)

        {

            case "*.prefab":

                return SuffixEnum.Prefab;

            case "*.png":

                return SuffixEnum.Png;

            case "*.csv":

                return SuffixEnum.Csv;

            case "*.txt":

                return SuffixEnum.Txt;

            default:

                return SuffixEnum.Prefab;

        }

    }

}

 

 

修改Packager.cs的HandleExampleBundle()

   /// <summary>

    /// 处理框架实例包

    /// </summary>

    static void HandleExampleBundle() {

        string resPath = AppDataPath + "/" + AppConst.AssetDir + "/";

        if (!Directory.Exists(resPath)) Directory.CreateDirectory(resPath);

        //AddBuildMap("prompt" + AppConst.ExtName, "*.prefab", "Assets/LuaFramework/Examples/Builds/Prompt");

        //AddBuildMap("message" + AppConst.ExtName, "*.prefab", "Assets/LuaFramework/Examples/Builds/Message");

        //AddBuildMap("prompt_asset" + AppConst.ExtName, "*.png", "Assets/LuaFramework/Examples/Textures/Prompt");

        //AddBuildMap("shared_asset" + AppConst.ExtName, "*.png", "Assets/LuaFramework/Examples/Textures/Shared");

        string content = File.ReadAllText(Application.dataPath + "/AssetBundleInfo.csv");

        string[] contents = content.Split(new string[] { "\r\n" }, System.StringSplitOptions.RemoveEmptyEntries);

        for (int i = 0; i < contents.Length; i++)

        {

            string[] a = contents[i].Split(',');

            //UnityEngine.Debug.Log(a[0]); UnityEngine.Debug.Log(a[1]); UnityEngine.Debug.Log(a[2]);  

            AddBuildMap(a[0], a[1], a[2]);

        }

    }



上篇:上一篇:Unity客户端架构-PanelManager
下篇:下一篇:Unity3D通过脚本修改游戏对象图标Select Icon