339 lines
12 KiB
C#
339 lines
12 KiB
C#
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";
|
||
// }
|
||
// }
|
||
}
|
||
}
|
||
} |