如何做好网站宣传,电商小程序名字大全,元素网站,小程序code艺术字在游戏中很常用#xff0c;由于普通字体样式过于平淡#xff0c;制作花里胡哨的文字图片作为游戏字体使用#xff0c;这就是艺术字。
不依赖第三方工具#xff0c;仅使用Unity自带的Custom Font 一张艺术字图集就能实现这个功能#xff0c;但是为了便于使用#…艺术字在游戏中很常用由于普通字体样式过于平淡制作花里胡哨的文字图片作为游戏字体使用这就是艺术字。
不依赖第三方工具仅使用Unity自带的Custom Font 一张艺术字图集就能实现这个功能但是为了便于使用还需要依赖自动化工具自动化把字符映射到图片纹理坐标一键生成字体文件。
工具使用效果 字符对齐图片 艺术字使用效果
Unity自定义字体参数面板如下 其中Character Rects数组是每个字符所在贴图的uv坐标系下的映射Rect
Index字符的Ascii码偏移值字符真实ASCII码 Ascii Start Offset Index这里建议把ASCII码起始值(Ascii Start Offset)设为0把Index直接设置为字符的ASCII码。
Vert字符的宽高信息 Y为高度的一半是为了垂直方向居中
工具功能设计
0. 首先制作字符集图片在Unity中用Sprite Editor进行自动Sprite碎图分割
1. 拖拽添加字符图集
2. 设置字符文件或直接在输入框输入字符两处字符将自动合并去重
3. 支持设置字体大小自定义字体无法通过Text组件动态修改字体大小因此需要为不同字号生成单独的字体文件但材质和贴图共用只消耗一个DC;
4.支持字符与图集对照预览
5. 点击生成一键创建字体文件和对应材质 代码实现
代码实现非常简单主要就是读取Sprite中的子图Rect信息然后转换到字体所需的UV坐标系Rect等
使用Unity 2022新版Sprite编辑器API读取碎图信息 var texFact new SpriteDataProviderFactories();texFact.Init();var texDataProvider texFact.GetSpriteEditorDataProviderFromObject(texture2d);texDataProvider.InitSpriteEditorDataProvider();var spriteRects texDataProvider.GetSpriteRects();
生成字体文件的Character Rects:
private bool ParseCharsInfo(char[] chars, out CharacterInfo[] charInfoArr, out Texture2D charsTexture){charInfoArr null;charsTexture null;if (chars null || chars.Length 1){return false;}charsTexture OwnerEditor.SelectObjectList[0] as Texture2D;var texSize new Vector2Int(charsTexture.width, charsTexture.height);var texFact new SpriteDataProviderFactories();texFact.Init();var texDataProvider texFact.GetSpriteEditorDataProviderFromObject(charsTexture);texDataProvider.InitSpriteEditorDataProvider();var spRects texDataProvider.GetSpriteRects();int count Mathf.Min(chars.Length, spRects.Length);charInfoArr new CharacterInfo[count];for (int i 0; i count; i){var spRect spRects[i].rect;var uvMin spRect.min / texSize;var uvMax spRect.max / texSize;float fontHeight m_FontSize;float fontScale m_FontSize / spRect.height;charInfoArr[i] new CharacterInfo{index chars[i],uvBottomLeft uvMin,uvBottomRight new Vector2(uvMax.x, uvMin.y),uvTopLeft new Vector2(uvMin.x, uvMax.y),uvTopRight uvMax,minX 0,minY -(int)(fontHeight * 0.5f),//居中偏移量advance (int)(spRect.width * fontScale),glyphWidth (int)(spRect.width * fontScale),glyphHeight (int)fontHeight,};}return true;}
生成字体文件
string outputDir EditorUtility.SaveFolderPanel(保存到, Application.dataPath, null);if (!string.IsNullOrWhiteSpace(outputDir) Directory.Exists(outputDir)){outputDir Path.Combine(Assets, Path.GetRelativePath(Application.dataPath, outputDir));string outputFont Path.Combine(outputDir, ${charsTexture.name}_{m_FontSize}.fontsettings);Font newFont;if (!File.Exists(outputFont)){newFont new Font(charsTexture.name);AssetDatabase.CreateAsset(newFont, outputFont);}newFont AssetDatabase.LoadAssetAtPathFont(outputFont);string outputFontMat Path.Combine(outputDir, ${charsTexture.name}.mat);if (!File.Exists(outputFontMat)){var tempFontMat new Material(Shader.Find(UI/Default Font));AssetDatabase.CreateAsset(tempFontMat, outputFontMat);}var fontMat AssetDatabase.LoadAssetAtPathMaterial(outputFontMat);fontMat.shader Shader.Find(UI/Default Font);fontMat.SetTexture(_MainTex, charsTexture);EditorUtility.SetDirty(fontMat);AssetDatabase.SaveAssetIfDirty(fontMat);newFont.material fontMat;newFont.characterInfo charInfoArr;EditorUtility.SetDirty(newFont);AssetDatabase.SaveAssetIfDirty(newFont);Selection.activeInstanceID newFont.GetInstanceID();}