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 ...
随机推荐
- DB2(Procedure)存储过程遍历循环!
有时候一些复杂的业务逻辑将要通过存储过程的循环语句进行处理;以下列出2种DB2存储过程的循环语句,方便以后的查看并使用! 推荐第一种方式的使用,最大的优点就是比较直观;在需要操作很多字段的情况下,不需 ...
- C++ 常见术语及解释
RAII(Resource Acquisition Is Initialization) 资源获取就是初始化 RTTI(Run-time type information) 运行时类型信息 RVO(R ...
- 禁止 pdf 下载、打印的方法
https://blog.csdn.net/For_GG/article/details/78616063 https://blog.csdn.net/xiangcns/article/details ...
- Django中操作Redis
一 创建redis连接池 redis_pool.py pool = redis.ConnectionPool(host='10.211.55.4', port=6379) 二 引入连接池 import ...
- 通过Solr所提供的Dataimporthandler实现数据源的导入
如需要使用到Solr中的dataimporthandler增量导入功能,则还需要引入两个所依赖的jar包,在上一篇随笔中所提到的下载的Solr项目文件solr-4.10.3\dist目录下可以找到所依 ...
- ArcGIS for JS 离线部署
本文以arcgis_js_v36_api为例,且安装的是IIS Web服务器 1.下载最新的ArcGIS for JS api 包,可在Esri中国社区或者Esri官网下载 2.下载后解压 3.将解压 ...
- solr7.7.0搜索引擎使用(一)(下载安装)
一.下载安装 可以直接在官网下载地址:https://lucene.apache.org/solr/ 解压之后,目录结构如下图,bin里边提供部署的文件,contrib提供额外的jar包,docs提供 ...
- 2019.02.26 bzoj4311: 向量(线段树分治+凸包)
传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...
- tomcat 配置图片服务器
在后台和前端交互时,遇到了后台存储的图片,前端根据地址无法访问,使用Tomcat搭建图片服务器 1.找到tomcat下的server.xml文件 2.配置文件下加入service节点(在原有的serv ...
- mac开发常用工具和插件记录
1.alfred 是 Mac 系统上一款专注于效率提升的著名应用,它能帮你快速打开网页.快速进行自定义搜索.查看剪贴板历史.快速查询单词等等.Alfred 提供的功能虽然很多,但目的只有一个 —— 那 ...