UH3L3——生成AB包资源对比文件

分析需求

分析存放AB包的文件夹下哪些文件需要生成资源对比文件

image

  • 需要生成资源对比文件的只有没有后缀的AB包本身,
  • manifest文件是存储AB包依赖的,一般很少更新改变
  • meta文件是Unity对存储到Assets文件夹下的文件默认生成的设置配置信息,不需要关注

前置知识点

  • 文件读写操作:DirectoryInfo​、Directory​、FileInfo​
  • 编辑器菜单栏添加按钮:[MenuItem()]​

生成流程

  • 在菜单栏添加一个按钮,用于触发该功能
  • 遍历AB包文件夹,获取所有AB包文件消息,例如文件名,文件路径,文件长度,文件后缀名
  • 将AB包的文件名、大小、MD码存入到资源对比文件中,MD码的获取复用上节课实现的代码
    (文件名、大小、MD码之间用' '​分割,不同AB包资源消息之间用'|'​分割)

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEditor;
using UnityEngine;

public class CreateABCompare : MonoBehaviour
{
[MenuItem("AB包工具/创建对比文件")]
public static void CreateABCompareFile()
{
DirectoryInfo directory = new DirectoryInfo(Application.dataPath + "/ArtRes/AB/PC/");
FileInfo[] fileInfos = directory.GetFiles();
string abCompareInfo = "";
foreach (FileInfo info in fileInfos)
{
//检查后缀,没有后缀的,才是AB包,我们只需要AB包的消息
if (info.Extension == "")
{
//拼接一个AB包的消息
abCompareInfo += info.Name + " " + info.Length + " " + GetMD5(info.FullName);
//用分隔符分开不同文件之间的消息
abCompareInfo += "|";
}
}
//删除最后一个"|"
abCompareInfo = abCompareInfo.Substring(0, abCompareInfo.Length - 1);
File.WriteAllText(Application.dataPath + "/ArtRes/AB/PC/ABCompareInfo.txt", abCompareInfo);
Debug.Log("AB包对比文件生成完毕!");
AssetDatabase.Refresh(); //刷新编辑器
}

private static string GetMD5(string filePath)
{
using (FileStream file = new FileStream(filePath, FileMode.Open))
{
//声明一个MD5对象,用于生成MD5码
MD5 md5 = new MD5CryptoServiceProvider();
//利用API得到数据的MD5码 16个字节的数组
byte[] md5Info = md5.ComputeHash(file);
//把16个字节转换为16进制 拼接成字符串,为了减小md5码的长度
StringBuilder sb = new StringBuilder();
file.Close();
for (int i = 0; i < md5Info.Length; i++)
//关于md5Info[i].ToString()内的参数,如果传入X2就是大写的16进制,x2就是小写的
sb.Append(md5Info[i].ToString("x2"));
return sb.ToString();
}
}
}