博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity项目中文字的统一管理
阅读量:5961 次
发布时间:2019-06-19

本文共 4815 字,大约阅读时间需要 16 分钟。

一款游戏在研发初期就需要考虑多语言的问题,否则后期在进行多国语言版本时就面临着巨大的成本。鉴于之前页游的经验,其它同事设计出读取Excel的方式来管理所有的文字。但是我在使用中发现很致使的一个问题,当多人编辑一个Excel时,冲突了就很麻烦,解决起来的成本还蛮高的。

 

之后我想了一些办法,例如搭建一个web站点,将所有的字符串 Key、Value保存到数据库中,避免冲突,方便去查询。但感觉还是太过麻烦,成本略高。然后就想到一个办法,既然读取一个Excel容易冲突,那我就弄多个文件,一个人编辑一个Excel,这样总不会冲突了吧。然后添加 Key 的时候,先查找 Key是否存在,如果存在就提醒添加者。

 

这样问题就变成从读取单个文件变成遍历一个文件夹下的文件。因为Excel在打开时,会生成一个临时文件并被占用,所以不可以对它进行操作(如复制)。

using System;using UnityEditor;using UnityEditor.UI;using UnityEngine;using UnityEngine.UI;using System.IO;using OfficeOpenXml;using System.Collections.Generic;using System.Text.RegularExpressions;namespace xxxx{    [InitializeOnLoad]    public class StringsWatcher    {        static string stringsPath;        static DateTime lastModifyTime;        static string stringsFolderPath;        static StringsWatcher()        {            stringsFolderPath = Path.GetDirectoryName(Application.dataPath);            stringsFolderPath = Path.Combine(stringsFolderPath, "strings");            // 创建Strings文件夹            if (!Directory.Exists(stringsFolderPath))            {                Directory.CreateDirectory(stringsFolderPath);            }            // stringsPath = Path.GetFullPath(Path.Combine(rootPath, "Strings.xlsx"));            EditorApplication.update += Update;        }        static void Update()        {            if (EditorApplication.isPlaying || EditorApplication.isCompiling) return;            //if (!File.Exists(stringsPath)) return;            if (!Directory.Exists(stringsFolderPath)) return;            DateTime time = Directory.GetLastWriteTime(stringsFolderPath);            if (lastModifyTime == time) return;            lastModifyTime = time;            Debug.Log("Reloading " + stringsFolderPath + ", Time : " + time.ToString());            DateTime startTime = DateTime.Now;            // ExcelPackage package = new ExcelPackage(new FileInfo(tempFile));            List
keys = new List
(); List
values = new List
(); // 遍历 strings 目录下的excel文件 DirectoryInfo folder = new DirectoryInfo(stringsFolderPath); foreach (FileInfo fileItem in folder.GetFiles()) { string strFileType = fileItem.Extension; // 如果是 excel 文件且不是临时文件, 临时文件以~$开关,读取临时文件会报错误:Invaliddataexception the file is not an valid package file if (new Regex(@"^[^~]+\.xlsx$").IsMatch(fileItem.Name.ToLower())) { string tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); File.Copy(fileItem.FullName, tempFile); //Debug.Log(fileItem.Name + ", " + tempFile); ExcelPackage package = new ExcelPackage(new FileInfo(tempFile)); ExcelWorksheet sheet = package.Workbook.Worksheets[1]; int rows = sheet.Dimension.Rows; for (int row = 2; row <= rows; row++) { object keyObj = sheet.Cells[row, 1].Value; object valueObj = sheet.Cells[row, 2].Value; // Valid key and value is null or not. if (keyObj == null) { Debug.LogError("Find Key is null. fileName : " + fileItem.Name + ", rowIndex : " + row); return; } if (valueObj == null) { Debug.LogError("Find Key is null. fileName : " + fileItem.Name + ", rowIndex : " + row); return; } // Find key is Exist or not if (keys.Find(x => x == keyObj.ToString()) != null) { Debug.LogError("Find Report Key. fileName : " + fileItem.Name + ", rowIndex : " + row); return; } string key = keyObj.ToString(); string value = valueObj.ToString(); keys.Add(key); values.Add(value); } // 每删除一个文件大约多0.1秒 File.Delete(tempFile); } // 更新内存的数据,重新保存assets AssetDatabase.SaveAssets(); } DateTime endTime = DateTime.Now; Debug.Log("Rebuild string.assets time : " + (endTime - startTime).TotalSeconds + "s"); } }}

 

如果你读取Excel时遇到了 Invaliddataexception the file is not an valid package file ,上面的代码或许对你有所帮助。

 

除了文字外,游戏项目中还需要管理的就是带有文字的UI图片,这个也需要提前进行约定,制定相关的规范。

转载于:https://www.cnblogs.com/meteoric_cry/p/7772084.html

你可能感兴趣的文章
IOS控件 Tableview 下拉刷新,加载数据
查看>>
log4j 2使用教程
查看>>
centos 安装pip
查看>>
我的友情链接
查看>>
rhel5下ORACLE 10g之ASM创建
查看>>
Java基础学习总结(19)——Java环境变量配置
查看>>
关于Notice: Undefined index:问题解决方法
查看>>
MyBatis学习总结(9)——使用MyBatis Generator自动创建代码
查看>>
MyBatis学习总结(六)——调用存储过程
查看>>
利用rrdcached优化ganglia IO
查看>>
开源史上最成功的8个开源产品
查看>>
JNDI学习总结(1)——JNDI入门
查看>>
2015年终总结
查看>>
使用Emacs阅读邮件和新闻组:Gnus 中文FAQ
查看>>
支付宝 iOS SDK 的简单使用
查看>>
锐捷RG-12010交换机VSU虚拟化配置
查看>>
在JSP页面中调用另一个JSP页面中的变量
查看>>
CISCO路由与交换笔记
查看>>
构建基于postfix+dovecot+squirrelmail的邮件服务器
查看>>
CDN+DNS主从/视图+squid反向代理+nginx负载均衡+httpd/nginx/tomcat网站搭建+iscsi后端存储...
查看>>