| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- using System.Xml;
- using System;
- public class CustomFontImportor : MonoBehaviour
- {
- public Font font;
- public TextAsset textAsset;
- //解析xml格式的fnt
- // void Awake()
- // {
- // if (font == null || textAsset == null)
- // {
- // //Debug.LogError("请设置font和textAsset.");
- // return;
- // }
- // XmlDocument xmlDocument = new XmlDocument();
- // xmlDocument.LoadXml(textAsset.text);
- // int totalWidth = Convert.ToInt32(xmlDocument["font"]["common"].Attributes["scaleW"].InnerText);
- // int totalHeight = Convert.ToInt32(xmlDocument["font"]["common"].Attributes["scaleH"].InnerText);
- // XmlElement xml = xmlDocument["font"]["chars"];
- // ArrayList characterInfoList = new ArrayList();
- // for (int i = 0; i < xml.ChildNodes.Count; ++i)
- // {
- // XmlNode node = xml.ChildNodes[i];
- // if (node.Attributes == null)
- // {
- // continue;
- // }
- // int index = Convert.ToInt32(node.Attributes["id"].InnerText);
- // int x = Convert.ToInt32(node.Attributes["x"].InnerText);
- // int y = Convert.ToInt32(node.Attributes["y"].InnerText);
- // int width = Convert.ToInt32(node.Attributes["width"].InnerText);
- // int height = Convert.ToInt32(node.Attributes["height"].InnerText);
- // int xOffset = Convert.ToInt32(node.Attributes["xoffset"].InnerText);
- // int yOffset = Convert.ToInt32(node.Attributes["yoffset"].InnerText);
- // int xAdvance = Convert.ToInt32(node.Attributes["xadvance"].InnerText);
- // CharacterInfo info = new CharacterInfo();
- // Rect uv = new Rect();
- // uv.x = (float)x / totalWidth;
- // uv.y = (float)(totalHeight - y - height) / totalHeight;
- // uv.width = (float)width / totalWidth;
- // uv.height = (float)height / totalHeight;
- // info.index = index;
- // info.uvBottomLeft = new Vector2(uv.xMin, uv.yMin);
- // info.uvBottomRight = new Vector2(uv.xMax, uv.yMin);
- // info.uvTopLeft = new Vector2(uv.xMin, uv.yMax);
- // info.uvTopRight = new Vector2(uv.xMax, uv.yMax);
- // info.minX = xOffset;
- // info.maxX = xOffset + width;
- // info.minY = -yOffset - height;
- // info.maxY = -yOffset;
- // info.advance = xAdvance;
- // info.glyphWidth = width;
- // info.glyphHeight = height;
- // characterInfoList.Add(info);
- // }
- // font.characterInfo = characterInfoList.ToArray(typeof(CharacterInfo)) as CharacterInfo[];
- // Debug.Log("生成成功.");
- // }
- //解析txt格式的fnt
- void Start()
- {
- if (font == null || textAsset == null)
- {
- //Debug.LogError("请设置font和textAsset.");
- return;
- }
- Hashtable kvs = new Hashtable();
- List<Hashtable> chars = new List<Hashtable>();
- string[] kvStrs = textAsset.text.Split(new char[]{' ', '\n'});
- Hashtable charInfo = null;
- int charListIndex = 0;
- foreach (var kvStr in kvStrs)
- {
- if (kvStr.Trim().Length == 0) continue;
- if (kvStr == "char") {
- if (charListIndex != chars.Count) chars.Add(charInfo);
- charInfo = new Hashtable();
- charListIndex++;
- continue;
- }
- if (!kvStr.Contains("=")) continue;
- string k = kvStr.Split(new char[]{'='})[0];
- string v = kvStr.Split(new char[]{'='})[1];
- if (charInfo != null) {
- charInfo.Add(k, v);
- continue;
- }
- kvs.Add(k, v);
- }
- if (charListIndex != chars.Count) chars.Add(charInfo);
- int totalWidth = Convert.ToInt32(kvs["scaleW"]);
- int totalHeight = Convert.ToInt32(kvs["scaleH"]);
- ArrayList characterInfoList = new ArrayList();
- for (int i = 0; i < chars.Count; ++i)
- {
- Hashtable charRecord = chars[i];
- int index = Convert.ToInt32(charRecord["id"]);
- int x = Convert.ToInt32(charRecord["x"]);
- int y = Convert.ToInt32(charRecord["y"]);
- int width = Convert.ToInt32(charRecord["width"]);
- int height = Convert.ToInt32(charRecord["height"]);
- int xOffset = Convert.ToInt32(charRecord["xoffset"]);
- int yOffset = Convert.ToInt32(charRecord["yoffset"]);
- int xAdvance = Convert.ToInt32(charRecord["xadvance"]);
- CharacterInfo info = new CharacterInfo();
- Rect uv = new Rect();
- uv.x = (float)x / totalWidth;
- uv.y = (float)(totalHeight - y - height) / totalHeight;
- uv.width = (float)width / totalWidth;
- uv.height = (float)height / totalHeight;
- info.index = index;
- info.uvBottomLeft = new Vector2(uv.xMin, uv.yMin);
- info.uvBottomRight = new Vector2(uv.xMax, uv.yMin);
- info.uvTopLeft = new Vector2(uv.xMin, uv.yMax);
- info.uvTopRight = new Vector2(uv.xMax, uv.yMax);
- info.minX = xOffset;
- info.maxX = xOffset + width;
- info.minY = -yOffset - height;
- info.maxY = -yOffset;
- info.advance = xAdvance;
- info.glyphWidth = width;
- info.glyphHeight = height;
- characterInfoList.Add(info);
- }
- font.characterInfo = characterInfoList.ToArray(typeof(CharacterInfo)) as CharacterInfo[];
- Debug.Log("生成成功.");
- }
- }
|