分享一下攻克难关的体验——谈FormatText无法处理中文问题的解决
dreamquest吧
全部回复
仅看楼主
level 9
多啦A户 楼主
其实上一次,主界面的文本就基本汉化完整了,但是 高分榜/积分榜 和 制作人员名单的显示之间给我带来巨大的问题,并且直接牵涉到游戏底层的一些东西——文字段落块的处理,颜色,换行和对齐。
首先是Peter写这个游戏时用的Unity版本显然是很老的版本,他的很多代码似乎都是用当时Unity支持的js写的,但是我不太熟悉这部分东西。
这导致了一个问题,反编译来的代码本来就不好懂了,再加上旧的语言语法,这个 FormatText方法直接类似于天书了:
从对一些字符串的处理可以看出来大概在干什么,但是具体到一些语句,旧完全是云里雾里了:
以及魔鬼般的旧语法语句:
在这种情况下,头三天的我简直是头脑发昏,钻了牛角尖了。我硬是识图看懂这个FormatText,并且直接用Prefix来重写它的逻辑。
但是事实证明我错了。最严重的问题就是严重的错位(Textbox的预制体的原始坐标在 【】,我完全没有看懂原方法到底是怎么调整到正确的位置的)。其次还有颜色丢失等小问题(这个我目前已经知道哪里有问题了)。
在数天尝试无果之后,我突然意识到,原本的FormatText方法其实只面临三个问题:
1.不支持中文显示,这个换个字体就解决了;
2.存在定位问题;
3.中文的换行问题;
其中的1、2都可以比较轻松地找到解决办法。
于是我妥协了。直接选择重写更为简单的 CreateNewTO方法。原本绞尽脑汁找问题,如今换一个方向就迎刃而解了。
虽然还有中文换行的问题亟待解决,但能正常显示和定位,已经是重大进展。
【感想】
由此我发现,很多时候,走错路了,其实会有一种“预兆”,就是你会陷入非常长时间没有进展的状态。
这个时候你需要评估一下你的目标,如果“攻克它”对于你实现目标来说,不是必要的,就未必需要继续走这条路。
就像我这一次经历的,重写FormatText遇到重重困难,直接修改它的返回值,修改它中间调用的其他函数,问题反而迎刃而解了。
目前的显示效果:
另外就是 Play! 和 DreamQuest 到底怎么翻译才是信达雅的,欢迎各位提出建议!
2024年11月21日 03点11分 1
level 9
多啦A户 楼主
发现原始坐标忘记写了
如图所示,要在打开的窗口上正确显示,z轴值需要在1.8f => 9.7f。
并且有时候需要在 27f左右才能正常显示(比如打开过一次窗口,第二次打开,我没研究明白具体的机制)
总之要解决这种诡异的问题,真的不如直接去修改别的,更好修改的方法。
2024年11月21日 04点11分 2
level 9
多啦A户 楼主
"Player names may only contain letters, numbers, underscore, and spaces"
这难道是历史遗留问题,有没有办法通过巧妙的翻译进行规避呢?
2024年11月21日 08点11分 3
level 9
多啦A户 楼主
我先前采用了 先往中文间添加空格,再在输出的字符串中移除中文间的空格的方法。
这种方法明显造成了文字在居中对齐时的错位和空缺(一行中拥有的字符越多,在空格被删除之后就会越向左偏移)。
我最终选择了使用方法中的补丁,一行行添加IL指令。
谁能想到,花了一整天才成功把这么简单的几句添加进去并成功运行,但是运行之后立马出现了新的问题:
我不经在想,我原先的字体替换,好处实在是太多了。
2024年11月22日 13点11分 4
level 9
多啦A户 楼主
一个FormatText方法,花去我五六天时间。
但如今总算解决了绝大部分问题:
可以看到汉字间没有空格,并且正确居中了。这其中涉及了一些IL语言的知识。不得不说,真的“不磨刀误砍柴功”——因为不动IL语句,仅仅一个简单的if(){}else{}结构就折磨了我一整天。
在IL中其实没有真正意义上的 if else,主要是靠各种跳转。
在if语句块的结尾,使用br跳转到对应else语句块外的第一句。这样就有了 if,else。如果缺少了这个br,就会变得像 switch case——你可以单独执行 else语句块,但是如果你执行了if语句块,就会顺序执行到else语句块
2024年11月23日 09点11分 5
另外,这个大棒棒棒棒棒棒棒 是我测试汉字自动换行的,显然也成功了。目前唯一的问题是汉字直接不能用正常的方法添加空格了,我考虑使用“|”替代空格,然后在FormatText的Postfix中将text中的“|”替换成空格。
2024年11月23日 09点11分
level 9
多啦A户 楼主
忍不住再分享一下,毕竟是五天时间的成果,感觉这个居中特别漂亮
(事实上中途有大约半天时间弄错了思路,把图标里面的距离调整错误替换了。总之,真不容易啊!)
2024年11月23日 09点11分 6
level 9
多啦A户 楼主
目前在一些翻译上遇到了新问题。
首先是决定把 Boss 翻译成 领主——因为我挺喜欢DNF的。
其次是 Mana 究竟翻译成什么——目前暂且定为 法力。
2024年11月24日 09点11分 7
另外,我早该知道的,为什么代码都在UnityScripts.dll里——因为作者用的Unity版本,用的就是特殊的UnityScripts
2024年11月24日 09点11分
level 9
多啦A户 楼主
目前还有一个问题是 Level n(怪物等级)是否需要进行汉化。
其实以前DNF的全面汉化我是挺反感的,有点矫枉过正的意思。特别是把技能图标下面的Lv几 都改了,显示起来特别难看。
不过现在轮到我自己来汉化了,反而有点想“全面汉化”的意思。
Dream Quest\BepInEx\plugins\TranslateSheet\SpecialKeyword.csv
我汉化的Level词条在这个csv文件中,如果大家以后用了对 “等级”感到不适应,可以从这边进行修改。
2024年11月25日 03点11分 8
level 9
多啦A户 楼主
今日高歌猛进,一定程度解决了“互相参考”的问题——在成就中,经常有 击败某某(怪物名)怪物,有 解锁 某某 卡牌, 解锁 某某 天赋,解锁 某某职业。
只要在翻译的字符串里面写 “<<表名|行键值(一般就是英文原文)>>”,就会被替换成对应表单的对应值。
比如“解锁<<CardName|Attack>>”,到显示的时候,就会自动查询CardName这个表,然后替换掉<<>>之间的内容,变成 “解锁 攻击”。
不过,不知道是不是我的错觉,随着翻译表单逐渐变得庞大,游戏似乎逐渐变得有点卡顿了。
如果影响十分严重,我或许得想个办法,及时释放没有用到的表。或者只在查询时读取,结束查询时就关闭?还是区分不同的场景?目前还没有很大影响,先不考虑了。
2024年11月25日 13点11分 9
level 9
多啦A户 楼主
出现了目前最严重,最影响正常游戏的问题——替换完之后的字体,和原本的界面直接的渲染顺序/优先级 存在问题。我之前猜测是不是 renderQueue的问题,但是测试之后发现好像不是。
这个问题是最严重且影响最大的。
2024年11月26日 04点11分 10
在加载字体的时候,必须阻塞Unity的主进程。否则类似,职业选择界面,就会因为先加载布局,后显示画面,导致错位。(我发现这个Build方法我可以后调用)
2024年11月26日 05点11分
经过精妙的对照实验,我发现是 t.renderer.sharedMaterial ,也就是新字体的材质在层级错误的出现上起了关键性作用。
2024年11月26日 11点11分
level 9
多啦A户 楼主
为什么?这究竟是为什么?为什么楼上的情况下的会遮挡?而这层楼的情况就不会?
十万个为什么。
2024年11月26日 05点11分 11
level 9
多啦A户 楼主
可能因为作者是在不同事件写不同系统的。
成就,在成就展示界面通过不同的方法返回其名称,要求和奖励;
在结尾展示时则使用属性。
不过原因也可能是图鉴中的显示是 定做。
2024年11月26日 09点11分 12
level 9
多啦A户 楼主
有这么一个“幽灵”字符串——新手教程里面的按钮 “Got it”,它疑似是在某种生成的方法中,这个我实在没有办法。
2024年11月26日 11点11分 13
level 9
多啦A户 楼主
破案了,是因为Shader变了。它失去了颜色,但是获得了很多[酷]
2024年11月26日 11点11分 14
好吧,失去颜色还是得解决[不高兴]
2024年11月26日 11点11分
回来了,我感觉到,他们都回来了。(其实是我把设置颜色的代码顺序弄错了,先设置了材质颜色,后来又把材质替换了)
2024年11月26日 11点11分
我想接下来除了“卡顿”我解决不来,应该没有大问题了[升起]
2024年11月26日 11点11分
level 9
多啦A户 楼主
如果在翻译文本里面看到一些异常的 【!】 ,这个是我给一些争议内容事先添加的标记
2024年11月26日 12点11分 15
1 2 3 4 尾页