创建一个自定义的Localization配置解析器及创建器的过程(Config的配置器和解析器创建过程也是类似):
- 首先创建一个LanguageObject,从
LanguageObject
派生 - 可以从
LocalizationCreateAndParseBase
派生,也可以自己创建,创建器实现ILocalizationCreate
接口,解析器实现ILocalizationParse
内置的CSV大体代码,具体代码看Cabin Icarus\UnityEditorFrame\Editor\Scripts\Localization\CsvLocalization
路径下的代码:
public partial class CsvLanguageObject: LanguageObject
{
//绘制CsvLanguageObject,因为CsvLanguageObject就是一个特殊的CSV配置,第一行是Language类型,所以绘制的时候直接调用CSV配置的绘制就行
public override void Draw(LocalizationManager localizationManager,object userData)
{
base.Draw(localizationManager,userData);
_config?.Draw(localizationManager,userData);
}
}
//解析器和创建器,同样,解析器和创建器具体的解析和创建都是调用CSV配置的,但是先要去除第一行,因为第一行CSV配置无法识别
public class CsvLocalizationCreateAndParse : LocalizationCreateAndParseBase<CsvLanguageObject>
{
public override bool IsSupport(string content)
{
if (_parse == null)
{
_parse = new CsvConfigParse(CsvLanguageObject.DefaultSeparator);
}
var index = content.IndexOf('\n');
if (index == -1)
{
index = content.IndexOf('\r');
}
if (index > -1)
{
content = content.Remove(0, index);
}
return _parse.IsSupport(content);
}
public override CsvLanguageObject Parse(string filePath)
{
if (!File.Exists(filePath))
{
goto Return;
}
var languageStr = FileUtil.GetFileLinesContent(filePath, 1, Encoding.UTF8);
Language language;
bool result = Enum.TryParse(languageStr, out language);
if (!result)
{
language = Language.Unspecified;
}
if (_parse == null)
{
_parse = new CsvConfigParse(CsvLanguageObject.DefaultSeparator);
}
var content = FileUtil.GetFileRanageContent(filePath, Encoding.UTF8, 1);
var configParse = _parse;
if (configParse.IsSupport(content))
{
var config = configParse.Parse(content);
return new CsvLanguageObject(language,config);
}
Return:
return new CsvLanguageObject(Language.Unspecified);
}
}