152 lines
5.2 KiB
C#
152 lines
5.2 KiB
C#
// Assets/Editor/AssetBundleListGenerator.cs
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using UnityEditor;
|
||
using UnityEngine;
|
||
using Kill.Base;
|
||
|
||
public class AssetBundleListGenerator : EditorWindow
|
||
{
|
||
private string folderPath = "";
|
||
private string outputPath = "";
|
||
private string version = "1.0.0"; // 添加版本号字段
|
||
|
||
[MenuItem("Tools/AssetBundle/List Generator")]
|
||
public static void ShowWindow()
|
||
{
|
||
GetWindow<AssetBundleListGenerator>("AB List Generator");
|
||
}
|
||
|
||
void OnGUI()
|
||
{
|
||
GUILayout.Label("AssetBundle List Generator", EditorStyles.boldLabel);
|
||
|
||
EditorGUILayout.Space();
|
||
|
||
// 添加版本号输入字段
|
||
version = EditorGUILayout.TextField("Version", version);
|
||
|
||
EditorGUILayout.Space();
|
||
|
||
GUILayout.Label("选择包含.ab文件的目录:", EditorStyles.label);
|
||
EditorGUILayout.BeginHorizontal();
|
||
folderPath = EditorGUILayout.TextField("目录路径", folderPath);
|
||
if (GUILayout.Button("浏览", GUILayout.Width(60)))
|
||
{
|
||
string selectedPath = EditorUtility.OpenFolderPanel("选择.ab文件目录", "", "");
|
||
if (!string.IsNullOrEmpty(selectedPath))
|
||
{
|
||
folderPath = selectedPath;
|
||
}
|
||
}
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.Space();
|
||
|
||
GUILayout.Label("输出文件路径:", EditorStyles.label);
|
||
EditorGUILayout.BeginHorizontal();
|
||
outputPath = EditorGUILayout.TextField("JSON路径", outputPath);
|
||
if (GUILayout.Button("浏览", GUILayout.Width(60)))
|
||
{
|
||
string selectedPath = EditorUtility.SaveFilePanel("保存list.json", "", "list.json", "json");
|
||
if (!string.IsNullOrEmpty(selectedPath))
|
||
{
|
||
outputPath = selectedPath;
|
||
}
|
||
}
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.Space();
|
||
|
||
if (GUILayout.Button("生成List"))
|
||
{
|
||
if (!string.IsNullOrEmpty(folderPath) && Directory.Exists(folderPath))
|
||
{
|
||
if (string.IsNullOrEmpty(outputPath))
|
||
{
|
||
EditorUtility.DisplayDialog("错误", "请选择输出文件路径", "确定");
|
||
return;
|
||
}
|
||
|
||
GenerateAssetBundleList();
|
||
}
|
||
else
|
||
{
|
||
EditorUtility.DisplayDialog("错误", "请选择有效的目录路径", "确定");
|
||
}
|
||
}
|
||
}
|
||
|
||
private void GenerateAssetBundleList()
|
||
{
|
||
try
|
||
{
|
||
List<AssetBundleInfo> bundleInfos = new List<AssetBundleInfo>();
|
||
|
||
// 获取目录下所有.ab文件
|
||
string[] abFiles = Directory.GetFiles(folderPath, "*.ab", SearchOption.AllDirectories);
|
||
|
||
foreach (string filePath in abFiles)
|
||
{
|
||
FileInfo fileInfo = new FileInfo(filePath);
|
||
string fileName = Path.GetFileNameWithoutExtension(filePath);
|
||
|
||
// 创建AssetBundleInfo对象
|
||
AssetBundleInfo info = new AssetBundleInfo()
|
||
{
|
||
name = fileName,
|
||
size = fileInfo.Length,
|
||
md5 = GetMD5HashFromFile(filePath)
|
||
};
|
||
|
||
bundleInfos.Add(info);
|
||
}
|
||
|
||
// 创建包装类并设置版本号
|
||
AssetBundleInfoList infoList = new AssetBundleInfoList(bundleInfos)
|
||
{
|
||
version = version // 设置版本号
|
||
};
|
||
|
||
// 序列化为JSON
|
||
string jsonContent = JsonUtility.ToJson(infoList, true);
|
||
|
||
// 确保输出目录存在
|
||
string outputDirectory = Path.GetDirectoryName(outputPath);
|
||
if (!Directory.Exists(outputDirectory))
|
||
{
|
||
Directory.CreateDirectory(outputDirectory);
|
||
}
|
||
|
||
// 写入文件
|
||
File.WriteAllText(outputPath, jsonContent);
|
||
|
||
// 如果输出路径在Assets目录内,则刷新AssetDatabase
|
||
if (outputPath.Contains(Application.dataPath))
|
||
{
|
||
string assetPath = "Assets" + outputPath.Substring(Application.dataPath.Length);
|
||
AssetDatabase.ImportAsset(assetPath);
|
||
AssetDatabase.Refresh();
|
||
}
|
||
|
||
EditorUtility.DisplayDialog("成功", $"已生成list.json,共{bundleInfos.Count}个AssetBundle,版本号: {version}", "确定");
|
||
}
|
||
catch (System.Exception e)
|
||
{
|
||
EditorUtility.DisplayDialog("错误", $"生成过程中出现错误: {e.Message}", "确定");
|
||
Debug.LogError(e);
|
||
}
|
||
}
|
||
|
||
private string GetMD5HashFromFile(string filePath)
|
||
{
|
||
using (var md5 = System.Security.Cryptography.MD5.Create())
|
||
{
|
||
using (var stream = File.OpenRead(filePath))
|
||
{
|
||
byte[] hash = md5.ComputeHash(stream);
|
||
return System.BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
|
||
}
|
||
}
|
||
}
|
||
} |