Hue Preserving Color Blending
TMP_SpriteAssetImporter.cs
1 using UnityEngine;
2 using UnityEditor;
3 using System.IO;
4 using System.Collections.Generic;
7 
8 namespace TMPro
9 {
10  public class TMP_SpriteAssetImporter : EditorWindow
11  {
12  // Create Sprite Asset Editor Window
13  [MenuItem("Window/TextMeshPro/Sprite Importer", false, 2026)]
14  public static void ShowFontAtlasCreatorWindow()
15  {
16  var window = GetWindow<TMP_SpriteAssetImporter>();
17  window.titleContent = new GUIContent("Sprite Importer");
18  window.Focus();
19  }
20 
21  Texture2D m_SpriteAtlas;
22  SpriteAssetImportFormats m_SpriteDataFormat = SpriteAssetImportFormats.TexturePacker;
23  TextAsset m_JsonFile;
24 
25  string m_CreationFeedback;
26 
27  TMP_SpriteAsset m_SpriteAsset;
28  List<TMP_Sprite> m_SpriteInfoList = new List<TMP_Sprite>();
29 
30 
31  void OnEnable()
32  {
33  // Set Editor Window Size
35  }
36 
37  public void OnGUI()
38  {
39  DrawEditorPanel();
40  }
41 
42 
43  void DrawEditorPanel()
44  {
45  // label
46  GUILayout.Label("Import Settings", EditorStyles.boldLabel);
47 
48  EditorGUI.BeginChangeCheck();
49 
50  // Sprite Texture Selection
51  m_JsonFile = EditorGUILayout.ObjectField("Sprite Data Source", m_JsonFile, typeof(TextAsset), false) as TextAsset;
52 
53  m_SpriteDataFormat = (SpriteAssetImportFormats)EditorGUILayout.EnumPopup("Import Format", m_SpriteDataFormat);
54 
55  // Sprite Texture Selection
56  m_SpriteAtlas = EditorGUILayout.ObjectField("Sprite Texture Atlas", m_SpriteAtlas, typeof(Texture2D), false) as Texture2D;
57 
58  if (EditorGUI.EndChangeCheck())
59  {
60  m_CreationFeedback = string.Empty;
61  }
62 
63  GUILayout.Space(10);
64 
65  GUI.enabled = m_JsonFile != null && m_SpriteAtlas != null && m_SpriteDataFormat == SpriteAssetImportFormats.TexturePacker;
66 
67  // Create Sprite Asset
68  if (GUILayout.Button("Create Sprite Asset"))
69  {
70  m_CreationFeedback = string.Empty;
71 
72  // Read json data file
73  if (m_JsonFile != null && m_SpriteDataFormat == SpriteAssetImportFormats.TexturePacker)
74  {
75  TexturePacker.SpriteDataObject sprites = JsonUtility.FromJson<TexturePacker.SpriteDataObject>(m_JsonFile.text);
76 
77  if (sprites != null && sprites.frames != null && sprites.frames.Count > 0)
78  {
79  int spriteCount = sprites.frames.Count;
80 
81  // Update import results
82  m_CreationFeedback = "<b>Import Results</b>\n--------------------\n";
83  m_CreationFeedback += "<color=#C0ffff><b>" + spriteCount + "</b></color> Sprites were imported from file.";
84 
85  // Create sprite info list
86  m_SpriteInfoList = CreateSpriteInfoList(sprites);
87  }
88  }
89 
90  }
91 
92  GUI.enabled = true;
93 
94  // Creation Feedback
95  GUILayout.Space(5);
96  GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.Height(60));
97  {
98  EditorGUILayout.LabelField(m_CreationFeedback, TMP_UIStyleManager.label);
99  }
100  GUILayout.EndVertical();
101 
102  GUILayout.Space(5);
103  GUI.enabled = m_JsonFile != null && m_SpriteAtlas && m_SpriteInfoList != null && m_SpriteInfoList.Count > 0; // Enable Save Button if font_Atlas is not Null.
104  if (GUILayout.Button("Save Sprite Asset") && m_JsonFile != null)
105  {
106  string filePath = EditorUtility.SaveFilePanel("Save Sprite Asset File", new FileInfo(AssetDatabase.GetAssetPath(m_JsonFile)).DirectoryName, m_JsonFile.name, "asset");
107 
108  if (filePath.Length == 0)
109  return;
110 
111  SaveSpriteAsset(filePath);
112  }
113  GUI.enabled = true;
114  }
115 
116 
120  List<TMP_Sprite> CreateSpriteInfoList(TexturePacker.SpriteDataObject spriteDataObject)
121  {
122  List<TexturePacker.SpriteData> importedSprites = spriteDataObject.frames;
123 
124  List<TMP_Sprite> spriteInfoList = new List<TMP_Sprite>();
125 
126  for (int i = 0; i < importedSprites.Count; i++)
127  {
128  TMP_Sprite sprite = new TMP_Sprite();
129 
130  sprite.id = i;
131  sprite.name = Path.GetFileNameWithoutExtension(importedSprites[i].filename) ?? "";
132  sprite.hashCode = TMP_TextUtilities.GetSimpleHashCode(sprite.name);
133 
134  // Attempt to extract Unicode value from name
135  int unicode;
136  int indexOfSeperator = sprite.name.IndexOf('-');
137  if (indexOfSeperator != -1)
138  unicode = TMP_TextUtilities.StringToInt(sprite.name.Substring(indexOfSeperator + 1));
139  else
140  unicode = TMP_TextUtilities.StringToInt(sprite.name);
141 
142  sprite.unicode = unicode;
143 
144  sprite.x = importedSprites[i].frame.x;
145  sprite.y = m_SpriteAtlas.height - (importedSprites[i].frame.y + importedSprites[i].frame.h);
146  sprite.width = importedSprites[i].frame.w;
147  sprite.height = importedSprites[i].frame.h;
148 
149  //Calculate sprite pivot position
150  sprite.pivot = importedSprites[i].pivot;
151 
152  // Properties the can be modified
153  sprite.xAdvance = sprite.width;
154  sprite.scale = 1.0f;
155  sprite.xOffset = 0 - (sprite.width * sprite.pivot.x);
156  sprite.yOffset = sprite.height - (sprite.height * sprite.pivot.y);
157 
158  spriteInfoList.Add(sprite);
159  }
160 
161  return spriteInfoList;
162  }
163 
164 
169  void SaveSpriteAsset(string filePath)
170  {
171  filePath = filePath.Substring(0, filePath.Length - 6); // Trim file extension from filePath.
172 
173  string dataPath = Application.dataPath;
174 
175  if (filePath.IndexOf(dataPath, System.StringComparison.InvariantCultureIgnoreCase) == -1)
176  {
177  Debug.LogError("You're saving the font asset in a directory outside of this project folder. This is not supported. Please select a directory under \"" + dataPath + "\"");
178  return;
179  }
180 
181  string relativeAssetPath = filePath.Substring(dataPath.Length - 6);
182  string dirName = Path.GetDirectoryName(relativeAssetPath);
183  string fileName = Path.GetFileNameWithoutExtension(relativeAssetPath);
184  string pathNoExt = dirName + "/" + fileName;
185 
186 
187  // Create new Sprite Asset using this texture
188  m_SpriteAsset = CreateInstance<TMP_SpriteAsset>();
189  AssetDatabase.CreateAsset(m_SpriteAsset, pathNoExt + ".asset");
190 
191  // Compute the hash code for the sprite asset.
192  m_SpriteAsset.hashCode = TMP_TextUtilities.GetSimpleHashCode(m_SpriteAsset.name);
193 
194  // Assign new Sprite Sheet texture to the Sprite Asset.
195  m_SpriteAsset.spriteSheet = m_SpriteAtlas;
196  m_SpriteAsset.spriteInfoList = m_SpriteInfoList;
197 
198  // Add new default material for sprite asset.
199  AddDefaultMaterial(m_SpriteAsset);
200  }
201 
202 
207  static void AddDefaultMaterial(TMP_SpriteAsset spriteAsset)
208  {
209  Shader shader = Shader.Find("TextMeshPro/Sprite");
210  Material material = new Material(shader);
211  material.SetTexture(ShaderUtilities.ID_MainTex, spriteAsset.spriteSheet);
212 
213  spriteAsset.material = material;
214  material.hideFlags = HideFlags.HideInHierarchy;
215  AssetDatabase.AddObjectToAsset(material, spriteAsset);
216  }
217 
218 
223  {
224  EditorWindow editorWindow = this;
225 
226  Vector2 currentWindowSize = editorWindow.minSize;
227 
228  editorWindow.minSize = new Vector2(Mathf.Max(230, currentWindowSize.x), Mathf.Max(300, currentWindowSize.y));
229  }
230 
231  }
232 }
int hashCode
HashCode based on the name of the asset.
Definition: TMP_Asset.cs:13
void SetEditorWindowSize()
Limits the minimum size of the editor window.
static void AddDefaultMaterial(TMP_SpriteAsset spriteAsset)
Create and add new default material to sprite asset.
Material material
The material used by this asset.
Definition: TMP_Asset.cs:18
List< TMP_Sprite > CreateSpriteInfoList(TexturePacker.SpriteDataObject spriteDataObject)