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

来源:互联网 发布:去北京linux培训 编辑:程序博客网 时间:2024/04/27 06:11

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

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

第二:一句中可能有多种字体 如 的 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);
        }


阅读全文
0 0