0基础,而且项目内0多语言

三个主要待解决
没办法, 只能一一解决
1️⃣ 硬编码常量字符串(C# 代码内)
// CharacterPanelUI.cs
"UPGRADE", "EVOLVE", "???"
// DroppedCardPanel.cs
"UNLOCKED", "EQUIP"
// WeaponPanelUI.cs
"MAXED OUT", "LEVEL "
// LevelController.cs
"AREA {0}-{1}"
// UIComplete.cs
"LEVEL {0}-{1}", "+{0}"
// UILevelNumberText.cs
"LEVEL {0}"
2️⃣ ScriptableObject 数据资产中的字符串字段
3️⃣ UI 组件类型(预制体 Prefab)
混用 TMPro.TextMeshProUGUI(TMP)和 UnityEngine.UI.Text(旧版 uGUI)。
从0开始,步骤
Package Manager 安装Unity 的多语言包 Localization
步骤一,Create 基础Local Set 文件


这个步骤很好,但是尼会发现卡在第二个步骤
只能问第二个ai 了
二、打开表格编辑窗口
顶部菜单: Window → Asset Management → Localization Tables
需要:先创建2个语言,后面有用,然后会碰到这问题 ↓
(如果尼是0基础,应该想不到再需要在Asset Manager 的一个菜单,而不是在第一个步骤创建的Localize Setting直接操作)
总之就是必须用这个菜单创建 所有UI文本
若:2个多语言,则至少创建4 个文件(db)。。。

2, 填充多语言 db
ai 已经帮尼分析,需要这些keys
| Key | en | zh |
|---|---|---|
| upgrade_button | UPGRADE | 升级 |
| evolve_button | EVOLVE | 进化 |
| locked_name | ??? | ??? |
| equip_button | EQUIP | 装备 |
| unlocked | UNLOCKED | 已解锁 |
| maxed_out | MAXED OUT | 已满级 |
| level_label | LEVEL {0} | 第 {0} 关 |
| area_label | AREA {0}-{1} | 区域 {0}-{1} |
实际上也是让 AI帮尼把这些都填进去
只是可能你需要有 db===Database的概念
如下图:ai 命名和我命名的区别,ai 只会写Texts (这就更需要你懂英文概念,是复数的 s)

三. 代码中使用
using UnityEngine.Localization.Settings;
// 获取本地化文本
var localizedString = LocalizationSettings.StringDatabase
.GetLocalizedString("UI_Texts", "upgrade_button");
4.封装一些代码
封装类已创建在 Assets/Project Files/Game/Scripts/Localization/I18n.cs,用法如下:
// 无参数
I18n._L("upgrade_button") // → "升级" 或 "UPGRADE"
// 带1个格式化参数
I18n._L("level_label", 5) // → "等级 5" 或 "LEVEL 5"
// 带2个格式化参数
I18n._L("area_label", 1, 3) // → "区域 1-3" 或 "AREA 1-3"
需要我把项目里所有硬编码字符串替换成 I18n._L() 调用吗?
/// <summary>
/// Lightweight wrapper for Unity Localization string lookup.
/// Usage: I18n._L("upgrade_button")
/// </summary>
public static class I18n
{
private const string DEFAULT_TABLE = "UI_Texts";
public static string _L(string key, string table = DEFAULT_TABLE)
{
return LocalizationSettings.StringDatabase.GetLocalizedString(table, key);
}
如何切换语言
原来默认就有3个 “selector "

而真的只会从上往下,第一个”击中“的Selector 满足的第一;
所以就是
方法一:调整一下 "Selector"的顺序即可
方法二:直接代码调用(但其实selector 肯定已执行)只是用代码再改切换多语言一次
//在游戏初始化脚本中添加:
using UnityEngine.Localization.Settings;
// 强制使用英文
LocalizationSettings.InitializationOperation.Completed += op =>
{
var enLocale = LocalizationSettings.AvailableLocales.GetLocale("en");
LocalizationSettings.SelectedLocale = enLocale;
};
参考:
1.Unity 字体文件的 Fallback (一般为空)

2.Windows 系统已有 SimHei(黑体) ,路径:
- 把
C:\Windows\Fonts\simhei.ttf
3.script(created)
using UnityEngine;
using UnityEditor;
using TMPro;
public class CreateSimHeiFontAsset
{
public static void Run()
{
string fontPath = "Assets/Project Files/Game/Fonts/SimHei/simhei.ttf";
string assetPath = "Assets/Project Files/Game/Fonts/SimHei/SimHei SDF.asset";
// Import the font first
AssetDatabase.ImportAsset(fontPath, ImportAssetOptions.ForceUpdate);
// Wait for import to finish
// Load the Font
Font simHeiFont = AssetDatabase.LoadAssetAtPath<Font>(fontPath);
if (simHeiFont == null)
{
Debug.LogError($"Failed to load font at {fontPath}");
return;
}
Debug.Log($"Loaded font: {simHeiFont.name}");
// Create dynamic TMP_FontAsset
// For TMP 3.0+, use CreateFontAsset with AtlasPopulationMode.Dynamic
TMP_FontAsset fontAsset = TMP_FontAsset.CreateFontAsset(simHeiFont);
if (fontAsset == null)
{
Debug.LogError("Failed to create TMP_FontAsset");
return;
}
// Set to Dynamic mode
fontAsset.atlasPopulationMode = AtlasPopulationMode.Dynamic;
// Enable multi-atlas textures for large character sets
fontAsset.isMultiAtlasTexturesEnabled = true;
// Save as asset
AssetDatabase.CreateAsset(fontAsset, assetPath);
// Save the atlas texture too
// The texture is created automatically, we just need to make sure it's saved
EditorUtility.SetDirty(fontAsset);
AssetDatabase.SaveAssets();
Debug.Log($"Created SimHei SDF Font Asset at {assetPath}");
}
}
4. fallbackFontAssetTable 属性 (C#)
用的是 TMP_FontAsset 的 fallbackFontAssetTable 属性,在 C# 脚本中:
fontAsset.fallbackFontAssetTable.Add(simHeiFont);
对应的序列化字段在 .asset YAML 文件中是:
m_FallbackFontAssetTable:
- {fileID: 11400000, guid: <SimHei SDF的GUID>, type: 2}
5.若有Error(图集Altas)
问题是 CreateFontAsset 创建 Dynamic 字体时没有生成 atlas 纹理和 material。
修复内容:
- 创建了 1024×1024 的
Alpha8格式 atlas 纹理 →SimHei SDF Atlas - 创建了
TextMeshPro/Distance Fieldshader 的 material →SimHei SDF Material - 将 atlas 纹理绑定到 material 的
_MainTex - 两个子资产都保存在
SimHei SDF.asset内
现在 atlasTextures[0] = SimHei SDF Atlas,material = SimHei SDF Material,populationMode = Dynamic — 全部就绪。
6.若用Unity 的 多语言库,不能在初始化调用 API
这是已有的 bug — CharacterPanelUI 和 UILevelNumberText 在字段初始化时调用了 I18n._L(),Unity 不允许在 MonoBehaviour 字段初始化器中访问 Localization API。这不是我引入的,但会阻止编译验证。我先修复它。


808

被折叠的 条评论
为什么被折叠?



