using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEditor; using UnityEngine; namespace TyphoonFontTool { public enum GroupingMode { Funnel, //瀑布模式,一层一层过滤 Normal, //一般模式,取包含的最大字符数量 } //输入模式 public enum InputMode { Characters, //字符 HexCodesRange, //码点范围 File, //文件 } //分组规则 public class GroupingRule : ScriptableObject { public GroupingMode Mode = GroupingMode.Funnel; //分组规则 public List FontSourceList = new List(); //字体资源列表 public List Output = new List(); //分组数据 public Vector2 Scroll; public Vector2 ScrollOutput; public InputMode InputMode = InputMode.Characters; public string InputHexCodeRange = ""; //16进制码点范围字符串 public string InputCharacterString = ""; //默认输入字符 public List InputFiles = new List(); public List MissingCode = new List(); //缺失的字符 [HideInInspector] public int MissCodeHashCode; private string[] _missGUIContent = null; public string[] MissCodeGUIContent { get { if (MissingCode.GetHashCode() != MissCodeHashCode) { MissCodeHashCode = MissingCode.GetHashCode(); EditorUtility.SetDirty(this); _missGUIContent = null; } if (_missGUIContent == null) { var list = new List(); //每200行拆分一条数据 var count = 0; var splitLength = 200; var sb = new StringBuilder(); foreach (var code in MissingCode) { var str = char.ConvertFromUtf32(code); sb.AppendLine($"[{code}] [{str}]"); count += 1; if (count > splitLength) { list.Add(sb.ToString()); count = 0; sb.Clear(); } } if (sb.Length > 0) { list.Add(sb.ToString()); } _missGUIContent = list.ToArray(); } return _missGUIContent; } } //码点分组数据 [Serializable] public class CodeGroupData { public FontSourceData FontSource; public List Codes; [NonSerialized] private int _hashCode; [NonSerialized] private string _characterString = null; [NonSerialized] private GUIContent _previewLabel = null; [NonSerialized] private GUIStyle _previewContentStyle = null; public GUIContent GetPreviewGUIContent(GUIStyle style) { if (_previewContentStyle != style) { _previewLabel = null; _previewContentStyle = style; } if (_previewLabel == null) { _previewLabel = new GUIContent(CharacterString); } return _previewLabel; } public string GetOutputFile(GroupingRule rule) => $"Assets/Typhoon_Gen/FontTool/GroupingOutPut/{rule.name}/字符集-{FontSource.Font.name}.txt"; public string CharacterString { get { if (_hashCode != Codes.GetHashCode()) { _characterString = null; _hashCode = Codes.GetHashCode(); } if (_characterString == null) { var sb = new StringBuilder(); foreach (var code in Codes) { sb.Append(char.ConvertFromUtf32(code)); } _characterString = sb.ToString(); } return _characterString; } } public CodeGroupData(FontSourceData fontSource, List codes) { FontSource = fontSource; Codes = new List(codes); _hashCode = Codes.GetHashCode(); } } [Serializable] public class CharacterData { public Font Font; public string CharacterString; private GUIStyle _fontStyle; public GUIStyle FontStyle { get { if (_fontStyle == null) { _fontStyle = new GUIStyle(GUI.skin.textArea); } return _fontStyle; } } public CharacterData(Font font, string characterString) { Font = font; CharacterString = characterString; } } //保存 public void Save() { #if UNITY_EDITOR EditorUtility.SetDirty(this); AssetDatabase.SaveAssets(); #endif } } }