Unity 处理预设中的中文
Unity 处理预设中的中文
需求由来
- 项目接入越南版本
 
需要解决的文本问题
- 获取UI预设Label里面的中文(没被代码控制)提供给越南
 - Label里面的中文替换成越南文
 
解决流程
迭代获取Assets目录下所有文件
获取所有的.prefab预设文件
加载预设文件
获取预设下所有的UILabel组建
判断UILabel中的值是否为中文
把所有的中文实例化成文本
替换成越南文
保存实例化对象为预设文件
销毁实例化对象
实现代码
- 获取UI预设Label里面的中文
 
[MenuItem("检查预设中文并且生成文本")]
    static void CheckChinesePrefabsAndSerialization()
    {
        List<string> paths = GetAllFilePaths();
        List<string> prefabPaths = GetAllPrefabFilePaths(paths);
        if (prefabPaths == null)
        {
            return;
        }
        List<string> text = new List<string>();
        for (int i = 0; i < prefabPaths.Count; i++)
        {
            string prefabPath = prefabPaths[i];
            //修改路径格式
            prefabPath = ChangeFilePath(prefabPath);
            AssetImporter tmpAssetImport = AssetImporter.GetAtPath(prefabPath);
            GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(tmpAssetImport.assetPath);
            if (prefab == null)
            {
                continue;
            }
            UILabel[] uiLabels = prefab.GetComponentsInChildren<UILabel>(true);
            for (int j = 0; j < uiLabels.Length; j++)
            {
                UILabel uiLabel = uiLabels[j];
                if (IsIncludeChinese(uiLabel.text))
                {
                    Debug.LogError(string.Format("路径:{0} 预设名:{1} 对象名:{2} 中文:{3}", prefabPath, prefab.name, uiLabel.name, uiLabel.text));
                    text.Add(uiLabel.text);
                }
            }
            //进度条
            float progressBar = (float)i / prefabPaths.Count;
            EditorUtility.DisplayProgressBar("检查预设中文", "进度 :" + ((int)(progressBar * 100)).ToString() + "%", progressBar);
        }
        SerializationText(Application.dataPath + "/中文.txt", text);
        EditorUtility.ClearProgressBar();
        AssetDatabase.Refresh();
        Debug.Log("完成检查预设中文并且生成文本");
    }
- Label里面的中文替换成越南文
 
    [MenuItem("ZouQiang/Prefab(预设)/检查预设中文并且替换为越南文")]
    static void CheckChinesePrefabsAndReplaceChinese()
    {
        List<string> paths = GetAllFilePaths();
        List<string> prefabPaths = GetAllPrefabFilePaths(paths);
        if (prefabPaths == null)
        {
            return;
        }
        for (int i = 0; i < prefabPaths.Count; i++)
        {
            string prefabPath = prefabPaths[i];
            //修改路径格式
            prefabPath = ChangeFilePath(prefabPath);
            AssetImporter tmpAssetImport = AssetImporter.GetAtPath(prefabPath);
            GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(tmpAssetImport.assetPath);
            if (prefab == null)
            {
                continue;
            }
            GameObject obj = Instantiate(prefab) as GameObject;
            UILabel[] uiLabels = obj.GetComponentsInChildren<UILabel>(true);
            bool isChange = false;
            for (int j = 0; j < uiLabels.Length; j++)
            {
                UILabel uiLabel = uiLabels[j];
                if (IsIncludeChinese(uiLabel.text))
                {
                    Debug.LogError(string.Format("路径:{0} 预设名:{1} 对象名:{2} 中文:{3}", prefabPath, prefab.name, uiLabel.name, uiLabel.text));
                    uiLabel.text = "越南文";
                    isChange = true;
                }
            }
            if (isChange)
            {
                PrefabUtility.ReplacePrefab(obj, prefab, ReplacePrefabOptions.ReplaceNameBased);
            }
            DestroyImmediate(obj);
            //进度条
            float progressBar = (float)i / prefabPaths.Count;
            EditorUtility.DisplayProgressBar("检查预设中文并且替换为越南文", "进度 :" + ((int)(progressBar * 100)).ToString() + "%", progressBar);
        }
        EditorUtility.ClearProgressBar();
        AssetDatabase.Refresh();
        Debug.Log("检查预设中文并且替换为越南文");
    }
相关代码接口
- 迭代获取目录下所有文件路径
 
public static void IterationGetFilesPath(string directory, List<string> outPaths)
    {
        string[] files = Directory.GetFiles(directory);
        outPaths.AddRange(files);
        string[] childDirectories = Directory.GetDirectories(directory);
        if (childDirectories != null && childDirectories.Length > 0)
        {
            for (int i = 0; i < childDirectories.Length; i++)
            {
                string dir = childDirectories[i];
                if (string.IsNullOrEmpty(dir)) continue;
                IterationGetFilesPath(dir, outPaths);
            }
        }
    }
- 获取项目Assets下所有文件路径
 
    public static List<string> GetAllFilePaths()
    {
        List<string> paths = new List<string>();
        IterationGetFilesPath(Application.dataPath, paths);
        return paths;
    }
- 获取所有预设文件路径
 
    public static List<string> GetAllPrefabFilePaths(List<string> paths)
    {
        if (paths == null)
        {
            return null;
        }
        List<string> prefabPaths = new List<string>();
        for (int i = 0; i < paths.Count; i++)
        {
            string path = paths[i];
            if (path.EndsWith(".prefab") == true)
            {
                prefabPaths.Add(path);
            }
            //进度条
            float progressBar = (float)i / paths.Count;
            EditorUtility.DisplayProgressBar("获取所有预设文件路径", "进度 : " + ((int)(progressBar * 100)).ToString() + "%", progressBar);
        }
        EditorUtility.ClearProgressBar();
        return prefabPaths;
    }
