You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.4 KiB
120 lines
3.4 KiB
//-------------------------------------------------------------------------------------------------------------------------------- |
|
// Cartoon FX |
|
// (c) 2012-2020 Jean Moreno |
|
//-------------------------------------------------------------------------------------------------------------------------------- |
|
|
|
using System.Collections; |
|
using System.Collections.Generic; |
|
using UnityEngine; |
|
#if UNITY_EDITOR |
|
using UnityEditor; |
|
#endif |
|
|
|
namespace CartoonFX |
|
{ |
|
public class CFXR_ParticleTextFontAsset : ScriptableObject |
|
{ |
|
public string CharSequence = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?-.#@$ "; |
|
public Sprite[] CharSprites; |
|
public Kerning[] CharKerningOffsets; |
|
|
|
[System.Serializable] |
|
public class Kerning |
|
{ |
|
public string name = "A"; |
|
public float pre = 0f; |
|
public float post = 0f; |
|
} |
|
|
|
void OnValidate() |
|
{ |
|
this.hideFlags = HideFlags.None; |
|
|
|
if (CharKerningOffsets == null || CharKerningOffsets.Length != CharSequence.Length) |
|
{ |
|
CharKerningOffsets = new Kerning[CharSequence.Length]; |
|
for (int i = 0; i < CharKerningOffsets.Length; i++) |
|
{ |
|
CharKerningOffsets[i] = new Kerning() { name = CharSequence[i].ToString() }; |
|
} |
|
} |
|
} |
|
|
|
public bool IsValid() |
|
{ |
|
bool valid = !string.IsNullOrEmpty(CharSequence) && CharSprites != null && CharSprites.Length == CharSequence.Length && CharKerningOffsets != null && CharKerningOffsets.Length == CharSprites.Length; |
|
|
|
if (!valid) |
|
{ |
|
Debug.LogError(string.Format("Invalid ParticleTextFontAsset: '{0}'\n", this.name), this); |
|
} |
|
|
|
return valid; |
|
} |
|
|
|
#if UNITY_EDITOR |
|
// [MenuItem("Tools/Create font asset")] |
|
static void CreateFontAsset() |
|
{ |
|
var instance = CreateInstance<CFXR_ParticleTextFontAsset>(); |
|
AssetDatabase.CreateAsset(instance, "Assets/Font.asset"); |
|
} |
|
#endif |
|
} |
|
|
|
#if UNITY_EDITOR |
|
[CustomEditor(typeof(CFXR_ParticleTextFontAsset))] |
|
public class ParticleTextFontAssetEditor : Editor |
|
{ |
|
public override void OnInspectorGUI() |
|
{ |
|
base.OnInspectorGUI(); |
|
|
|
GUILayout.BeginHorizontal(); |
|
if (GUILayout.Button("Export Kerning")) |
|
{ |
|
var ptfa = this.target as CFXR_ParticleTextFontAsset; |
|
var path = EditorUtility.SaveFilePanel("Export Kerning Settings", Application.dataPath, ptfa.name + " kerning", ".txt"); |
|
if (!string.IsNullOrEmpty(path)) |
|
{ |
|
string output = ""; |
|
foreach (var k in ptfa.CharKerningOffsets) |
|
{ |
|
output += k.name + "\t" + k.pre + "\t" + k.post + "\n"; |
|
} |
|
System.IO.File.WriteAllText(path, output); |
|
} |
|
} |
|
|
|
if (GUILayout.Button("Import Kerning")) |
|
{ |
|
var path = EditorUtility.OpenFilePanel("Import Kerning Settings", Application.dataPath, "txt"); |
|
if (!string.IsNullOrEmpty(path)) |
|
{ |
|
var text = System.IO.File.ReadAllText(path); |
|
var split = text.Split(new string[] { "\n" }, System.StringSplitOptions.RemoveEmptyEntries); |
|
var ptfa = this.target as CFXR_ParticleTextFontAsset; |
|
Undo.RecordObject(ptfa, "Import Kerning Settings"); |
|
List<CFXR_ParticleTextFontAsset.Kerning> kerningList = new List<CFXR_ParticleTextFontAsset.Kerning>(ptfa.CharKerningOffsets); |
|
for (int i = 0; i < split.Length; i++) |
|
{ |
|
var data = split[i].Split('\t'); |
|
|
|
foreach (var cko in kerningList) |
|
{ |
|
if (cko.name == data[0]) |
|
{ |
|
cko.pre = float.Parse(data[1]); |
|
cko.post = float.Parse(data[2]); |
|
break; |
|
} |
|
} |
|
} |
|
ptfa.CharKerningOffsets = kerningList.ToArray(); |
|
} |
|
} |
|
GUILayout.EndHorizontal(); |
|
} |
|
} |
|
#endif |
|
} |