[AI教做人]0基础做多语言模块,实现国际化

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

Keyenzh
upgrade_buttonUPGRADE升级
evolve_buttonEVOLVE进化
locked_name??????
equip_buttonEQUIP装备
unlockedUNLOCKED已解锁
maxed_outMAXED OUT已满级
level_labelLEVEL {0}第 {0} 关
area_labelAREA {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(黑体) ,路径:

  1. 把 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。

修复内容:

  1. 创建了 1024×1024 的 Alpha8 格式 atlas 纹理 → SimHei SDF Atlas
  2. 创建了 TextMeshPro/Distance Field shader 的 material → SimHei SDF Material
  3. 将 atlas 纹理绑定到 material 的 _MainTex
  4. 两个子资产都保存在 SimHei SDF.asset 内

现在 atlasTextures[0] = SimHei SDF Atlasmaterial = SimHei SDF MaterialpopulationMode = Dynamic — 全部就绪。

6.若用Unity 的 多语言库,不能在初始化调用 API

这是已有的 bug — CharacterPanelUI 和 UILevelNumberText 在字段初始化时调用了 I18n._L(),Unity 不允许在 MonoBehaviour 字段初始化器中访问 Localization API。这不是我引入的,但会阻止编译验证。我先修复它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

avi9111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值