Unity敏感词屏蔽方法
发表于2018-11-02
现在广电对于应用程序的版号审核都比较严格,需要进行敏感词审核,所有应用程序中的文字都不能涉及到敏感词汇,所以敏感词汇的处理是多数应用开发者都会遇到的一个问题,解决方法有很多种,这里就给大家分享下在Unity中的处理方法。
先说一下一些必要的知识:
关于Unity3D中的资源路径
Application.dataPath 此属性用于返回程序的数据文件所在文件夹的路径。例如在Editor中就是Assets了。
Application.streamingAssetsPath 此属性用于返回流数据的缓存目录,返回路径为相对路径,适合设置一些外部数据文件的路径。放在Unity工程StreamingAssets文件夹中的资源发布后都可以通过这个路径读取出来。
Application.persistentDataPath 此属性用于返回一个持久化数据存储目录的路径,可以在此路径下存储一些持久化的数据文件。
Application.temporaryCachePath 此属性用于返回一个临时数据的缓存目录。
关于Unity3D中的WWW类
WWW类是一个Unity开发中非常常用到的工具类,主要提供一般Http、Ftp、File访问的功能(其中我们使用到的是File,访问本地文件功能),以及动态从网上下载图片、声音、视频Unity资源等。
首先,来看看要进行屏蔽的敏感词汇的处理,我们需要把敏感词汇(敏感词汇文件可自行进行百度)放在一个txt文件里,并且将其另存为UTF8编码格式,如图:
OK,完成之后,在Unity工程中新建一个名为StreamingAssets的文件夹,把我们刚刚编辑好的txt文件拖到该文件夹下。
接下来,简单创建两个UI,一个为Image+text,另一个是InputFiled
其中的IntFiled将接受我们的输入,并进行敏感词汇检测。
创建一个C#脚本,名字随便起,挂在InputFiled下面。
代码如下:
using UnityEngine.UI; using System.IO;//首先,引入IO流命名空间和UI
string[] SentiWords = null;//定义一个接受文件内容的字符串数组
/// <summary> /// 使用一个协程来进行文件读取 /// </summary> /// <returns></returns> IEnumerator LoadWWW() { WWW www; //不同平台下StreamingAssets的路径是不同的,这里需要注意一下。 if (Application.platform == RuntimePlatform.Android) { www = new WWW(Application.streamingAssetsPath + "/" + "SensitiveWords1.txt"); } else { www = new WWW("file://" + Application.streamingAssetsPath + "/" + "SensitiveWords1.txt"); } yield return www; if (!(www.Equals("") || www.Equals(null))) { Debug.Log(www.text); //将读取到的字符串进行分割后存储到定义好的数组中 SentiWords = www.text.Split('、'); } }
//在Start()函数中开启协程加载文件 void Start () { StartCoroutine("LoadWWW"); //添加输入事件监听 transform.GetComponent<InputField>().onValueChanged.AddListener(OnValueChanged); }
/// <summary> /// 监听方法,该方法会在监测到输入值改变时被触发 /// </summary> /// <param name="t"></param> 参数为当前输入的值 public void OnValueChanged(string t) { if (SentiWords == null) return; foreach (string ssr in SentiWords) { if (t.Contains(ssr)) { if (!ssr.Equals("")) { Debug.Log("包含敏感词汇:" + ssr + ",需要进行替换"); string stt = transform.GetComponent<InputField>().text; int length = ssr.ToCharArray().Length; string s = ""; for (int i = 0; i < length; i++) s += "*"; Debug.Log(stt.Replace(ssr, s)); stt = stt.Replace(ssr, s); transform.GetComponent<InputField>().text = stt; } } // Debug.Log(ssr); } } > 这里需要说明的一点是string类中的静态方法Replace(sting oldValue, string newValue),该方法并不会改变原字符串的值, 而是会返回一个替换后的字符串,参数oldValue和newValue的意义是返回值中 原来包含的oldValue将会被替换为newValue,例如: > string str = "南京,北京"; > string s = str.Replace("北京", "上海"); > 这两句话执行之后,我们得到s的值为"南京,上海",而str的值并不会发生改变,依然是"南京,北京"。
OK,完成这些之后,来测试一下……
最后,附上Demo程序和源代码链接:
链接:http://pan.baidu.com/s/1kUL5szl 密码:9kpz
来自:https://blog.csdn.net/strugglebydreamlin/article/details/52673831