339 lines
12 KiB
C#
Raw Normal View History

2024-12-14 18:27:59 +08:00
using System;
using System.Linq;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;
namespace QFramework
{
public class ResKitView
{
private string mResVersion = "100";
private bool mEnableGenerateClass
{
get => EditorPrefs.GetBool(KEY_AUTOGENERATE_CLASS, false);
set => EditorPrefs.SetBool(KEY_AUTOGENERATE_CLASS, value);
}
private static bool mAppendHash
{
get => EditorPrefs.GetBool(KEY_APPEND_HASH, false);
set => EditorPrefs.SetBool(KEY_APPEND_HASH, value);
}
public static bool AppendHash => mAppendHash;
public static int GenerateClassNameStyle
{
get => EditorPrefs.GetInt(KEY_GENERATE_CLASS_NAME_STYLE, 0);
set => EditorPrefs.SetInt(KEY_GENERATE_CLASS_NAME_STYLE, value);
}
private const string KEY_QAssetBundleBuilder_RESVERSION = "KEY_QAssetBundleBuilder_RESVERSION";
public const string KEY_AUTOGENERATE_CLASS = "KEY_AUTOGENERATE_CLASS";
public const string KEY_APPEND_HASH = "KEY_APPEND_HASH";
public const string KEY_GENERATE_CLASS_NAME_STYLE = "KEY_GENERATE_CLASS_NAME_STYLE";
public void Init()
{
mResVersion = EditorPrefs.GetString(KEY_QAssetBundleBuilder_RESVERSION, "100");
}
private Vector2 mScrollViewPosition;
private readonly Lazy<GUIStyle> mMarkABStyle = new Lazy<GUIStyle>(() => new GUIStyle(GUI.skin.label)
{
fontSize = 15,
fontStyle = FontStyle.Bold
});
private string[] mBuildTargets = new string[]
{
"Windows/MacOS",
"iOS",
"Android",
"WebGL",
"WSAPlayer"
};
private readonly Lazy<GUIStyle> mResKitNameStyle = new Lazy<GUIStyle>(() => new GUIStyle(GUI.skin.label)
{
fontSize = 12
});
public EditorWindow EditorWindow { get; set; }
public const int GENERATE_NAME_STYLE_UPPERCASE = 0;
public const int GENERATE_NAME_STYLE_KeepOriginal = 1;
public void OnGUI()
{
GUILayout.Label(LocaleText.ResKit, mResKitNameStyle.Value);
GUILayout.BeginVertical();
GUILayout.BeginHorizontal("box");
GUILayout.Label(LocaleText.TargetPlatform, GUILayout.Width(100));
GUILayout.Label(AssetBundlePathHelper.GetPlatformName());
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal("box");
GUILayout.Label("PresistentPath:", GUILayout.Width(100));
GUILayout.Label(Application.persistentDataPath);
if (GUILayout.Button(LocaleText.Open, GUILayout.MaxWidth(100)))
{
EditorUtility.RevealInFinder(Application.persistentDataPath);
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
mEnableGenerateClass = GUILayout.Toggle(mEnableGenerateClass, LocaleText.AutoGenerateClass);
if (mEnableGenerateClass)
{
GUILayout.FlexibleSpace();
GenerateClassNameStyle =
EditorGUILayout.Popup(GenerateClassNameStyle, LocaleText.GenerateClassNameStyleItems);
}
GUILayout.EndHorizontal();
mAppendHash = GUILayout.Toggle(mAppendHash, LocaleText.AppendHash);
GUILayout.BeginHorizontal();
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
var index = ResKitEditorAPI.SimulationMode ? 0 : 1;
index = EditorGUILayout.Popup(index, LocaleText.ModeMenu, GUILayout.Width(100));
if (index != (ResKitEditorAPI.SimulationMode ? 0 : 1))
{
ResKitEditorAPI.SimulationMode = (index == 0);
}
if (ResKitEditorAPI.SimulationMode)
{
GUILayout.Label(LocaleText.SimulationModeDescription);
}
else
{
GUILayout.Label(LocaleText.DeviceModeDescription);
}
GUILayout.EndHorizontal();
// EasyIMGUI.Toggle()
// .Text(LocaleText.EncryptAB)
// .IsOn(GetConfig().EncryptAB)
// .Parent(verticalLayout)
// .ValueProperty.Bind(v => GetConfig().EncryptAB = v);
// var aesLine = EasyIMGUI.Horizontal();
// EasyIMGUI.Label().Text("AES秘钥:").Parent(aesLine).Width(100);
// EasyIMGUI.TextField().Text(GetConfig().AESKey).Parent(aesLine).Content.OnValueChanged.AddListener(_=>GetConfig().AESKey=_);
// aesLine.Parent(verticalLayout);
// EasyIMGUI.Toggle()
// .Text(LocaleText.EncryptKey)
// .IsOn(GetConfig().EncryptKey)
// .Parent(verticalLayout)
// .ValueProperty.Bind(v => GetConfig().EncryptKey = v);
GUILayout.BeginHorizontal();
mResVersion = EditorGUILayout.TextField(mResVersion);
GUILayout.EndHorizontal();
if (GUILayout.Button(LocaleText.GenerateClass))
{
BuildScript.WriteClass();
AssetDatabase.Refresh();
}
if (GUILayout.Button(LocaleText.Build))
{
EditorLifecycle.PushCommand(() =>
{
if (EditorWindow)
{
EditorWindow.Close();
}
ResKitEditorAPI.BuildAssetBundles();
//if (GetConfig().EncryptAB)
//{
// string key = GetConfig().EncryptKey ? RSA.RSAEncrypt("", GetConfig().AESKey): GetConfig().AESKey;
// BundleHotFix.EncryptAB(key);
//}
});
}
if (GUILayout.Button(LocaleText.ForceClear))
{
ResKitEditorAPI.ForceClearAssetBundles();
}
GUILayout.Space(10);
GUILayout.Label(LocaleText.MarkedAb, mMarkABStyle.Value);
mScrollViewPosition = GUILayout.BeginScrollView(mScrollViewPosition);
{
GUILayout.BeginVertical("box");
{
foreach (var n in AssetDatabase.GetAllAssetBundleNames()
.SelectMany(n =>
{
var result = AssetDatabase.GetAssetPathsFromAssetBundle(n);
return result.Select(r =>
{
if (ResKitAssetsMenu.Marked(r))
{
return r;
}
if (ResKitAssetsMenu.Marked(r.GetFolderPath()))
{
return r.GetFolderPath();
}
return null;
}).Where(r => r != null)
.Distinct();
}))
{
GUILayout.BeginHorizontal();
{
GUILayout.Label(n);
if (GUILayout.Button(LocaleText.Select, GUILayout.Width(50)))
{
Selection.objects = new[]
{
AssetDatabase.LoadAssetAtPath<Object>(n)
};
}
if (GUILayout.Button(LocaleText.CancelMark, GUILayout.Width(75)))
{
ResKitAssetsMenu.MarkAB(n);
// EditorLifecycle.PushCommand(() => { ReloadMarkedList(); });
}
}
GUILayout.EndHorizontal();
}
}
GUILayout.EndVertical();
}
GUILayout.EndScrollView();
GUILayout.EndVertical();
}
public void OnDispose()
{
EditorPrefs.SetString(KEY_QAssetBundleBuilder_RESVERSION, mResVersion);
}
public class LocaleText
{
public static bool IsCN => LocaleKitEditor.IsCN.Value;
public static string ResKit => IsCN ? "Res Kit 设置" : "Res Kit Setting";
public static string TargetPlatform => IsCN ? "目标平台: " : "Target Platform: ";
public static string Open => IsCN ? "打开" : "Open";
public static string GenerateClass => IsCN ? "生成代码(资源名常量)" : "Generate Class";
public static string Build => IsCN ? "打 AB 包" : "Build";
public static string ForceClear => IsCN ? "清空已生成的 AB" : "ForceClear";
public static string AutoGenerateClass => IsCN ? "打 AB 包时,自动生成资源名常量代码" : "auto generate class when build";
public static string AppendHash => IsCN ? "打 AB 包时,在后缀增加 hash (微信小游戏需要)" : "append hash when build";
private static string[] mGenerateClassNameStyleItemsCN = new string[]
{
"全大写UILoginPanel=>UILOGINPANEL",
"保持原名UILoginPanel=>UILoginPanel"
};
private static string[] mGenerateClassNameStyleItemsEN = new[]
{
"UPPERCASE(UILoginPanel=>UILOGINPANEL)",
"KeepOriginal(UILoginPanel=>UILoginPanel)"
};
public static string[] GenerateClassNameStyleItems =>
IsCN ? mGenerateClassNameStyleItemsCN : mGenerateClassNameStyleItemsEN;
private static string[] mModeMenuCN = new[]
{
"模拟模式",
"真机模式"
};
private static string[] mModeMenuEN = new[]
{
"SimulationMode",
"DeviceMode"
};
public static string[] ModeMenu => IsCN ? mModeMenuCN : mModeMenuEN;
public static string SimulationModeDescription =>
IsCN
? "不用主动调用 ResKit.Init 或 ResKit.InitAsync.每当资源修改时无需再打 AB 包,开发阶段建议选择"
: "Don't need to call ResKit.Init or ResKit.InitAsync.When Assets modified, don't need to build AB package";
public static string DeviceModeDescription =>
IsCN
? "每当资源修改时需要打 AB 包,需要在游戏运行后调用 ResKit.Init 或 ResKit.InitAsync在真机上只支持此模式"
: "Need call ResKit.Init or ResKit.InitAsync after game run.When Assets modified, need to build AB.Only this mode is supported on real machines";
public static string CancelMark =>
IsCN
? "取消标记"
: "Cancel Mark";
public static string Select =>
IsCN
? "选择"
: "Select";
public static string MarkedAb =>
IsCN
? "已标记的 AB"
: "Marked AB";
// public static string EncryptAB
// {
// get
// {
// return Language.IsChinese
// ? "加密AB(AES加密)"
// : "EncryptAB";
// }
// }
//
// public static string EncryptKey
// {
// get
// {
// return Language.IsChinese
// ? "加密秘钥(RSA加密)"
// : "EncryptKey";
// }
// }
}
}
}