示例#1
0
        //创建fontsetting
        private void CreatFontSetting()
        {
            CharacterGUIData[] finalSettings = FilterSetting();

            _ci = new CharacterInfo[finalSettings.Length];
            int linespace;

            for (int i = 0; i < finalSettings.Length; i++)
            {
                CharacterGUIData cgd    = finalSettings[i];
                Sprite           sp     = cgd.ItemObj as Sprite;
                Rect             spRect = sp.rect;
                _ci[i]       = new CharacterInfo();
                _ci[i].index = ConvertStringToUnicode(cgd.UnicodeStr);
                //_ci[i].uvBottomLeft = new Vector2(spRect.x/_bitmapW, spRect.y/_bitmapH);
                //_ci[i].uvTopRight = new Vector2((spRect.x + spRect.width)/_bitmapW, (spRect.y +spRect.height)/_bitmapH);
                //_ci[i].minX = 0;
                //_ci[i].maxX = (int)spRect.width;
                //_ci[i].minY = (int)-spRect.height/2;
                //_ci[i].maxY = (int)spRect.height/2;
                //_ci[i].advance = (int) spRect.width;

                CharacterInfo info = _ci[i];
                info.index        = ConvertStringToUnicode(cgd.UnicodeStr);
                info.uvBottomLeft = new Vector2(spRect.x / _bitmapW, spRect.y / _bitmapH);
                info.uvTopRight   = new Vector2((spRect.x + spRect.width) / _bitmapW, (spRect.y + spRect.height) / _bitmapH);

                info.minX        = 0;
                info.minY        = -(int)spRect.height / 2; // 这样调出来的效果是ok的,原理未知
                info.glyphWidth  = (int)spRect.width;
                info.glyphHeight = (int)spRect.height;      // 同上,不知道为什么要用负的,可能跟unity纹理uv有关
                info.advance     = (int)spRect.width;

                _ci[i]    = info;
                linespace = (int)spRect.height;
            }

            string fntPath = _bitmapFolder + "/" + _fontName + ".fontsettings";
            //AssetDatabase.CreateAsset(_fnt, fntPath);
            Font fnt = AssetDatabase.LoadAssetAtPath <Font>(fntPath);

            if (fnt == null)
            {
                fnt = new Font();
                AssetDatabase.CreateAsset(fnt, fntPath);
                AssetDatabase.ImportAsset(fntPath);
            }
            fnt.characterInfo = _ci;
            CreateFontMaterial(fnt);
            EditorUtility.SetDirty(fnt);

            AssetDatabase.SaveAssets();
        }
示例#2
0
 private void SetFontCfgParameterItem(int index, CharacterGUIData data)
 {
     EditorGUILayout.BeginHorizontal();
     GUILayout.Label(string.Format("第{0}个字体", data.index), GUILayout.Width(80));
     EditorGUILayout.ObjectField(data.ItemObj, typeof(Sprite), false);
     GUILayout.Label("名称:");
     GUILayout.TextField(data.ItemObj.name);
     GUILayout.Label("对应的字体文字:");
     if (string.IsNullOrEmpty(data.UnicodeStr))
     {
         data.UnicodeStr = data.ItemObj.name;
     }
     data.UnicodeStr = EditorGUILayout.TextField(data.UnicodeStr);
     EditorGUILayout.EndHorizontal();
 }
示例#3
0
        private void OnGUI()
        {
            GUILayout.Label("注意:生成好字体后,如果需要换行功能,请在fontsetting里设置lineSpacing为字体高度");
            EditorGUILayout.BeginHorizontal();

            GUILayout.Label("选择字体对应的位图");
            _sprite = EditorGUILayout.ObjectField(_sprite, typeof(Texture), false);

            if (_sprite != null)
            {
                _bitmapW = (_sprite as Texture).width;
                _bitmapH = (_sprite as Texture).height;
            }

            if (GUILayout.Button(new GUIContent("设置字体参数")))
            {
                _valid          = true;
                _bitmapFullPath = AssetDatabase.GetAssetPath(_sprite);

                if (!string.IsNullOrEmpty(_bitmapFullPath))
                {
                    _bitmapFolder = Path.GetDirectoryName(_bitmapFullPath);
                    _fontName     = Path.GetFileNameWithoutExtension(_bitmapFullPath);
                    //
                    _fontItems = AssetDatabase.LoadAllAssetsAtPath(_bitmapFullPath);

                    _characterGuiDatas = new CharacterGUIData[_fontItems.Length - 1];

                    for (int i = 0; i < _fontItems.Length - 1; i++)
                    {
                        _characterGuiDatas[i] = new CharacterGUIData();
                        var name = SplitName(_fontItems[i + 1].name);
                        _characterGuiDatas[i].UnicodeStr = name;
                        var nameValid = !regExp.IsMatch(name); //含有非法字符;
                        _characterGuiDatas[i].valid = nameValid;
                        if (!nameValid)
                        {
                            _valid = false;
                        }
                    }
                }
                else
                {
                    Debug.LogError("没有指定需要制作字体的图集!");
                }
            }

            GUILayout.Label("设置字体名称:");
            _fontName = GUILayout.TextField(_fontName, 1200, GUILayout.Width(120));

            if (GUILayout.Button(new GUIContent("创建字体")))
            {
                if (!_valid)
                {
                    EditorUtility.DisplayDialog("Error", "字体包含违法字符,请检查", "OK");
                    return;
                }
                if (!string.IsNullOrEmpty(_bitmapFolder))
                {
                    if (_characterGuiDatas != null)
                    {
                        CreatFontSetting();
                    }
                    else
                    {
                        Debug.LogError("字体数据为空!");
                    }
                }
            }

            EditorGUILayout.EndHorizontal();

            if (_characterGuiDatas == null)
            {
                return;
            }

            //
            for (int i = 0; i < _characterGuiDatas.Length; i++)
            {
                UnityEngine.Object obj  = _fontItems[i + 1];
                CharacterGUIData   data = _characterGuiDatas[i];
                data.index         = i;
                data.ItemObj       = obj;
                data.CharacterInfo = new CharacterInfo();
                SetFontCfgParameterItem(i, data);
            }
        }