unity inputfield 过滤emoji输入

摘要:
查阅数据后,我发现在ios上不会出现这样的问题https://unity3d.com/unity/qa/patch-releases/5.3.4p1?

unity版本:unity2017.1.5f1

复现步骤:InputField在安卓手机InputField连续输入两个emoji会报错

报错内容:

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时,也就是在输入时获取字符长度报错。

查阅资料,发现在ios上不会出现这样的问题

https://unity3d.com/unity/qa/patch-releases/5.3.4p1?_ga=2.154473848.1772582649.1578484654-1798539839.1575364585

iOS: Added a compile flag in the trampoline code in order to allow the user to disable the filtering of emoji characters.

因此只需要处理安卓的即可

参考了几位大佬的总结:

Unity之输入框屏蔽Emoji表情各种字符的unicode区间

结合官方给的

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 可根据自己需求放宽匹配规则。

免责声明:文章转载自《unity inputfield 过滤emoji输入》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Fabric中多租户之间的数据隔离latex之插入伪代码 [转]下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

unity 在移动平台中,文件操作路径详解

今天,这篇文章其实是个老生常谈的问题咯,在网上类似的文章也比比皆是,在此我只是做个详细总结方便大家能够更好、更快的掌握,当然,如有不足的地方 欢迎指正!!!相信大家在开发过程中,难免会保存一些文件在客户端进行本地化操作。如:配置文件,状态文件,Assetbundle文件等等...最近总有人问我:1.保存了一个xml在客户端,能读取里面的数据,可是不能修改,...

unity Physics.BoxCast说明

public static bool BoxCast (Vector3 center, Vector3 halfExtents, Vector3 direction, Quaternion orientation= Quaternion.identity, float maxDistance= Mathf.Infinity, int layerMask=...

Unity3d—GUI按钮控件

这是自己的第一篇记录自己的技术文章,自己还是个菜鸟,有错误之处还望大家能够多多指点。1、在project视图中创建C#脚本,我命名为 Gui_test 2、然后打开该脚本,输入以下代码:1 usingSystem.Collections; 2 usingSystem.Collections.Generic; 3 usingUnityEngine; 4...

Unity依赖注入使用详解

关于控制反转(Inversion of Control)和依赖注入(Dependency Injection)大家网上可以找下相关概念,在《小菜学习设计模式(五)—控制反转(Ioc)》这篇文章中本人也有详细的解释,这边再说明下,有很多人把控制反转和依赖注入混为一谈,虽然在某种意义上来看他们是一体的,但好像又有些不同,就比如在上篇文章中所提到的示例。控制反转...

Unity3D获取系统当前时间,并格式化显示

Unity 获取系统当前时间,并格式化显示。通过“System.DateTime”获取系统当前的时间,然后通过格式化把获得的时间格式化显示出来,具体如下: 1、打开Unity,新建一个空工程,Unity界面如下图 2、在工程中新建一个脚本,可以命名为“CurrrentTimeTest”,选中“CurrrentTimeTest”,双击打开脚本。 3、在打...

unity 游戏第一次安装完之后运行,切出来,点击桌面图标后黑屏问题

unity 游戏第一次安装完之后运行,切出来,点击桌面图标后黑屏问题 这个问题只会在第一次出现,之后就是桌面进入了,不会再出现这个问题了 这是一个解决办法吧: 就是将安装之后运行的游戏杀死,然后在重新进入游戏,  // 在onCreate()最前面添加一下代码 if (!isTaskRoot()) { final Intent intent = g...