Unity敏感词屏蔽方法

发表于2018-11-02
评论0 7.2k浏览
现在广电对于应用程序的版号审核都比较严格,需要进行敏感词审核,所有应用程序中的文字都不能涉及到敏感词汇,所以敏感词汇的处理是多数应用开发者都会遇到的一个问题,解决方法有很多种,这里就给大家分享下在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

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引