好久没写博客了,今天趁着还在排魔兽副本的功夫上来写一篇!

由于之前没有经验,这个项目在做的时候,在多语言文本管理这方面做得很差,到了后期字符串基本成了一个无法管理的状态,随便要改点什么字都需要在一个存了所有游戏文本的5000多行的巨大txt中搜索,极其不便;而且有相当多的字符串是已经在游戏中删除掉的废字符串,但却依然停留在文本文档中。所以我想要总结一下经验,参考一些其他游戏的做法,看看能否用更好的方式来解决这个问题。

首先第一个要解决的问题是,如何让程序自动对应不同版本的语言?在设计界面的时候一定要方方面面都把这个考虑进去,否则一定会出问题,比如显示中文刚刚好,显示英文却太长了。不过这不是本文的重点。我们需要用ID来管理所有文本,比如说我们有个英雄,英雄的ID是100,他的说明文字就可能是hero_100_description之类的。ID的这种命名方式对于程序来说没有意义,不管是hero_100_description还是GameStringS1293IU634EASD,对于程序都可以正常运行,但采用后者会让字符串的可读性相当差,因此最好由策划来手动为所有需要用到的文本ID进行命名——就像美术人员会为所有美术资产命名一样。这种命名的好处还能让你轻易地剔除掉已经不再使用的废字符串。

ID可以按照统一的模块来起名(横向的),也可以按照实际的程序结构来起名(纵向的),个人建议采用后者的方式。假如按照前者的话,我们有可能将所有的UI使用到的文字都写作一样的内容,比如都叫UI_Title_XXX,但实际上游戏并不需要同时加载所有UI的文本,每个界面要用到的都很有限,因此按照程序结构来划分会更科学一些,这需要与游戏程序一同进行设计。不过由于纯文本文件往往都很小,不像美术资产一样会占用大量内存,因此在确保没问题的情况下偷懒一下,在任何地方都加载所有文本也可能可以,这还是需要看程序方面的意见。

ID的名字在允许的情况下,为了可读性,可以起的尽量的长,这需要与程序一同设计。比如,UI_MainMenu_NewGameButton_Normal,就说明了这个文字是用于显示UI的,是在主菜单用到的,是“新游戏”按钮在默认情况下的文字,二手游戏账号买卖这种清晰易懂的名字无论是程序在代码中还是策划在文本管理中都会让工作轻松得多。

如果需要制作新内容的时候,策划可以先添加所有需要的文本及其ID,再让程序制作,流程上也会更顺畅一些。如果某个字符串没有填写,则直接在游戏中显示其ID,这样能在游戏中轻易地发现是哪个字符串忘写了。

当某些东西的结构固定时,甚至可以统一、批量地先由程序生成ID,再有策划进行填写——比如英雄有100个,每个英雄都有描述,程序就可以先把hero_001_description到hero_100_description直接做到游戏中——《星际争霸2》就是这么干的。

如果字符串需要换行,建议使用在单个string中加入诸如\n的方法,而不是使用多个string,因为同一句话不同语言显示出来行数往往不一样,如果用多个string的话ID管理会变得相当混乱,很可能中文一共有5000个ID而英文却有5010个ID,具体多了哪10个就是个要命的事情。文本的样式管理应该和程序、美术一同进行设计,尽量把文本的样式也写进string中再由程序解析,比如:

  1. <string><c value = “FF0000″>我是一个红色的文本</c></string>
  2. <string><b><c value = “FF0000″>我是一个红色加粗的文本</c></b></string>
  3. <string><size = 24><b><c value = “FF0000″>我是一个红色加粗的24磅的文本</c></b></size></string>

复制代码

这样做法的好处是在保留一定可读性的前提下,修改文本样式不再需要程序的协助,能够大大降低开发过程中的沟通成本。实际上这也是《星际争霸2》的做法。

不过笔者认为,《星际争霸2》也有不值得学习的地方,就是其不同语言文本的文件结构。由于该游戏支持相当多的语言,因此他们的做法是把不同的语言文本完全分离在不同的文件中,比如中文文本都存在zhCN中,英文文本都存在enUS中等等,这样的问题就是在两个文件中,我们都要以“ID+String”的方式进行管理,无法确保ID的唯一性。因此相比之下我更倾向于《魔兽世界》插件或者《炉石传说》的结构,将不同语言的文本全都放在同一个文件中,这对于策划以及游戏翻译外包来说是都是相当舒服的事情,下面是例子:

