unity版本:unity2017.1.5f1ios
復現步驟:InputField在安卓手機InputField連續輸入兩個emoji會報錯app
報錯內容:spa
2020-01-08 19:56:38.366 22894-22931/? E/Unity: ArgumentOutOfRangeException: Argument is out of range. Parameter name: index at System.Collections.Generic.List`1[UnityEngine.UICharInfo].get_Item (Int32 index) [0x00000] in <filename unknown>:0 at UnityEngine.UI.InputField.SetDrawRangeToContainCaretPosition (Int32 caretPos) [0x00000] in <filename unknown>:0 at UnityEngine.UI.InputField.UpdateLabel () [0x00000] in <filename unknown>:0 at UnityEngine.UI.InputField.SendOnValueChangedAndUpdateLabel () [0x00000] in <filename unknown>:0 at UnityEngine.UI.InputField.LateUpdate () [0x00000] in <filename unknown>:0 (Filename: Line: -1)
看報錯 可看出是一個長度越界的錯,結合代碼內容和bug復現,發現報錯老是發生在輸入兩個emoji時,也就是在輸入時獲取字符長度報錯。.net
查閱資料,發如今ios上不會出現這樣的問題3d
iOS: Added a compile flag in the trampoline code in order to allow the user to disable the filtering of emoji characters.blog
所以只須要處理安卓的便可unicode
參考了幾位大佬的總結:字符串
Unity之輸入框屏蔽Emoji表情
各類字符的unicode區間
結合官方給的get
Emoji Unicode Tables
字符類
總結一下,就是過濾掉emoji的輸入
方法:經過監聽InputField的輸入,獲取當前輸入字符串內容,經過正則匹配,發現有emoji,直接替換爲空字符串
達到過濾emoji輸入的功能。
核心代碼以下:
List<string> patten = new List<string>() { @"\p{Cs}", @"\p{Co}", @"\p{Cn}", @"[\u2702-\u27B0]" }; private string FilterEmoji(string str) { for (int i = 0; i < patten.Count; i++) { str = Regex.Replace(str, patten[i], "");//屏蔽emoji } return str; }
這裏屏蔽了絕大多數emoji 可根據本身需求放寬匹配規則。