YooAsset/Assets/Samples~/ExtensionSample/Scripts/Editor/PatchImportWindow.cs

110 lines
3.5 KiB
C#

using System.IO;
using UnityEngine;
using UnityEditor;
namespace YooAsset.Editor
{
public class PatchImportWindow : EditorWindow
{
static PatchImportWindow _thisInstance;
[MenuItem("YooAsset/补丁包导入工具", false, 301)]
static void ShowWindow()
{
if (_thisInstance == null)
{
_thisInstance = EditorWindow.GetWindow(typeof(PatchImportWindow), false, "补丁包导入工具", true) as PatchImportWindow;
_thisInstance.minSize = new Vector2(800, 600);
}
_thisInstance.Show();
}
private string _patchManifestPath = string.Empty;
private void OnGUI()
{
GUILayout.Space(10);
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("选择补丁包", GUILayout.MaxWidth(150)))
{
string resultPath = EditorUtility.OpenFilePanel("Find", "Assets/", "bytes");
if (string.IsNullOrEmpty(resultPath))
return;
_patchManifestPath = resultPath;
}
EditorGUILayout.LabelField(_patchManifestPath);
EditorGUILayout.EndHorizontal();
if (string.IsNullOrEmpty(_patchManifestPath) == false)
{
if (GUILayout.Button("导入补丁包(内置文件)", GUILayout.MaxWidth(150)))
{
AssetBundleBuilderHelper.ClearStreamingAssetsFolder();
CopyPatchFiles(_patchManifestPath, false);
}
if (GUILayout.Button("导入补丁包(全部文件)", GUILayout.MaxWidth(150)))
{
AssetBundleBuilderHelper.ClearStreamingAssetsFolder();
CopyPatchFiles(_patchManifestPath, true);
}
}
}
private void CopyPatchFiles(string patchManifestFilePath, bool allPatchFile)
{
string manifestFileName = Path.GetFileNameWithoutExtension(patchManifestFilePath);
string outputDirectory = Path.GetDirectoryName(patchManifestFilePath);
// 加载补丁清单
string jsonData = FileUtility.ReadFile(patchManifestFilePath);
PatchManifest patchManifest = PatchManifest.Deserialize(jsonData);
// 拷贝核心文件
{
string sourcePath = $"{outputDirectory}/{manifestFileName}.bytes";
string destPath = $"{AssetBundleBuilderHelper.GetStreamingAssetsFolderPath()}/{manifestFileName}.bytes";
EditorTools.CopyFile(sourcePath, destPath, true);
}
{
string sourcePath = $"{outputDirectory}/{manifestFileName}.hash";
string destPath = $"{AssetBundleBuilderHelper.GetStreamingAssetsFolderPath()}/{manifestFileName}.hash";
EditorTools.CopyFile(sourcePath, destPath, true);
}
{
string sourcePath = $"{outputDirectory}/{YooAssetSettings.VersionFileName}";
string destPath = $"{AssetBundleBuilderHelper.GetStreamingAssetsFolderPath()}/{YooAssetSettings.VersionFileName}";
EditorTools.CopyFile(sourcePath, destPath, true);
}
// 拷贝文件列表
int fileCount = 0;
if (allPatchFile)
{
foreach (var patchBundle in patchManifest.BundleList)
{
fileCount++;
string sourcePath = $"{outputDirectory}/{patchBundle.Hash}";
string destPath = $"{AssetBundleBuilderHelper.GetStreamingAssetsFolderPath()}/{patchBundle.Hash}";
EditorTools.CopyFile(sourcePath, destPath, true);
}
}
else
{
foreach (var patchBundle in patchManifest.BundleList)
{
if (patchBundle.IsBuildin == false)
continue;
fileCount++;
string sourcePath = $"{outputDirectory}/{patchBundle.Hash}";
string destPath = $"{AssetBundleBuilderHelper.GetStreamingAssetsFolderPath()}/{patchBundle.Hash}";
EditorTools.CopyFile(sourcePath, destPath, true);
}
}
Debug.Log($"补丁包拷贝完成,一共拷贝了{fileCount}个资源文件");
AssetDatabase.Refresh();
}
}
}