Unity敏感词屏蔽

来源:互联网 发布:color for mac 编辑:程序博客网 时间:2024/04/27 15:32

Unity敏感词屏蔽
分享一个之前自己写的小例子,我们知道广电关于应用程序的版号审核是
需要进行敏感词审核,所有应用程序中的文字都不能涉及到敏感词汇,所
以敏感词汇的处理是多数应用开发者都会遇到的一个问题,解决方法不尽
相同,在这里分享一下个人在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

1 0
原创粉丝点击