From 6bc3552a1f66ba5d36e6d32add4b195728c9d217 Mon Sep 17 00:00:00 2001 From: walon Date: Sat, 18 Dec 2021 13:36:21 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E7=89=B9=E6=80=A7=E3=80=91=E6=96=B0?= =?UTF-8?q?=E5=A2=9Eunity=20ScriptableObject=20asset=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E6=94=AF=E6=8C=81=20=E3=80=90=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E3=80=91=E5=85=81=E8=AE=B8=E4=B8=BA=E7=9B=AE=E5=BD=95=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90=E6=8C=87=E5=AE=9A=E5=8F=82=E6=95=B0=EF=BC=8C?= =?UTF-8?q?=E8=BF=99=E4=BA=9B=E5=8F=82=E6=95=B0=E4=BC=9A=E4=BD=9C=E7=94=A8?= =?UTF-8?q?=E5=88=B0=E6=89=80=E6=9C=89=E7=9B=AE=E5=BD=95=E4=B8=8B=E7=9A=84?= =?UTF-8?q?=E5=AD=90=E6=96=87=E4=BB=B6=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- .../DataCreators/UnityAssetDataCreator.cs | 13 +++ .../DataSources/Binary/BinaryDataSource.cs | 26 ------ .../Source/DataSources/DataSourceFactory.cs | 4 +- .../UnityAsset/UnityAssetDataSource.cs | 89 +++++++++++++++++++ .../Source/Utils/DataLoaderUtil.cs | 2 +- 6 files changed, 107 insertions(+), 31 deletions(-) create mode 100644 src/Luban.Job.Cfg/Source/DataCreators/UnityAssetDataCreator.cs delete mode 100644 src/Luban.Job.Cfg/Source/DataSources/Binary/BinaryDataSource.cs create mode 100644 src/Luban.Job.Cfg/Source/DataSources/UnityAsset/UnityAssetDataSource.cs diff --git a/README.md b/README.md index 3ebe5e8..d41c038 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ luban相较于常规的excel导表工具有以下核心优势: - 增强了excel格式。可以比较简洁地excel配置**任意复杂**的数据,像子结构、结构列表,以及更复杂的深层次的嵌套结构都能直接解析处理。 -- 完备的类型系统和多原始数据支持(excel、xml、json、lua、yaml),可以轻松表达和解析**任意复杂**的数据。意味着传统excel导表工具无法处理的技能、行为树、副本等等复杂配置,luban也能够统一处理了,彻底将程序从复杂的配置解析中解放出来。 +- 完备的类型系统和多原始数据支持(excel、xml、json、lua、yaml、unity asset),可以轻松表达和解析**任意复杂**的数据。意味着传统excel导表工具无法处理的技能、行为树、副本等等复杂配置,luban也能够统一处理了,彻底将程序从复杂的配置解析中解放出来。 - 支持binary、**protobuf**(同时可以生成相应的pb定义)、**msgpack**、**flatbuffers**、json、lua等多种导出数据格式。 - 完善的工作流支持。如id的外键引用检查;资源合法性检查;灵活的数据源定义(拆表或者多表合一);灵活的分组导出机制;多种本地化支持;生成极快(日常迭代300ms以内);[Excel2TextDiff](https://github.com/focus-creative-games/Excel2TextDiff)工具方便diff查看excel文件的版本间差异; - **LubanAssistant Excel插件**。支持把json、lua、xml等文本格式的配置数据加载到excel中,批量编辑处理,最后再保存回原文件,较好地解决大型项目中多人合作数据编辑冲突合并的问题,较好解决在编辑器中制作的配置难以在excel中批量修改的问题。 @@ -45,7 +45,7 @@ luban相较于常规的excel导表工具有以下核心优势: ## 特性 -- 支持excel族、json、xml、lua、yaml 多种数据格式,基本统一了游戏常见的配置数据 +- 支持excel族、json、xml、lua、yaml、unity asset等多种数据格式,基本统一了游戏常见的配置数据 - **强大完备的类型系统**。**可以优雅表达任意复杂的数据结构**。支持所有常见原生类型、text本地化类型、datetime类型、vector{2,3,4}、容器类型list,set,map、枚举和结构、**多态结构**以及**可空类型**。 - 支持增强的excel格式。可以在excel里比较简洁填写出任意复杂的嵌套数据。 - 生成代码清晰易读、良好模块化。支持指定变量命名风格约定。特地支持运行时原子性热更新配置。 diff --git a/src/Luban.Job.Cfg/Source/DataCreators/UnityAssetDataCreator.cs b/src/Luban.Job.Cfg/Source/DataCreators/UnityAssetDataCreator.cs new file mode 100644 index 0000000..0cd79ea --- /dev/null +++ b/src/Luban.Job.Cfg/Source/DataCreators/UnityAssetDataCreator.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Luban.Job.Cfg.DataCreators +{ + class UnityAssetDataCreator : YamlDataCreator + { + public new static UnityAssetDataCreator Ins = new(); + } +} diff --git a/src/Luban.Job.Cfg/Source/DataSources/Binary/BinaryDataSource.cs b/src/Luban.Job.Cfg/Source/DataSources/Binary/BinaryDataSource.cs deleted file mode 100644 index 6cdfe6c..0000000 --- a/src/Luban.Job.Cfg/Source/DataSources/Binary/BinaryDataSource.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Luban.Job.Cfg.Datas; -using Luban.Job.Common.Types; -using System; -using System.Collections.Generic; -using System.IO; - -namespace Luban.Job.Cfg.DataSources.Binary -{ - class BinaryDataSource : AbstractDataSource - { - public override void Load(string rawUrl, string sheetName, Stream stream) - { - throw new NotImplementedException(); - } - - public override List ReadMulti(TBean type) - { - throw new NotImplementedException(); - } - - public override Record ReadOne(TBean type) - { - throw new NotImplementedException(); - } - } -} diff --git a/src/Luban.Job.Cfg/Source/DataSources/DataSourceFactory.cs b/src/Luban.Job.Cfg/Source/DataSources/DataSourceFactory.cs index bbe881a..000d875 100644 --- a/src/Luban.Job.Cfg/Source/DataSources/DataSourceFactory.cs +++ b/src/Luban.Job.Cfg/Source/DataSources/DataSourceFactory.cs @@ -15,7 +15,7 @@ namespace Luban.Job.Cfg.DataSources ".lua", ".json", ".yml", - ".bin", + ".asset", }; public static AbstractDataSource Create(string url, string sheetName, Stream stream) @@ -32,8 +32,8 @@ namespace Luban.Job.Cfg.DataSources case "xml": source = new Xml.XmlDataSource(); break; case "lua": source = new Lua.LuaDataSource(); break; case "json": source = new Json.JsonDataSource(); break; - case "bin": source = new Binary.BinaryDataSource(); break; case "yml": source = new Yaml.YamlDataSource(); break; + case "asset": source = new UnityAsset.UnityAssetDataSource(); break; default: throw new Exception($"不支持的文件类型:{url}"); } source.Load(url, sheetName, stream); diff --git a/src/Luban.Job.Cfg/Source/DataSources/UnityAsset/UnityAssetDataSource.cs b/src/Luban.Job.Cfg/Source/DataSources/UnityAsset/UnityAssetDataSource.cs new file mode 100644 index 0000000..e4a33b8 --- /dev/null +++ b/src/Luban.Job.Cfg/Source/DataSources/UnityAsset/UnityAssetDataSource.cs @@ -0,0 +1,89 @@ +using Luban.Job.Cfg.DataCreators; +using Luban.Job.Cfg.Datas; +using Luban.Job.Cfg.Defs; +using Luban.Job.Cfg.Utils; +using Luban.Job.Common.Types; +using System; +using System.Collections.Generic; +using System.IO; +using YamlDotNet.RepresentationModel; +using System.Linq; + +namespace Luban.Job.Cfg.DataSources.UnityAsset +{ + class UnityAssetDataSource : AbstractDataSource + { + private YamlNode _root; + public override void Load(string rawUrl, string sheetOrFieldName, Stream stream) + { + var ys = new YamlStream(); + ys.Load(new StreamReader(stream)); + var rootNode = (YamlMappingNode)ys.Documents[0].RootNode; + + // unity asset 格式为 包含一个doc的 yaml文件 + // doc顶层为map,只包含一个字段,字段key为类型名。 + if (rootNode.Children.Count != 1) + { + throw new Exception($"asset doc 应该只包含一个顶层字段"); + } + + this._root = rootNode.First().Value; + + if (!string.IsNullOrEmpty(sheetOrFieldName)) + { + if (sheetOrFieldName.StartsWith("*")) + { + sheetOrFieldName = sheetOrFieldName[1..]; + } + if (!string.IsNullOrEmpty(sheetOrFieldName)) + { + foreach (var subField in sheetOrFieldName.Split('.')) + { + this._root = _root[new YamlScalarNode(subField)]; + } + } + } + } + + public override List ReadMulti(TBean type) + { + var records = new List(); + foreach (var ele in (YamlSequenceNode)_root) + { + var rec = ReadRecord(ele, type); + if (rec != null) + { + records.Add(rec); + } + } + return records; + } + + private static readonly YamlScalarNode s_tagNameNode = new(TAG_KEY); + + public override Record ReadOne(TBean type) + { + return ReadRecord(_root, type); + } + + private Record ReadRecord(YamlNode yamlNode, TBean type) + { + string tagName; + if (((YamlMappingNode)yamlNode).Children.TryGetValue(s_tagNameNode, out var tagNode)) + { + tagName = (string)tagNode; + } + else + { + tagName = null; + } + if (DataUtil.IsIgnoreTag(tagName)) + { + return null; + } + var data = (DBean)type.Apply(UnityAssetDataCreator.Ins, yamlNode, (DefAssembly)type.Bean.AssemblyBase); + var tags = DataUtil.ParseTags(tagName); + return new Record(data, RawUrl, tags); + } + } +} diff --git a/src/Luban.Job.Cfg/Source/Utils/DataLoaderUtil.cs b/src/Luban.Job.Cfg/Source/Utils/DataLoaderUtil.cs index f26487d..2093794 100644 --- a/src/Luban.Job.Cfg/Source/Utils/DataLoaderUtil.cs +++ b/src/Luban.Job.Cfg/Source/Utils/DataLoaderUtil.cs @@ -51,7 +51,7 @@ namespace Luban.Job.Cfg.Utils } else { - return fileOrDirContent.SubFiles.Select(f => new InputFileInfo() { OriginFile = f.FilePath, ActualFile = f.FilePath, MD5 = f.MD5 }).ToList(); + return fileOrDirContent.SubFiles.Select(f => new InputFileInfo() { OriginFile = f.FilePath, ActualFile = f.FilePath, SheetName = sheetName, MD5 = f.MD5 }).ToList(); } })); }