《魔兽世界》插件的多语言(以Decursive为例子):

  1. ## Title: Decursive |cffff00ff -Ace3-|r
  2. ## Notes: Afflictions display and cleaning for solo, group and raid with advanced filtering and priority system.
  3. ## Notes-frFR: Affichage et guérison des affections avec un système évolué de filtrage et de priorité.
  4. ## Notes-deDE: Anzeige und Reinigung von Gebrechen für Solo, Gruppe und Schlachtzug mit erweitertem Filter- und Prioritäten-System.
  5. ## Notes-esES: Afflictions display and cleaning for solo, group and raid with advanced filtering and priority system.
  6. ## Notes-esMX: Afflictions display and cleaning for solo, group and raid with advanced filtering and priority system.
  7. ## Notes-koKR: 쏠로, 파티, 공격대를 위한 고급화된 필터링과 시스템 우선권으로 고통들의 표시와 제거를 합니다.
  8. ## Notes-ruRU: Отображение и инструменты для развеивания дебаффов для одиночной игры, игры в группе и рейде, с развитой системой фильтрации и приоритетов.
  9. ## Notes-zhCN: 当单独、小队和团队时清除有害状态,并可使用高级过滤和优先等级系统。
  10. ## Notes-zhTW: 當單獨、小隊和團隊時清除有害狀態,並可使用高級過濾和優先等級系統。
  11. ## Notes-ptBR: Afflictions display and cleaning for solo, group and raid with advanced filtering and priority system.
  12. ## Notes-itIT: Afflictions display and cleaning for solo, group and raid with advanced filtering and priority system.

复制代码

炉石传说的例子:

  1. <Tag name=”FlavorText” enumID=”351″ type=”String”>
  2. <enUS>Hogger is super powerful. If you kill him, it’s because he <i>let</i> you.</enUS>
  3. <zhTW>霍格非常強。如果你殺死他,那是因為他<i>讓</i>你殺他。</zhTW>
  4. <zhCN>霍格可是超级厉害的。如果你杀了他,只是因为他让你这么做的。</zhCN>
  5. <ruRU>Дробитель ужасно сильный. Если вы убьете его, то это значит, что он вам <i>поддался</i>.</ruRU>
  6. <ptBR>Hogger é superpoderoso. Se conseguir matá-lo, foi porque ele <i>deixou</i>.</ptBR>
  7. <plPL>Wyżer jest supermocny. Jeśli go zabijesz, to tylko dlatego, że ci na to <i>pozwolił</i>.</plPL>
  8. <koKR>들창코는 정말 강력합니다. 만약 처치했다면, 그가 <i>봐줬기</i> 때문입니다.</koKR>
  9. <itIT>Boccalarga è potentissimo. Se lo uccidi è solo perché lui te lo ha permesso.</itIT>
  10. <frFR>Lardeur est super fort. Si vous réussissez à le tuer, c’est uniquement parce qu’il vous aura <i>laissé</i> faire.</frFR>
  11. <esMX>Hogger es muy poderoso. Si lo matas, es porque <i>él</i> así lo quiso.</esMX>
  12. <esES>Hogger ya se ha cobrado más víctimas que el Cataclismo.</esES>
  13. <deDE>Hogger ist so mächtig, dass Ihr ihn nur töten könnt, wenn er Euch <i>lässt</i>.</deDE>
  14. </Tag>

复制代码

不过这种做法也有一个难题,就是如果新加一个语种的话会影响到之前的所有结构,所以无论采取哪种结构,最好都有文本管理工具,而不是直接手写txt。但比起传统而常见的每个语言一个文件其中把所有系统需要的文本都丢进去,我更倾向于按照系统划分文本文件,然后把所有语言的丢进同一个文本中。当然了,这还是要看程序是如何设计的,以及游戏的过程中是否支持切换语言。

