UGUI 多音字项目中用到多音字 奈何拼音字体库并非支持多音字,随便写了小工具类

xiaoxiao2021-02-28  47

废话不多说 说一下解决思路

第一:字体库包含多音字 但是因为文档只支持一种字体。所以就是将要变换的多音字转化为空格(不显示),将多音字放置到空格位置上(修改字体)

第二:一句中可能有多种字体 如 的 de di  长 chang zhang  de 是第二种字体  chang 是第三种字体才有,所以多音字要可以多次定义字体,即相同字体的要可以公用一个字体

第三:这样会出现很多子Text 更改文档内容的时候要清空所有text

第一个方法 将文档中这个字替换掉 这里不能用空格 要用\u3000 代替 否者空格会被换行符代替

     /// <summary>         /// 替换除了这个字的所有别的文字为空格         /// </summary>         /// <param name="text"></param>         /// <param name="charPoint"></param>         /// <returns></returns>         private string ChangeExceptThisCharAddEmptyText(string text, char charPoint)         {             string[] strings = text.Split(charPoint);             string ft_text = null;             for (int i = 0; i < strings.Length; i++)             {                 if (i != 0)                 {                     ft_text += charPoint;                 }                 for (int a = 0; a < strings[i].Length; a++)                 {                     ft_text = ft_text + "\u3000";                 }             }             return ft_text;         }

第二个方法 替换这个字为空格

     /// <summary>         /// 替换这个字为空格         /// </summary>         /// <param name="text"></param>         /// <param name="charPoint"></param>         /// <returns></returns>         private string ChangeThisCharAddEmptyText(string text, char charPoint)         {             string[] strings = text.Split(charPoint);             string ft_text = null;             for (int i = 0; i < strings.Length; i++)             {                 //Debug.Log(strings[i]);                 ft_text = ft_text + strings[i] + "\u3000";             }             return ft_text;         }

第三个方法 将所有多音字注入文档

    /// <summary>         /// 迭代修改 将多音字 字节组全部修改一遍         /// </summary>         /// <param name="text"></param>         /// <param name="fontIndex"></param>         /// <param name="charList"></param>         /// <param name="textContent"></param>         private void ChangeTextPinYinCharListEmptyApi(Text text, int fontIndex, char[] charList, string textContent)         {             string ft_text = textContent;             for (int i = 0; i < charList.Length; i++)             {                 ft_text = ChangeThisCharAddEmptyText(ft_text, charList[i]);             }             text.text = ft_text;         }

第四个方法 清空

        /// <summary>         /// 清理索引值为1以后的子物体         /// </summary>         /// <param name="text"></param>         public void ClearPinYinText(Text text) {             for (int i =0; i < text.gameObject.transform.childCount; i++)             {                 Destroy(text.transform.GetChild(i).gameObject);             }             text.text = null;                      }

第五个方法 修改多音字总方法

        private void ChangeTextPinYinExceptThisCharEmptyApi(Text text, int fontIndex, char charPoint, string textContent)         {

//获取清空的字符串             string ft_text = ChangeExceptThisCharAddEmptyText(textContent, charPoint);

//创建新的text             Text newText = Instantiate(text, text.transform.localPosition, text.transform.localRotation) as Text;                        for (int i = 0; i < newText.transform.childCount; i++)             {                Destroy(newText.transform.GetChild(i).gameObject);             }

//重置childtext参数             newText.transform.SetParent(text.transform);             newText.transform.localPosition = Vector3.zero;             newText.transform.localScale = Vector3.one;             newText.font = fontList[fontIndex];             newText.text = ft_text;         }

最后就可以设置自己要更换的字体及文字了

测试例子

   public void SetTextTextContentApi(Text text, string textContent,bool isClearAll)         {             if (isClearAll) { ClearAllPinYinText(text);} else {ClearPinYinText(text);  };                          ChangeTextPinYinCharListEmptyApi(text, 0, new char[4] { '长', '的', '呢','了' }, textContent);             ChangeTextPinYinExceptThisCharEmptyApi(text, 1, '长', textContent);             ChangeTextPinYinExceptThisCharEmptyApi(text, 2, '的', textContent);             ChangeTextPinYinExceptThisCharEmptyApi(text, 1, '呢', textContent);             ChangeTextPinYinExceptThisCharEmptyApi(text, 1, '了', textContent);         }

转载请注明原文地址: https://www.6miu.com/read-75419.html

最新回复(0)