网站正在建设中_敬请期待,快速做网站企业,天津ui设计公司,杭州网站网站建设推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好#xff0c;我是佛系工程师☆恬静的小魔龙☆#xff0c;不定时更新Unity开发技巧#xff0c;觉得有用记得一键三连哦。
一、前言
在开发中会遇到Text的文本内容行首出现标点符号的情况#xf… 推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好我是佛系工程师☆恬静的小魔龙☆不定时更新Unity开发技巧觉得有用记得一键三连哦。
一、前言
在开发中会遇到Text的文本内容行首出现标点符号的情况跟文本书写习惯不太符合而且也不太美观比如这样 这篇文章就分享如何将行首不出现标点符号。
二、正文
2-1、实现思路
首先需要获取到每一行的文本对象然后使用正则表达式判断这一行中有没有标点符号。
并且这个标点符号在不在行首如果在行首的话就需要进行处理了。
处理一般是用换行接下来就看实现代码吧。
2-2、实现代码
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEngine.UI;public class NoPunctuation : MonoBehaviour
{/// summary/// Text文本组件/// /summaryprivate Text txt;/// summary/// 用于匹配标点符号正则表达式/// /summaryprivate readonly string strRegex (\|\|\|\。|\《|\》|\|\|\”|\’|\、|\|\|\-);/// summary/// 用于存储text组件中的内容/// /summaryprivate System.Text.StringBuilder MExplainText null;/// summary/// 用于存储text生成器中的内容/// /summaryprivate IListUILineInfo MExpalinTextLine;private void Awake(){txt GetComponentText();OnTextChange();txt.RegisterDirtyLayoutCallback(OnTextChange);}private void OnTextChange(){StartCoroutine(MClearUpExplainMode(txt, txt.text));}/// summary/// 整理文字。确保首字母不出现标点/// /summary/// param name_componenttext组件/param/// param name_text需要填入text中的内容/param/// returns/returnsIEnumerator MClearUpExplainMode(Text _component, string _text){_component.text _text;// 如果直接执行下边方法的话那么_component.cachedTextGenerator.lines将会获取的是之前text中的内容而不是_text的内容所以需要等待一下yield return new WaitForEndOfFrame();// 获取Text生成器中的内容每行的索引、线高度、直线上Y的高度、这一行和下一行的距离MExpalinTextLine _component.cachedTextGenerator.lines;// 需要改变的字符序号int mChangeIndex -1;// 获得文本内容MExplainText new System.Text.StringBuilder(_component.text);for (int i 1; i MExpalinTextLine.Count; i){// 到最后一行了返回if (_component.text.Length MExpalinTextLine[i].startCharIdx)break;// 正则表达式判断首位是否有标点bool _b Regex.IsMatch(_component.text[MExpalinTextLine[i].startCharIdx].ToString(), strRegex);if (_b){mChangeIndex GetInsertPos(_component, MExpalinTextLine[i].startCharIdx - 1, MExpalinTextLine[i - 1].startCharIdx);// 在有标点的位置插入\n换行if (mChangeIndex 0)MExplainText.Insert(mChangeIndex, \n);}}_component.text MExplainText.ToString();}private int GetInsertPos(Text _component, int startCharIdx, int lastLineStartIdx){bool _b Regex.IsMatch(_component.text[startCharIdx].ToString(), strRegex);if (_b){startCharIdx _GetInsertPos(_component, startCharIdx - 1);if (startCharIdx lastLineStartIdx)startCharIdx 0;}return startCharIdx;}private int _GetInsertPos(Text _component, int startCharIdx){if (startCharIdx 0)return 0;bool _b Regex.IsMatch(_component.text[startCharIdx].ToString(), strRegex);if (_b){return _GetInsertPos(_component, startCharIdx - 1);}return startCharIdx;}
}效果 三、后记
如果觉得本篇文章有用别忘了点个关注关注不迷路持续分享更多Unity干货文章。 你的点赞就是对博主的支持有问题记得留言
博主主页有联系方式。
博主还有跟多宝藏文章等待你的发掘哦
专栏方向简介Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏分享一些制作小游戏的教程。Unity3D从入门到进阶入门从自学Unity中获取灵感总结从零开始学习Unity的路线有C#和Unity的知识。Unity3D之UGUIUGUIUnity的UI系统UGUI全解析从UGUI的基础控件开始讲起然后将UGUI的原理UGUI的使用全面教学。Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。Unity3D之数据集合数据集合数组集合数组、List、字典、堆栈、链表等数据集合知识分享。Unity3D之VR/AR虚拟仿真开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法插件介绍等Unity3D之日常开发日常记录主要是博主日常开发中用到的用到的方法技巧开发思路代码分享等Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中遇到的BUG和坑让后来人可以有些参考。