原文地址
https://blog.csdn.net/qq_28221881/article/details/75315326需要注意的是:字体文件的名字要对应相应的艺术字体,比如 1->1的艺术字体,中->对应中的艺术字体等等。
并且在生成字体文件后,要修改一下字体,然后再回去保存,才能让字体文件生效
- using UnityEditor;
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System;
- public class MakeArtFont
- {
- [MenuItem("Assets/LoadFont(选中目标文件夹)")]
- static void CarteNewFont()
- {
- UnityEngine.Object obj = Selection.activeObject;
- string setImgPath = AssetDatabase.GetAssetPath(obj);
- CombinImage(setImgPath.Replace("Assets/", ""), obj.name);
- }
- /// <summary>
- /// 调用此函数后使此图片合并
- /// </summary>
- /// <param name="sourceImg">粘贴的源图片</param>
- /// <param name="destImg">粘贴的目标图片</param>
- public static void CombinImage(string sourceImg, string fileName)
- {
- string[] pngs = Directory.GetFiles(Application.dataPath + "/" + sourceImg, "*.png");
- string texturePath = Application.dataPath + "/" + sourceImg + "/" + fileName + "_texture.png";
- int maxWidth = 0;
- int maxHeight = 0;
- foreach (string path in pngs)
- {
- string subPngPath = path.Replace(Application.dataPath, "Assets");
- if (subPngPath.IndexOf("texture") == -1)
- {
- Texture tex2D = AssetDatabase.LoadAssetAtPath(subPngPath, typeof(Texture)) as Texture;
- maxWidth += tex2D.width;
- if (maxHeight < tex2D.height)
- {
- maxHeight = tex2D.height;
- }
- }
- }
- Texture2D fullTexture = new Texture2D(maxWidth, maxHeight, TextureFormat.RGBA32, false);
- Color[] fullTcolors = fullTexture.GetPixels();
- for (int i = 0; i < fullTcolors.Length; i++)
- {
- fullTcolors[i].a = 0;
- fullTcolors[i].r = 0;
- fullTcolors[i].g = 0;
- fullTcolors[i].b = 0;
- }
- fullTexture.SetPixels(fullTcolors);
- int posX = 0;
- List<BmInfo> bmInfoList = new List<BmInfo>();
- foreach (string path in pngs)
- {
- string subPngPath = path.Replace(Application.dataPath, "Assets");
- if (subPngPath.IndexOf("texture") == -1)
- {
- SetTextureImporter(subPngPath);
- Texture2D tex2D = AssetDatabase.LoadAssetAtPath(subPngPath, typeof(Texture2D)) as Texture2D;
- Color[] colors = tex2D.GetPixels();
- fullTexture.SetPixels(posX, 0, tex2D.width, tex2D.height, colors);
- BmInfo bmInfo = new BmInfo();
- bmInfo.index = Uncode(tex2D.name);
- bmInfo.width = tex2D.width;
- bmInfo.height = tex2D.height;
- bmInfo.x = posX;
- bmInfo.y = 0;
- bmInfoList.Add(bmInfo);
- posX += tex2D.width;
- }
- }
- byte[] full = fullTexture.EncodeToPNG();
- File.WriteAllBytes(texturePath, full);
- AssetDatabase.Refresh();
- texturePath = texturePath.Replace(Application.dataPath, "Assets");
- SetTextureImporter(texturePath);
- Texture texture = AssetDatabase.LoadAssetAtPath(texturePath, typeof(Texture)) as Texture;
- CreateBitmapFont(fileName, texture, bmInfoList, maxWidth, maxHeight);
- }
- public static void SetTextureImporter(string subPngPath)
- {
- TextureImporter ti = AssetImporter.GetAtPath(subPngPath) as TextureImporter;
- ti.textureType = TextureImporterType.Sprite;
- ti.mipmapEnabled = false;
- ti.isReadable = true;
- ti.filterMode = FilterMode.Trilinear;
- ti.textureFormat = TextureImporterFormat.AutomaticTruecolor;
- AssetDatabase.ImportAsset(subPngPath, ImportAssetOptions.ForceUpdate | ImportAssetOptions.ForceSynchronousImport);
- }
- /// <summary>
- /// 创建新的美术字体
- /// </summary>
- /// <param name="texture"></param>
- /// <param name="bmInfoList"></param>
- /// <param name="columnNum"></param>
- /// <param name="lineNum"></param>
- public static void CreateBitmapFont(string fileName, Texture texture, List<BmInfo> bmInfoList, int maxWidth, int maxHeight)
- {
- string assetPath = GetAssetPath(AssetDatabase.GetAssetPath(texture));
- string fontPath = assetPath + "/" + fileName + "_1.fontsettings";
- string materialPath = assetPath + "/" + fileName + "_2.mat";
- Material fontMaterial = AssetDatabase.LoadAssetAtPath(materialPath, typeof(Material)) as Material;//new Material(Shader.Find("UI/Default"));
- if (fontMaterial == null)
- {
- fontMaterial = new Material(Shader.Find("UI/Default"));
- fontMaterial.mainTexture = texture;
- AssetDatabase.CreateAsset(fontMaterial, materialPath);
- }
- else
- {
- fontMaterial.mainTexture = texture;
- }
- Font assetFont = AssetDatabase.LoadAssetAtPath(fontPath, typeof(Font)) as Font;
- string ApplicationDataPath = Application.dataPath.Replace("Assets", "") + fontPath;
- if (assetFont == null)
- {
- assetFont = new Font();
- AssetDatabase.CreateAsset(assetFont, fontPath);
- }
- assetFont.material = fontMaterial;
- CharacterInfo[] characters = new CharacterInfo[bmInfoList.Count];
- for (int i = 0; i < bmInfoList.Count; i++)
- {
- BmInfo bmInfo = bmInfoList[i];
- CharacterInfo info = new CharacterInfo();
- info.index = bmInfo.index;
- info.uv.width = (float)bmInfo.width / (float)maxWidth;
- info.uv.height = (float)bmInfo.height / (float)maxHeight;
- info.uv.x = (float)bmInfo.x / (float)maxWidth;
- info.uv.y = (1 - (float)bmInfo.y / (float)maxHeight) - info.uv.height;
- info.vert.x = 0;
- info.vert.y = 0;
- info.vert.width = (float)bmInfo.width;
- info.vert.height = -(float)bmInfo.height;
- info.width = (float)bmInfo.width;
- characters[i] = info;
- }
- assetFont.characterInfo = characters;
- }
- private static string GetAssetPath(string path)
- {
- return path == "" || path == null ? "Assets/" : path.Substring(0, path.LastIndexOf("/"));
- }
- //将中文字符转为10进制整数
- public static int Uncode(string str)
- {
- int outStr = 0;
- if (!string.IsNullOrEmpty(str))
- {
- if (str == "。")
- {
- outStr = (int)"."[0];
- }
- else
- {
- outStr = ((int)str[0]);
- }
- }
- return outStr;
- }
- }
- public class BmInfo
- {
- public int index = 0;
- public float width = 0;
- public float height = 0;
- public float x = 0;
- public float y = 0;
- }