- 是否包含是否有中文
 
    public static bool IsIncludeChinese(string content)
    {
        string regexstr = @"[\u4e00-\u9fa5]";
        if (Regex.IsMatch(content, regexstr))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
- 改变路径 例如 "C:/Users/XX/Desktop/aaa/New Unity Project/Assets\a.prefab" 改变成 "Assets/a.prefab"
 
    public static string ChangeFilePath(string path)
    {
        path = path.Replace("\\", "/");
        path = path.Replace(Application.dataPath + "/", "");
        path = "Assets/" + path;
        return path;
    }
- 序列化
 
    public static void SerializationText(string filePath, List<string> content)
    {
        if (content == null)
        {
            return;
        }
        FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite);
        StreamWriter streamWriter = new StreamWriter(fileStream);
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < content.Count; i++)
        {
            stringBuilder.AppendLine(content[i]);
        }
        streamWriter.Write(stringBuilder);
        streamWriter.Close();
    }
												
											Unity 处理预设中的中文的更多相关文章
- Unity 4.0 中的新动画系统——MecAnim
		
分享一个文档资料,关于动画系统的,版本应该很老了,但是有借鉴意义的: Unity 4.0 已于 2012 年 11 月 15 日正式发布,Unity 每一次版本的提升,都给游戏开发者带来惊喜,这一次也 ...
 - Unity 5.6中的混合光照(下)
		
https://mp.weixin.qq.com/s/DNQFsWpZm-ybIlF3DTAk2A 在<Unity 5.6中的混合光照(上)>中,我们介绍了混合模式,以及Subtracti ...
 - MAC下 mysql不能插入中文和中文乱码的问题总结
		
MAC下 mysql不能插入中文和中文乱码的问题总结 前言 本文中所提到的问题解决方案,都是基于mac环境下的,但其他环境,比如windows应该也适用. 问题描述 本文解决下边两个问题: 往mysq ...
 - sqlServer去除字段中的中文
		
很多时候数据库表中某些字段是由中文和字母或数字组成,但有时我们又需要将字段中的中文去掉.想要实现这种需求的方法有很多,下面就是其中一种解决方法. 首先我们先建立测试数据 create table te ...
 - C# 删除字符串中的中文
		
/// <summary> /// 删除字符串中的中文 /// </summary> public static string Delete中文(string str) { s ...
 - 在MySQL向表中插入中文时,出现:incorrect string value 错误
		
在MySQL向表中插入中文时,出现:incorrect string value 错误,是由于字符集不支持中文.解决办法是将字符集改为GBK,或UTF-8. 一.修改数据库的默认字符集 ...
 - lua中的中文乱码
		
最近在用lua, 发现一个有点意思的槽点啊-____-! 那就是lua貌似会使用系统所用的字符集. 具体点说, 就是在windows上, 它会使用cp936来表示代码中的中文. 来个例子: print ...
 - URL地址中使用中文作为的参数【转】
		
原文:http://blog.csdn.net/blueheart20/article/details/43766713 引言: 在Restful类的服务设计中,经常会碰到需要在URL地址中使用中文作 ...
 - PHP往mysql数据库中写入中文失败
		
该类问题解决办法就是 在建立数据库连接之后,将该连接的编码方式改为中文. 代码如下: $linkID=@mysql_connect("localhost","root&q ...
 
随机推荐
- “AS3.0高级动画编程”学习:第四章 寻路(AStar/A星/A*)算法 (下)
			
在前一部分的最后,我们给出了一个寻路的示例,在大多数情况下,运行还算良好,但是有一个小问题,如下图: 很明显,障碍物已经把路堵死了,但是小球仍然穿过对角线跑了出来! 问题在哪里:我们先回顾一下ASta ...
 - 关于EL表达式随笔记录
			
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
 - FortiGate端口聚合配置
			
1.端口聚合(LACP)应用场景 该功能高端设备上支持,FortiGate60D.FortiGate90D和FortiGate240D等低端型号不支持. 1.在带宽比较紧张的情况下,通过逻辑聚合可以扩 ...
 - includes() 方法
			
字符串的includes()和数组中的includes()判断有没有括号里面的值,有的话为true,没有为false. 详细解析:https://blog.csdn.net/wu_xianqiang/ ...
 - python基础(二)列表与字典
			
列表list-数组stus=['苹果','香蕉','橘子','红枣',111.122,]# 下标 0 1 2 3 4#下标,索引,角标#print(stus[4]) #st=[]#空list#st=l ...
 - iview表格高度自适应只需要三步即可
			
1. 需要增加到table表格里的 highlight-row :height="tableHeight" ref="table" 2.在return 定义一个 ...
 - 微信小程序之---- 数据处理
			
exports 关键字 .wxs 通过该属性,可以对外共享本模块的私有变量与函数 使用步骤 1. 在 .wxs后缀文件 exports定义参数 var foo = "'hell ...
 - Base64加密转换原理与代码实现
			
一.Base64实现转换原理 它是用64个可打印字符表示二进制所有数据方法.由于2的6次方等于64,所以可以用每6个位元(bit)为一个单元,对应某个可打印字符.我们知道三个字节(byte)有24个位 ...
 - db2实现递归调用 机构等树形数据结构形成
			
WITH n(lev,ID, NAME, PORGID, ORG_ID_TREE) AS (SELECT 0,ID, NAME, PORGID, CAST(ID AS VARCHAR(1024)) F ...
 - 教你轻松快速学会用Calibre TXT转MOBI
			
教你轻松快速学会TXT转为有目录的MOBI###授人以渔,lllll5500制作### 需使用软件按先后顺序如下:一.排版助手 官网http://www.gidot.net/typesetter/二. ...