直接在面板上设置存在的问题:
1.协同开发时不便于他人配置修改
2.中英文输入字符数相同(eg:6字符限制:abcdef 或 一二三四五六),字符 统计不区分中英文,有时不符合设计需求 -.-
思路
1.现以中英文为例,英文字符在UTF-8的模式下只占1个字符,中文占2-5个字符,如果仅仅进行UTF-8的转换,中文字符占位会有问题。
abcdabcdabcd 12个字符你好呀哈12个字符你好呀哈你好
so,需要加个判断,把中文:英文的字数按1:2进行限制
int SingleCharTrans(char singChar){int leng = System.Text.Encoding.UTF8.GetBytes(singChar.ToString()).Length;if (leng >= 2){leng = 2;}return leng;}
2.使用inputfield.onValidateInput
,自定义每次输入时的回调函数,在输入框中的每次输入都进行判断,中文+英文的字符数超上限了就停止键入,返回'\0'
3.But,这样做,存在一个细节问题,假如现在输入框内的字符已经输入达上限了,我选中其中的一部分字符进行替换输入(类似重命名的操作时默认全选旧名字),是不能进行输入的,这样显然也不合理。因此还需要再增加选中内容重新输入这样的逻辑
实现方法:使用选中标记的前后位置判断,前后标记不同,则选中了内容,此时应该解除输入限制
第2,3步代码为:
inputfield = xxx.GetComponent<InputField>();inputfield.onValidateInput += OnDataInput;char OnDataInput(string text, int charIndex, char addedChar){if (inputfield.selectionAnchorPosition > inputfield.selectionFocusPosition){return addedChar;}if (GetTransCharNum(text) + GetTransCharNum(addedChar.ToString()) > m_maxLimit){return '\0'; //返回空}return addedChar;}int GetTransCharNum(string text){int totalNum = 0;char[] alrText = text.ToCharArray();foreach (var item in alrText){totalNum += SingleCharTrans(item);}return totalNum;}
把上面代码放在一起,根据自己项目调试下就可以使用了。
参考链接:Unity之TMP_InputField-输入字符数限制_彩色墨水的博客-CSDN博客