游戏开发中的多语言文本管理相关推荐

  1. 游戏开发中的多语言处理

    前言 之前我写过一遍<数据表的使用>的文章,今天继续用文本处理为例讲解一下数据表导出工具的使用和多语言的使用方式. 编写数据表 我们先定义一个UI文本表,写好表头,添加几个测试用对本文,注 ...

  2. 游戏开发中常用的设计模式 【game design patterns】

    单例模式(Singleton Pattern):用于确保在游戏中只存在一个实例,例如游戏管理器(Game Manager)或资源管理器(Resource Manager). 工厂模式(Factory ...

  3. 游戏开发中的道具管理

    前言 在开发游戏的时候,我们肯定会处理道具,不论是多大的游戏都有道具.道具的管理方式也是多种多样.下面记录一下我个人在游戏开发中的道具管理方式. 道具的定义 道具的属性基本分为: ID.类型.数量.图 ...

  4. 游戏开发- Python语言在游戏开发中的潜力

    PYTHON 是一种面向对象的通用高级编程语言,由 GUIDO VAN ROSSUM 于 1991 年开发.自发展以来,PYTHON 已成为世界上最流行的编程语言之一.它经常在流行度调查中排名靠前-- ...

  5. Unity 3D - 游戏开发中的Lua

    Unity 3D - 游戏开发中的Lua : 本文作者:秦元培, 本文出处:http://blog.csdn.net/qinyuanpei/article/details/39826323 前言 : ...

  6. 游戏开发中的数据表示

    声明:本文内容源自腾讯游戏学院程序公开课_服务端 一.数据表示的基础 什么是数据表示? 数据是信息的载体. 数据表示是一组操作,可以描述.显示.操作信息. 数据表示的要素 IDL - 接口描述语言 I ...

  7. 手把手教你架构3d游戏引擎pdf_游戏开发中的算法

    游戏技术这条路,可深可浅.你可以满足于完成GamePlay玩法层面的东西,你也可以满足于架构和框架设计层面的东西,你也可以醉心于了解某一游戏引擎带来的掌控感.但是,我们不该止步于此,止步与目前所见或所 ...

  8. 游戏开发中的专业术语

    本文整理了网络/游戏/编程相关的专业术语,作为游戏开发中的辅助参考资料,后期如果遇到其他的术语还会更新. 16毫秒 / 帧速率 Frame Rate. 电子游戏使用的光栅显示器是普通电视时,图像一般每 ...

  9. 斗牛怎么玩法算法_游戏开发中的算法

    游戏技术这条路,可深可浅.你可以满足于完成GamePlay玩法层面的东西,你也可以满足于架构和框架设计层面的东西,你也可以醉心于了解某一游戏引擎带来的掌控感.但是,我们不该止步于此,止步与目前所见或所 ...

最新文章

  1. 普通人学python有用吗 知乎-哪些人更有必要学习python?老男孩教育python
  2. 计算机机房双电源供电,超高效数据机房可靠性浅析——走进腾讯青浦云计算中心...
  3. redis中的五种基本的数据结构
  4. 寒风之家 » Thrift压缩
  5. php rss xml,php 一个完全面向对象的RSS/XML类的简单示例
  6. 用Way.EntityDB进行Entity Framework Core数据库建模
  7. 文件系统(02):基于SpringBoot框架,管理Xml和CSV文件类型
  8. 【HDU5187】contest
  9. java动态代理_Java 动态代理 原理解析
  10. python 长度queue_Python基础知识梳理
  11. Mybatis中mysql blob类型乱码解决
  12. echarts 世界地图标点_echarts中国地图3D各个城市标点demo
  13. c语言输入1显示你好,你好,求指教!该怎么用C语言的scanf实现一次输入若干个数据...
  14. Pytorch学习率调整策略
  15. 计算机动画相关论文,计算机动画论文.doc
  16. Graph Convolutional Neural Network - Spatial Convolution 图卷积神经网络 — 空域卷积详解
  17. 以太坊宠物商店 - 记录第一个Dapp
  18. ubuntu grub深入剖析个性设置
  19. word方框内插入对勾
  20. android图片美化开源,GitHub - xingxing-yan/BLImage: Android中美化图片的库。功能包括滤镜,贴纸,标签,裁剪,涂鸦,亮度,饱和度,对比度,马赛克等功能...

热门文章

  1. Java培训参考笔记:面向对象
  2. PNG图片压缩无损,但解析原理呢?
  3. 2019年女王传奇胡荧魅惑性学堂开课现场
  4. Android驱动开发全过程
  5. pdf转word 破解版
  6. Python实战例子(32个附源码)
  7. Python深度学习-NLP实战:命名实体识别(NER)之分词与序列标注、实体识别任务简介
  8. 计算机专业的学生也太惨了吧!劝你别学计算机
  9. 通过vivado工具实现zynq的FPGA内部RAM读写
  10. Acrobat 9 Pro/AcrobatXIPro/AcrobatDC安装