【游戏技术群】959392658  【游戏出海群】12067810
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2377

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1780|回复: 10

[薛飞] Unity极简网络游戏之客户端资源打包工具

[复制链接]  [移动端链接]
排名
495
昨日变化
2

17

主题

190

帖子

3571

积分

Rank: 9Rank: 9Rank: 9

UID
686
好友
13
蛮牛币
4741
威望
0
注册时间
2013-7-4
在线时间
1444 小时
最后登录
2018-12-18

专栏作家社区QQ达人

QQ
发表于 2018-6-4 15:38:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
项目地址 https://gitee.com/awnuxcvbn/Ganghood
这个资源打包工具写的也是……极简的……

资源打包工具

资源打包工具



[C#] 纯文本查看 复制代码
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Collections.Generic;
using System;

/// <summary>
/// 资源打包工具窗口
/// </summary>
public class ResBuildWindow : EditorWindow
{
    static ResBuildWindow buildWindow;

    /// <summary>
    /// 资源平台列表
    /// </summary>
    static List<string> platformStrings = new List<string>();
    /// <summary>
    /// 当前资源平台索引
    /// </summary>
    static int nowPlatformIndex = 0;

    /// <summary>
    /// 是否处于焦点状态
    /// </summary>
    static bool isFocused = false;
    /// <summary>
    /// 数据是否加载
    /// </summary>
    static bool isLoadData = false;

    /// <summary>
    /// 预制体路径
    /// </summary>
    static string prefabPath;

    /// <summary>
    /// ab文件的根目录
    /// </summary>
    static string abPathRoot;

    /// <summary>
    /// AB文件路径
    /// </summary>        
    static string abPath;

    [MenuItem("工具/资源打包工具")]
    static void Init()
    {
        buildWindow = (ResBuildWindow)EditorWindow.GetWindow(typeof(ResBuildWindow), false, "打包工具", true);
        buildWindow.Show();
        LoadData();
    }

    /// <summary>
    /// 获得焦点
    /// </summary>
    private void OnFocus()
    {
        isFocused = true;
        if (!isLoadData)
        {
            LoadData();
        }
    }

    /// <summary>
    /// 丢失焦点
    /// </summary>
    private void OnLostFocus()
    {
        isFocused = false;
        isLoadData = false;
    }

    /// <summary>
    /// 加载数据
    /// </summary>
    static void LoadData()
    {
        prefabPath = Application.dataPath + "/Resources/UIPrefabs";
        abPathRoot = Application.persistentDataPath + "/AB/";

        if (Directory.Exists(abPathRoot))
        {
            Directory.CreateDirectory(abPathRoot);
        }

        platformStrings.Clear();
        platformStrings.Add(BuildTarget.Android.ToString());
        platformStrings.Add(BuildTarget.iOS.ToString());
        platformStrings.Add(BuildTarget.StandaloneWindows.ToString());
        platformStrings.Add(BuildTarget.WebGL.ToString());
        //platformStrings.Add(BuildTarget.StandaloneOSXUniversal.ToString()); 

        isLoadData = true;
    }

    void OnGUI()
    {
        if (!isFocused)
        {
            return;
        }

        EditorGUILayout.Space();
        if (GUILayout.Button("设置资源的AB名"))
        {
            SetAllAbNames();
        }
        EditorGUILayout.Space();

        if (GUILayout.Button("打印所有的AB包名字"))
        {
            PrintABsNames();
        }

        EditorGUILayout.Space();
        if (GUILayout.Button("清除所有AB包的名字"))
        {
            ClearABsName();
        }

        EditorGUILayout.Space();
        EditorGUILayout.Space();
        GUILayout.Label("选择打包平台");
        nowPlatformIndex = GUILayout.Toolbar(nowPlatformIndex, platformStrings.ToArray());
        EditorGUILayout.Space();

        if (GUILayout.Button("打包所选平台资源"))
        {
            EditorUtility.DisplayProgressBar("打包所选平台资源", "打包所选平台资源", 0);
            BuildTarget bt = (BuildTarget)Enum.Parse(typeof(BuildTarget), platformStrings[nowPlatformIndex]);
            string abPath = abPathRoot + GetPlatformName(bt) + "/";
            if (!Directory.Exists(abPath))
            {
                Directory.CreateDirectory(abPath);
            }
            DirectoryInfo di = new DirectoryInfo(abPath);
            foreach (FileInfo fi in di.GetFiles())
            {
                fi.Delete();
            }
            //BuildAssetBundleOptions 
            BuildPipeline.BuildAssetBundles(abPath, BuildAssetBundleOptions.None, bt);
            CreateABMD5List.Execute(abPath);
            EditorUtility.ClearProgressBar();
        }

        EditorGUILayout.Space();
        if (GUILayout.Button("打包所有平台资源"))
        {
            EditorUtility.DisplayProgressBar("打包所有平台资源", "打包所有平台资源", 0);
            for (int i = 0; i < platformStrings.Count; i++)
            {
                BuildTarget bt = (BuildTarget)Enum.Parse(typeof(BuildTarget), platformStrings[i]);
                string abPath = abPathRoot + GetPlatformName(bt) + "/";
                if (!Directory.Exists(abPath))
                {
                    Directory.CreateDirectory(abPath);
                }
                DirectoryInfo di = new DirectoryInfo(abPath);
                foreach (FileInfo fi in di.GetFiles())
                {
                    fi.Delete();
                }
                BuildPipeline.BuildAssetBundles(abPath, BuildAssetBundleOptions.None, bt);
                CreateABMD5List.Execute(abPath);
            }
            EditorUtility.ClearProgressBar();
        }
        EditorGUILayout.Space();
    }

    /// <summary>
    /// 设置资源的AB名,这里可以处理资源文件的依赖关系,比如可以把一个文件的图片打成一个ab包,各种别的选择……
    /// </summary>
    void SetAllAbNames()
    {
        EditorUtility.DisplayProgressBar("设置预制的AB名", "设置预制的AB名", 0);

        DirectoryInfo folder = new DirectoryInfo(prefabPath);

        foreach (FileInfo file in folder.GetFiles("*.prefab"))
        {
            AssetImporter importer = AssetImporter.GetAtPath("Assets/Resources/UIPrefabs/" + file.Name);
            //设置ab名
            importer.assetBundleName = Util.GetFileRealName(file.Name.ToLower());
            //设置ab文件的后缀
            importer.assetBundleVariant = "t";
        }
        AssetDatabase.Refresh();
        EditorUtility.ClearProgressBar();
    }

    /// <summary>
    /// 打印所有的AB包名字
    /// </summary>
    void PrintABsNames()
    {
        EditorUtility.DisplayProgressBar("打印所有的AB包名字", "打印所有的AB包名字", 0);
        //获取所有设置的AssetBundle 
        string[] names = AssetDatabase.GetAllAssetBundleNames();
        foreach (string name in names)
        {
            Debug.Log("AB名: " + name);
        }
        AssetDatabase.Refresh();
        EditorUtility.ClearProgressBar();
    }

    /// <summary>
    /// 清除所有AB包的名字
    /// </summary>
    void ClearABsName()
    {
        EditorUtility.DisplayProgressBar("清除", "清除所有AB包的名字", 0);
        string[] ABsNames = AssetDatabase.GetAllAssetBundleNames();
        for (int j = 0; j < ABsNames.Length; j++)
        {
            AssetDatabase.RemoveAssetBundleName(ABsNames[j], true);
        }
        //刷新资源
        AssetDatabase.Refresh();
        EditorUtility.ClearProgressBar();
    }
     
    /// <summary>
    /// 获取平台名
    /// </summary>
    /// <param name="bt"></param>
    /// <returns></returns>
    private static string GetPlatformName(BuildTarget bt)
    {
        switch (bt)
        {
            case BuildTarget.Android:
            case BuildTarget.iOS:
                return bt.ToString();
            case BuildTarget.StandaloneWindows:
            case BuildTarget.StandaloneWindows64:
                return "Windows";
            case BuildTarget.WebGL:
                return "WebGL";
            case BuildTarget.StandaloneOSXIntel:
            case BuildTarget.StandaloneOSXIntel64:
            case BuildTarget.StandaloneOSXUniversal:
                return "OSX";
            default:
                Debug.LogError("不支持的打包渠道");
                return "";
        }
    }
}



[C#] 纯文本查看 复制代码
using UnityEditor;
using System.IO;
using System.Xml;
using System.Collections.Generic;
using System;
using UnityEngine;
/// <summary>
/// 创建AB文件的列表xml
/// </summary>
public class CreateABMD5List
{
    public static void Execute(BuildTarget target)
    {
        Execute(target);
        AssetDatabase.Refresh();
    }

    public static void Execute(string path)
    {
        VersionInfo versionInfo = new VersionInfo();
        versionInfo.content = new List<UpdateContent>();
        DirectoryInfo folder = new DirectoryInfo(path);

        foreach (FileInfo file in folder.GetFiles())
        {
            //if (file.Name.Contains("Android")|| file.Name.Contains("iOS")|| file.Name.Contains("Win"))
            //{
            //    File.Delete(file.FullName);
            //    continue;
            //}
            //if (file.Name.Contains(".manifest"))
            //{
            //    File.Delete(file.FullName);
            //    continue;
            //}
            if (file.Name.Contains(".DS_Store") || file.Name.Contains(".meta") || file.Name.Contains(".txt"))
            {
                continue;
            }
            if (!Path.GetFileName(file.FullName).Contains("."))
            {

                file.MoveTo(file.FullName + ".t");
            }

            UpdateContent ui = new UpdateContent();
            ui.name = Path.GetFileName(file.FullName);
            ui.md5 = Util.GetFileMD5(file.FullName);
            versionInfo.content.Add(ui);
        }
        // 删除前一版的old数据
        if (File.Exists(path + "/VersionMD5-old.txt"))
        {
            File.Delete(path + "/VersionMD5-old.txt");
        }

        // 如果之前的版本存在,则将其名字改为VersionMD5-old.txt
        if (File.Exists(path + "/VersionMD5.txt"))
        {
            File.Move(path + "/VersionMD5.txt", path + "/VersionMD5-old.txt");
        }

        // 读取旧版本的MD5
        VersionInfo oldVersionInfo = ReadMD5File(path + "/VersionMD5-old.txt");

        if (File.Exists(path + "/VersionMD5-old.txt"))
        {
            File.Delete(path + "/VersionMD5-old.txt");
        }

        XmlDocument XmlDoc = new XmlDocument();
        XmlElement XmlRoot = XmlDoc.CreateElement("Files");
        XmlDoc.AppendChild(XmlRoot);

        XmlElement ver = XmlDoc.CreateElement("Version");
        XmlRoot.AppendChild(ver);
        if (oldVersionInfo.version > 0)
        {
            ver.SetAttribute("code", oldVersionInfo.version + 1 + "");
        }
        else
        {
            ver.SetAttribute("code", 1 + "");
        }

        for (int i = 0; i < versionInfo.content.Count; i++)
        {
            XmlElement xmlElem = XmlDoc.CreateElement("File");
            XmlRoot.AppendChild(xmlElem);

            xmlElem.SetAttribute("name", versionInfo.content[i].name);
            xmlElem.SetAttribute("md5", versionInfo.content[i].md5);
        }


        //oldVersionInfo中有,而versionInfo中没有的信息,手动添加到versionInfo
        foreach (UpdateContent oui in oldVersionInfo.content)
        {
            if (!versionInfo.content.Contains(oui))
            {
                versionInfo.content.Add(oui);
            }
        }
        XmlDoc.Save(path + "/VersionMD5.txt");
        XmlDoc = null;
    }
    /// <summary>
    /// 读取文件md5列表
    /// </summary>
    /// <param name="fileName"></param>
    /// <returns></returns>
    public static VersionInfo ReadMD5File(string fileName)
    {
        VersionInfo versionInfo = new VersionInfo();
        versionInfo.content = new List<UpdateContent>();
        versionInfo.version = 0;
        try
        { 
            // 如果文件不存在,则直接返回
            if (File.Exists(fileName) == false)
            {
                return versionInfo;
            }
            XmlDocument XmlDoc = new XmlDocument();
            XmlDoc.Load(fileName);
            XmlElement XmlRoot = XmlDoc.DocumentElement;

            foreach (XmlNode node in XmlRoot.ChildNodes)
            {
                //Debug.Log("node.Name:" + node.Name);
                if (node.Name == "File")
                {
                    if ((node is XmlElement) == false)
                    {
                        continue;
                    }
                    UpdateContent ui = new UpdateContent();
                    ui.name = (node as XmlElement).GetAttribute("name");
                    ui.md5 = (node as XmlElement).GetAttribute("md5");
                    versionInfo.content.Add(ui);
                }
                else
                {
                    versionInfo.version = Convert.ToInt32((node as XmlElement).GetAttribute("code"));
                }
            }

            XmlRoot = null;
            XmlDoc = null;
        }
        catch (Exception e)
        {
            Debug.LogError(e.ToString());
        }
        return versionInfo;
    }

    /// <summary>
    /// 更新的版本信息
    /// </summary>
    public struct VersionInfo
    {
        /// <summary>
        /// 版本号
        /// </summary>
        public int version;
        /// <summary>
        /// 更新的内容
        /// </summary>
        public List<UpdateContent> content;
    }

    /// <summary>
    /// 更新内容信息
    /// </summary>
    public struct UpdateContent
    {
        /// <summary>
        /// 名称
        /// </summary>
        public string name;
        /// <summary>
        /// md5
        /// </summary>
        public string md5;
    }
}



回复

使用道具 举报

排名
34128
昨日变化
34

0

主题

17

帖子

30

积分

Rank: 1

UID
283608
好友
0
蛮牛币
45
威望
0
注册时间
2018-5-31
在线时间
5 小时
最后登录
2018-6-6
发表于 2018-6-4 17:14:00 | 显示全部楼层
================

回复 支持 反对

使用道具 举报

排名
34128
昨日变化
34

0

主题

17

帖子

30

积分

Rank: 1

UID
283608
好友
0
蛮牛币
45
威望
0
注册时间
2018-5-31
在线时间
5 小时
最后登录
2018-6-6
发表于 2018-6-4 17:15:06 | 显示全部楼层
=========================

回复 支持 反对

使用道具 举报

7日久生情
1589/5000
排名
1437
昨日变化
1

0

主题

468

帖子

1589

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
87577
好友
0
蛮牛币
5366
威望
0
注册时间
2015-3-31
在线时间
271 小时
最后登录
2018-12-16

锦衣玉食

发表于 2018-6-5 08:25:54 | 显示全部楼层
too good too strong!

回复 支持 反对

使用道具 举报

7日久生情
1833/5000
排名
2236
昨日变化
5

5

主题

722

帖子

1833

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
239879
好友
1
蛮牛币
3982
威望
0
注册时间
2017-8-26
在线时间
498 小时
最后登录
2018-12-19
发表于 2018-6-5 09:44:05 | 显示全部楼层

回复

使用道具 举报

7日久生情
1659/5000
排名
3071
昨日变化
1

4

主题

875

帖子

1659

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
246489
好友
1
蛮牛币
2701
威望
0
注册时间
2017-9-28
在线时间
316 小时
最后登录
2018-11-23

活力之星

发表于 2018-6-5 10:26:52 | 显示全部楼层
look look look

回复

使用道具 举报

7日久生情
3439/5000
排名
1695
昨日变化
3

0

主题

2127

帖子

3439

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219676
好友
1
蛮牛币
2643
威望
0
注册时间
2017-7-12
在线时间
560 小时
最后登录
2018-12-18

活力之星

发表于 2018-6-5 10:28:05 | 显示全部楼层
谢谢分享

回复

使用道具 举报

4四处流浪
493/500
排名
7020
昨日变化
6

0

主题

166

帖子

493

积分

Rank: 4

UID
243107
好友
0
蛮牛币
604
威望
0
注册时间
2017-9-13
在线时间
147 小时
最后登录
2018-12-10
发表于 2018-6-5 10:54:36 | 显示全部楼层

回复

使用道具 举报

4四处流浪
334/500
排名
11226
昨日变化
4

0

主题

199

帖子

334

积分

Rank: 4

UID
251531
好友
0
蛮牛币
459
威望
0
注册时间
2017-10-30
在线时间
49 小时
最后登录
2018-12-15
发表于 2018-6-5 11:20:19 | 显示全部楼层
还行。赞个666666666666666666666

回复 支持 反对

使用道具 举报

5熟悉之中
921/1000
排名
4509
昨日变化

4

主题

268

帖子

921

积分

Rank: 5Rank: 5

UID
268047
好友
0
蛮牛币
2094
威望
0
注册时间
2018-2-7
在线时间
327 小时
最后登录
2018-11-15
发表于 2018-6-5 12:24:52 | 显示全部楼层
谢谢分享!!!!!!!!!!

回复

使用道具 举报

7日久生情
3761/5000
排名
2021
昨日变化
8

0

主题

2676

帖子

3761

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185339
好友
1
蛮牛币
4597
威望
0
注册时间
2016-11-20
在线时间
429 小时
最后登录
2018-12-18
发表于 2018-6-6 09:32:48 | 显示全部楼层

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表