using System; using System.IO; using UnityEditor; using UnityEngine; using Object = UnityEngine.Object; namespace TyphoonFontTool { public class _Editor { public static string INIConfigPath = ".typhoon/FontTool/setting.ini"; //插件包根目录 public static string RootPath { get { var local = "Assets/xgame.unity.fonttool"; var upm = $"Packages/xgame.unity.fonttool"; if (File.Exists($"{local}/package.json")) { return local; } else if (File.Exists($"{upm}/package.json")) { return upm; } throw new Exception("识别不到xgame.unity.fonttool根目录"); } } //复制文件夹 public static void CopyFolder(string from, string to) { if (!Directory.Exists(to)) { Directory.CreateDirectory(to); } var info = new DirectoryInfo(from); var files = info.GetFiles("*", SearchOption.TopDirectoryOnly); var dir = info.GetDirectories("*", SearchOption.TopDirectoryOnly); foreach (var element in files) { var copyTo = $"{to}/{element.Name}"; File.Copy(element.FullName, copyTo, true); } foreach (var element in dir) { var copyDir = $"{to}/{element.Name}"; CopyFolder(element.FullName, copyDir); } } //转全路径 public static string UnityToFullPath(string path) { var result = Path.GetFullPath(path); return result.Replace("/", "\\"); } public static bool ShowMessageBox(string content, Action ok = null) { var click = EditorUtility.DisplayDialog("提示", content, "好的"); if (click) { ok?.Invoke(); } return click; } public static void Ping(Object obj, bool focusProjWindow = false) { if (focusProjWindow) { try { EditorApplication.ExecuteMenuItem("Window/General/Project"); } catch (Exception e) { } } EditorGUIUtility.PingObject(obj); } public static void Ping(string path, bool focusProjWindow = false) { Ping(AssetDatabase.LoadAssetAtPath(path), focusProjWindow); } public static void CreateDirectoryIfNotExists(string folder) { if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); AssetDatabase.Refresh(); } } public static void CreateFileDirectoryIfNotExists(string file) { var path = Path.GetDirectoryName(file); CreateDirectoryIfNotExists(path); } //生成内置fontSources public static void GenerateNotoSansSourceData() { //复制字体文件到指定目录 var source = $"{RootPath}/Fonts~"; var fontsFolder = $"Assets/Typhoon_Gen/FontTool/Fonts"; CopyFolder(source, fontsFolder); AssetDatabase.Refresh(); var guids = AssetDatabase.FindAssets("t:font", new[] { fontsFolder }); foreach (var guid in guids) { var path = AssetDatabase.GUIDToAssetPath(guid); var font = AssetDatabase.LoadAssetAtPath(path); var txt = $"{Path.GetDirectoryName(path)}/{Path.GetFileNameWithoutExtension(path)}.txt"; var info = AssetDatabase.LoadAssetAtPath(txt); if (font != null && info != null) { //生成FontSourcesData FontCharactersParser.CreateFontSourceData(font, info, true); } } //生成默认分组规则 var generalRule = $"Assets/Typhoon_Gen/FontTool/Editor/GroupingRules/GeneralRule.asset"; var rule = AssetDatabase.LoadAssetAtPath(generalRule); if (rule == null) { rule = ScriptableObject.CreateInstance(); //补充字体 var cjk = AssetDatabase.LoadAssetAtPath( $"Assets/Typhoon_Gen/FontTool/FontSourceData/FSD_NotoSansCJK.asset"); var noto_sans = AssetDatabase.LoadAssetAtPath( "Assets/Typhoon_Gen/FontTool/FontSourceData/FSD_NotoSans.asset"); var arabic = AssetDatabase.LoadAssetAtPath( "Assets/Typhoon_Gen/FontTool/FontSourceData/FSD_NotoSansArabic.asset"); var bengali = AssetDatabase.LoadAssetAtPath( "Assets/Typhoon_Gen/FontTool/FontSourceData/FSD_NotoSansBengali.asset"); var devanagari = AssetDatabase.LoadAssetAtPath( "Assets/Typhoon_Gen/FontTool/FontSourceData/FSD_NotoSansDevanagari.asset"); var thai = AssetDatabase.LoadAssetAtPath( "Assets/Typhoon_Gen/FontTool/FontSourceData/FSD_NotoSansThai.asset"); var fsd = new[] { cjk, noto_sans, arabic, bengali, devanagari, thai }; foreach (var sourceData in fsd) { if (sourceData != null) { rule.FontSourceList.Add(sourceData); } } EditorUtility.SetDirty(rule); _Editor.CreateFileDirectoryIfNotExists(generalRule); AssetDatabase.CreateAsset(rule, generalRule); _Editor.Ping(rule); } } } }