开源仓库见:
BlogSampleCode/LocalKit at main · Tandre-Z/BlogSampleCode
一般数据表都会以key-value形式存放,Key一般是string或int。我们这里选择了string以便于做可视化,展示起来也会比int更清晰。Value便是指不同语言对应的不同文本,这里可以暂时理解为一个字典。如果使用Excel来构建便是下面的样子:
key | chinese | english |
---|---|---|
ABOUT | 关于 | About |
MENU | 菜单 | Menu |
使用luban之类的配置工具,可以把key统一放置到一个bean中,然后结合上面的表格,完整的配置方案如下(使用了Luban后,本文后面的编辑器窗口的可视化便不再是必要的内容了):
因为它不直接支持字典,所以我们用一个列表来存上面示例表格中每一行的数据。每一行都包含一个key和一个个语言与文本的键值对,所以可以再使用一个列表来存放这一个个键值对。整体代码如下:
using System;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "LocalizationData_SO", menuName = "Inventory/LocalizationData_SO")]
public class LocalizationData_SO : ScriptableObject
{
public List<LocalizationItem> localizationItemList;
}
[Serializable]
public class LocalizationItem
{
public string LocalizedKey
public List<LocalizedSentence> languageSentences;
}
[Serializable]
public class LocalizationItem
{
public Language language;
public string Text;
}
public enum Language
{
Chinese = 0,
English = 1,
Japanese = 2,
ChineseSimplified = 3,
ChineseTraditional = 4
}
然后为了后期获取某一个项方便可以分别在LocalizationItem
和LocalizationItem
中添加一些公共方法:
public LocalizationItem GetlocalizationItem(string key)
{
return localizationItemList.Find(i => i.LocalizedKey == key);
}
public string GetSentence(Language language)
{
return languageSentences.Find(i => i.language == language).Text;
}
一个小Tips:可序列化的类中名为name的字段会显示在ScriptableObject的列表上的每个项上,像下面这样:
所以为了看这个数据库更方便,可以根据这个小tips做一些小的优化,如果已经确定后面会做编辑器的可视化,这里也可以忽略,并不是必要的,而且还会存在一点点误引用可能的风险。这里仅做一个示例,也方便做其他项目时如果不做可视化可以考虑优化一下以方便数据的查找。