2024-12-14 18:27:59 +08:00

339 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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";
// }
// }
}
}
}