From 1005f2bfa3811dd27ec6a76c21bc9e783ce10700 Mon Sep 17 00:00:00 2001 From: zhang hongbo Date: Wed, 4 Feb 2026 16:43:33 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E7=BB=93=E6=9E=84=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=8Cjson=E6=94=B9=E4=B8=BA=E8=AF=BB=E5=8F=96bytes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Art_Atlas/AtlasConfig.json | 16 +- Art_Atlas/CollectionsAtlas.spriteatlas | 14 +- Art_Bytes.meta | 8 + Art_Bytes/ArtAtlasConfig.bytes | Bin 0 -> 119052 bytes Art_Bytes/ArtAtlasConfig.bytes.meta | 7 + Art_Bytes/ArtResourceConfig.bytes | Bin 0 -> 685660 bytes Art_Bytes/ArtResourceConfig.bytes.meta | 7 + Art_Json/Collections/HeadResource.json | 8 + Art_SO/Collections/HeadResource.asset | 8 + Art_Scripts/gen-netstd.meta | 8 + Art_Scripts/gen-netstd/Byway.meta | 8 + Art_Scripts/gen-netstd/Byway/Thrift.meta | 8 + Art_Scripts/gen-netstd/Byway/Thrift/Data.meta | 8 + .../Byway/Thrift/Data/ArtAtlasConfig.cs | 290 +++++++++++ .../Byway/Thrift/Data/ArtAtlasConfig.cs.meta | 11 + .../Byway/Thrift/Data/ArtAtlasInfo.cs | 233 +++++++++ .../Byway/Thrift/Data/ArtAtlasInfo.cs.meta | 11 + .../gen-netstd/Byway/Thrift/Data/ArtItem.cs | 442 +++++++++++++++++ .../Byway/Thrift/Data/ArtItem.cs.meta | 11 + .../Data/ArtResourceConfig.Extensions.cs | 119 +++++ .../Data/ArtResourceConfig.Extensions.cs.meta | 11 + .../Byway/Thrift/Data/ArtResourceConfig.cs | 362 ++++++++++++++ .../Thrift/Data/ArtResourceConfig.cs.meta | 11 + .../gen-netstd/Byway/Thrift/Data/ArtTable.cs | 265 ++++++++++ .../Byway/Thrift/Data/ArtTable.cs.meta | 11 + .../Thrift/Data/AtlasConfig.Extensions.cs | 92 ++++ .../Data/AtlasConfig.Extensions.cs.meta | 11 + Editor/Art_Tools/ArtBytesViewer.cs | 452 ++++++++++++++++++ Editor/Art_Tools/ArtBytesViewer.cs.meta | 11 + Editor/Art_Tools/ArtResourceConfigEditor.cs | 246 ++++++++++ Editor/Art_Tools/ArtResourcePathFiller.cs | 49 +- Editor/Art_Tools/ArtResourceThriftMenu.cs | 187 ++++++++ .../Art_Tools/ArtResourceThriftMenu.cs.meta | 11 + 33 files changed, 2918 insertions(+), 18 deletions(-) create mode 100644 Art_Bytes.meta create mode 100644 Art_Bytes/ArtAtlasConfig.bytes create mode 100644 Art_Bytes/ArtAtlasConfig.bytes.meta create mode 100644 Art_Bytes/ArtResourceConfig.bytes create mode 100644 Art_Bytes/ArtResourceConfig.bytes.meta create mode 100644 Art_Scripts/gen-netstd.meta create mode 100644 Art_Scripts/gen-netstd/Byway.meta create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift.meta create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift/Data.meta create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtAtlasConfig.cs create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtAtlasConfig.cs.meta create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtAtlasInfo.cs create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtAtlasInfo.cs.meta create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtItem.cs create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtItem.cs.meta create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.Extensions.cs create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.Extensions.cs.meta create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.cs create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.cs.meta create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtTable.cs create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtTable.cs.meta create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift/Data/AtlasConfig.Extensions.cs create mode 100644 Art_Scripts/gen-netstd/Byway/Thrift/Data/AtlasConfig.Extensions.cs.meta create mode 100644 Editor/Art_Tools/ArtBytesViewer.cs create mode 100644 Editor/Art_Tools/ArtBytesViewer.cs.meta create mode 100644 Editor/Art_Tools/ArtResourceThriftMenu.cs create mode 100644 Editor/Art_Tools/ArtResourceThriftMenu.cs.meta diff --git a/Art_Atlas/AtlasConfig.json b/Art_Atlas/AtlasConfig.json index 6cc76444..6e9c4d5a 100644 --- a/Art_Atlas/AtlasConfig.json +++ b/Art_Atlas/AtlasConfig.json @@ -1244,13 +1244,6 @@ "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/DefaultHead/head_pic_circle021.png", "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/DefaultHead/pet_pic_touxiang_wenhao.png", "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/DefaultHead/testHead.jpg", - "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_1.png", - "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_10.png", - "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_11.png", - "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_12.png", - "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_13.png", - "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_14.png", - "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_15.png", "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_2.png", "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_3.png", "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_4.png", @@ -1271,7 +1264,14 @@ "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Kuang_new/HeadFrame6.png", "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Kuang_new/HeadFrame7.png", "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Kuang_new/HeadFrame8.png", - "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Kuang_new/HeadFrame9.png" + "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Kuang_new/HeadFrame9.png", + "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_1.png", + "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_10.png", + "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_11.png", + "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_12.png", + "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_13.png", + "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_14.png", + "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/Emoji/cat_biaoqing_15.png" ] } ] diff --git a/Art_Atlas/CollectionsAtlas.spriteatlas b/Art_Atlas/CollectionsAtlas.spriteatlas index 0d1186d2..c9f111fa 100644 --- a/Art_Atlas/CollectionsAtlas.spriteatlas +++ b/Art_Atlas/CollectionsAtlas.spriteatlas @@ -84,13 +84,6 @@ SpriteAtlas: - {fileID: 21300000, guid: 7787e68a9a594954eab66eada65544bc, type: 3} - {fileID: 21300000, guid: 8fe333808579ee14da593bd58de26afa, type: 3} - {fileID: 21300000, guid: 897ae7ad3faf7094194cc4c2d0e673fb, type: 3} - - {fileID: 21300000, guid: 007a236b3c02d2b47a0c80b144645476, type: 3} - - {fileID: 21300000, guid: c190524ab8f08a84faa3e8e061b6f3aa, type: 3} - - {fileID: 21300000, guid: cf311b770bd2e874184b23a274abbdf8, type: 3} - - {fileID: 21300000, guid: 167836e070c6f7b48951c5f07ebe04be, type: 3} - - {fileID: 21300000, guid: 794f179e38381db41839678a55d2f0e4, type: 3} - - {fileID: 21300000, guid: 0a66679576e68f445b960e5ae9ec6fef, type: 3} - - {fileID: 21300000, guid: 5023ed957e980824abc4c7eff0184f1f, type: 3} - {fileID: 21300000, guid: 1664818d80a34e24aa8aba3a54c2a8e3, type: 3} - {fileID: 21300000, guid: 909771eb56d643048a53d193c646ecbe, type: 3} - {fileID: 21300000, guid: 6e02e3e067c48d844a4d61695add2af5, type: 3} @@ -112,6 +105,13 @@ SpriteAtlas: - {fileID: 21300000, guid: ce589234df834174e83df4bd05834de1, type: 3} - {fileID: 21300000, guid: 027435436d6075d458ef4c7db0488a7d, type: 3} - {fileID: 21300000, guid: 7b2300d496a26bf4c9aacff3ee169122, type: 3} + - {fileID: 21300000, guid: 007a236b3c02d2b47a0c80b144645476, type: 3} + - {fileID: 21300000, guid: c190524ab8f08a84faa3e8e061b6f3aa, type: 3} + - {fileID: 21300000, guid: cf311b770bd2e874184b23a274abbdf8, type: 3} + - {fileID: 21300000, guid: 167836e070c6f7b48951c5f07ebe04be, type: 3} + - {fileID: 21300000, guid: 794f179e38381db41839678a55d2f0e4, type: 3} + - {fileID: 21300000, guid: 0a66679576e68f445b960e5ae9ec6fef, type: 3} + - {fileID: 21300000, guid: 5023ed957e980824abc4c7eff0184f1f, type: 3} bindAsDefault: 1 isAtlasV2: 0 cachedData: {fileID: 0} diff --git a/Art_Bytes.meta b/Art_Bytes.meta new file mode 100644 index 00000000..be84403d --- /dev/null +++ b/Art_Bytes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5c302f2e95b14184a98997996ac956e9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Art_Bytes/ArtAtlasConfig.bytes b/Art_Bytes/ArtAtlasConfig.bytes new file mode 100644 index 0000000000000000000000000000000000000000..729a714c11a113221e9451b89b0f96f6e8f07875 GIT binary patch literal 119052 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 B^r`>= literal 0 HcmV?d00001 diff --git a/Art_Bytes/ArtAtlasConfig.bytes.meta b/Art_Bytes/ArtAtlasConfig.bytes.meta new file mode 100644 index 00000000..4aa917d8 --- /dev/null +++ b/Art_Bytes/ArtAtlasConfig.bytes.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a1d0f95900e059c41a7fd2a89d210c29 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Art_Bytes/ArtResourceConfig.bytes b/Art_Bytes/ArtResourceConfig.bytes new file mode 100644 index 0000000000000000000000000000000000000000..33ed72c2d565d54f7e9acf1b4a01830472f63cf0 GIT binary patch literal 685660 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

_0 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 + * Autogenerated by Thrift Compiler (0.22.0) + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * + */ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Thrift; +using Thrift.Collections; +using System.Runtime.Serialization; +using Thrift.Protocol; +using Thrift.Protocol.Entities; +using Thrift.Protocol.Utilities; +using Thrift.Transport; +using Thrift.Transport.Client; + + +#pragma warning disable IDE0079 // remove unnecessary pragmas +#pragma warning disable IDE0017 // object init can be simplified +#pragma warning disable IDE0028 // collection init can be simplified +#pragma warning disable IDE0305 // collection init can be simplified +#pragma warning disable IDE0034 // simplify default expression +#pragma warning disable IDE0066 // use switch expression +#pragma warning disable IDE0090 // simplify new expression +#pragma warning disable IDE0290 // use primary CTOR +#pragma warning disable IDE1006 // parts of the code use IDL spelling +#pragma warning disable CA1822 // empty DeepCopy() methods still non-static +#pragma warning disable IDE0083 // pattern matching "that is not SomeType" requires net5.0 but we still support earlier versions + +namespace Byway.Thrift.Data +{ + + ///

+ /// 图集配置(Thrift序列化用) + /// + [DataContract(Namespace="")] + public partial class ArtAtlasConfig : TBase + { + private string _generateTime; + + [DataMember(Order = 0)] + public List Atlases { get; set; } + + [DataMember(Order = 0)] + public long Version { get; set; } + + [DataMember(Order = 0)] + public string GenerateTime + { + get + { + return _generateTime; + } + set + { + __isset.generateTime = true; + this._generateTime = value; + } + } + + + [DataMember(Order = 1)] + public Isset __isset; + [DataContract] + public struct Isset + { + [DataMember] + public bool generateTime; + } + + #region XmlSerializer support + + public bool ShouldSerializeGenerateTime() + { + return __isset.generateTime; + } + + #endregion XmlSerializer support + + public ArtAtlasConfig() + { + } + + public ArtAtlasConfig(List @atlases, long @version) : this() + { + this.Atlases = @atlases; + this.Version = @version; + } + + public ArtAtlasConfig DeepCopy() + { + var tmp9 = new ArtAtlasConfig(); + if((Atlases != null)) + { + tmp9.Atlases = this.Atlases.DeepCopy(); + } + tmp9.Version = this.Version; + if((GenerateTime != null) && __isset.generateTime) + { + tmp9.GenerateTime = this.GenerateTime; + } + tmp9.__isset.generateTime = this.__isset.generateTime; + return tmp9; + } + + public async global::System.Threading.Tasks.Task ReadAsync(TProtocol iprot, CancellationToken cancellationToken) + { + iprot.IncrementRecursionDepth(); + try + { + bool isset_atlases = false; + bool isset_version = false; + TField field; + await iprot.ReadStructBeginAsync(cancellationToken); + while (true) + { + field = await iprot.ReadFieldBeginAsync(cancellationToken); + if (field.Type == TType.Stop) + { + break; + } + + switch (field.ID) + { + case 1: + if (field.Type == TType.List) + { + { + var _list10 = await iprot.ReadListBeginAsync(cancellationToken); + Atlases = new List(_list10.Count); + for(int _i11 = 0; _i11 < _list10.Count; ++_i11) + { + global::Byway.Thrift.Data.ArtAtlasInfo _elem12; + _elem12 = new global::Byway.Thrift.Data.ArtAtlasInfo(); + await _elem12.ReadAsync(iprot, cancellationToken); + Atlases.Add(_elem12); + } + await iprot.ReadListEndAsync(cancellationToken); + } + isset_atlases = true; + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + case 2: + if (field.Type == TType.I64) + { + Version = await iprot.ReadI64Async(cancellationToken); + isset_version = true; + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + case 3: + if (field.Type == TType.String) + { + GenerateTime = await iprot.ReadStringAsync(cancellationToken); + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + default: + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + break; + } + + await iprot.ReadFieldEndAsync(cancellationToken); + } + + await iprot.ReadStructEndAsync(cancellationToken); + if (!isset_atlases) + { + throw new TProtocolException(TProtocolException.INVALID_DATA); + } + if (!isset_version) + { + throw new TProtocolException(TProtocolException.INVALID_DATA); + } + } + finally + { + iprot.DecrementRecursionDepth(); + } + } + + public async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken cancellationToken) + { + oprot.IncrementRecursionDepth(); + try + { + var tmp13 = new TStruct("ArtAtlasConfig"); + await oprot.WriteStructBeginAsync(tmp13, cancellationToken); + var tmp14 = new TField(); + if((Atlases != null)) + { + tmp14.Name = "atlases"; + tmp14.Type = TType.List; + tmp14.ID = 1; + await oprot.WriteFieldBeginAsync(tmp14, cancellationToken); + await oprot.WriteListBeginAsync(new TList(TType.Struct, Atlases.Count), cancellationToken); + foreach (global::Byway.Thrift.Data.ArtAtlasInfo _iter15 in Atlases) + { + await _iter15.WriteAsync(oprot, cancellationToken); + } + await oprot.WriteListEndAsync(cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + } + tmp14.Name = "version"; + tmp14.Type = TType.I64; + tmp14.ID = 2; + await oprot.WriteFieldBeginAsync(tmp14, cancellationToken); + await oprot.WriteI64Async(Version, cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + if((GenerateTime != null) && __isset.generateTime) + { + tmp14.Name = "generateTime"; + tmp14.Type = TType.String; + tmp14.ID = 3; + await oprot.WriteFieldBeginAsync(tmp14, cancellationToken); + await oprot.WriteStringAsync(GenerateTime, cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + } + await oprot.WriteFieldStopAsync(cancellationToken); + await oprot.WriteStructEndAsync(cancellationToken); + } + finally + { + oprot.DecrementRecursionDepth(); + } + } + + public override bool Equals(object that) + { + if (!(that is ArtAtlasConfig other)) return false; + if (ReferenceEquals(this, other)) return true; + return TCollections.Equals(Atlases, other.Atlases) + && global::System.Object.Equals(Version, other.Version) + && ((__isset.generateTime == other.__isset.generateTime) && ((!__isset.generateTime) || (global::System.Object.Equals(GenerateTime, other.GenerateTime)))); + } + + public override int GetHashCode() { + int hashcode = 157; + unchecked { + if((Atlases != null)) + { + hashcode = (hashcode * 397) + TCollections.GetHashCode(Atlases); + } + hashcode = (hashcode * 397) + Version.GetHashCode(); + if((GenerateTime != null) && __isset.generateTime) + { + hashcode = (hashcode * 397) + GenerateTime.GetHashCode(); + } + } + return hashcode; + } + + public override string ToString() + { + var tmp16 = new StringBuilder("ArtAtlasConfig("); + if((Atlases != null)) + { + tmp16.Append(", Atlases: "); + Atlases.ToString(tmp16); + } + tmp16.Append(", Version: "); + Version.ToString(tmp16); + if((GenerateTime != null) && __isset.generateTime) + { + tmp16.Append(", GenerateTime: "); + GenerateTime.ToString(tmp16); + } + tmp16.Append(')'); + return tmp16.ToString(); + } + } + +} diff --git a/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtAtlasConfig.cs.meta b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtAtlasConfig.cs.meta new file mode 100644 index 00000000..348c1c7a --- /dev/null +++ b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtAtlasConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d4c1297c76694f44b841b0508a9a86e5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtAtlasInfo.cs b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtAtlasInfo.cs new file mode 100644 index 00000000..6a83f32b --- /dev/null +++ b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtAtlasInfo.cs @@ -0,0 +1,233 @@ +/** + * + * Autogenerated by Thrift Compiler (0.22.0) + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * + */ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Thrift; +using Thrift.Collections; +using System.Runtime.Serialization; +using Thrift.Protocol; +using Thrift.Protocol.Entities; +using Thrift.Protocol.Utilities; +using Thrift.Transport; +using Thrift.Transport.Client; + + +#pragma warning disable IDE0079 // remove unnecessary pragmas +#pragma warning disable IDE0017 // object init can be simplified +#pragma warning disable IDE0028 // collection init can be simplified +#pragma warning disable IDE0305 // collection init can be simplified +#pragma warning disable IDE0034 // simplify default expression +#pragma warning disable IDE0066 // use switch expression +#pragma warning disable IDE0090 // simplify new expression +#pragma warning disable IDE0290 // use primary CTOR +#pragma warning disable IDE1006 // parts of the code use IDL spelling +#pragma warning disable CA1822 // empty DeepCopy() methods still non-static +#pragma warning disable IDE0083 // pattern matching "that is not SomeType" requires net5.0 but we still support earlier versions + +namespace Byway.Thrift.Data +{ + + /// + /// 图集信息(Thrift序列化用) + /// + [DataContract(Namespace="")] + public partial class ArtAtlasInfo : TBase + { + + [DataMember(Order = 0)] + public string Name { get; set; } + + [DataMember(Order = 0)] + public List SpritePaths { get; set; } + + public ArtAtlasInfo() + { + } + + public ArtAtlasInfo(string @name, List spritePaths) : this() + { + this.Name = @name; + this.SpritePaths = spritePaths; + } + + public ArtAtlasInfo DeepCopy() + { + var tmp0 = new ArtAtlasInfo(); + if((Name != null)) + { + tmp0.Name = this.Name; + } + if((SpritePaths != null)) + { + tmp0.SpritePaths = this.SpritePaths.DeepCopy(); + } + return tmp0; + } + + public async global::System.Threading.Tasks.Task ReadAsync(TProtocol iprot, CancellationToken cancellationToken) + { + iprot.IncrementRecursionDepth(); + try + { + bool isset_name = false; + bool isset_spritePaths = false; + TField field; + await iprot.ReadStructBeginAsync(cancellationToken); + while (true) + { + field = await iprot.ReadFieldBeginAsync(cancellationToken); + if (field.Type == TType.Stop) + { + break; + } + + switch (field.ID) + { + case 1: + if (field.Type == TType.String) + { + Name = await iprot.ReadStringAsync(cancellationToken); + isset_name = true; + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + case 2: + if (field.Type == TType.List) + { + { + var _list1 = await iprot.ReadListBeginAsync(cancellationToken); + SpritePaths = new List(_list1.Count); + for(int _i2 = 0; _i2 < _list1.Count; ++_i2) + { + string _elem3; + _elem3 = await iprot.ReadStringAsync(cancellationToken); + SpritePaths.Add(_elem3); + } + await iprot.ReadListEndAsync(cancellationToken); + } + isset_spritePaths = true; + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + default: + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + break; + } + + await iprot.ReadFieldEndAsync(cancellationToken); + } + + await iprot.ReadStructEndAsync(cancellationToken); + if (!isset_name) + { + throw new TProtocolException(TProtocolException.INVALID_DATA); + } + if (!isset_spritePaths) + { + throw new TProtocolException(TProtocolException.INVALID_DATA); + } + } + finally + { + iprot.DecrementRecursionDepth(); + } + } + + public async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken cancellationToken) + { + oprot.IncrementRecursionDepth(); + try + { + var tmp4 = new TStruct("ArtAtlasInfo"); + await oprot.WriteStructBeginAsync(tmp4, cancellationToken); + var tmp5 = new TField(); + if((Name != null)) + { + tmp5.Name = "name"; + tmp5.Type = TType.String; + tmp5.ID = 1; + await oprot.WriteFieldBeginAsync(tmp5, cancellationToken); + await oprot.WriteStringAsync(Name, cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + } + if((SpritePaths != null)) + { + tmp5.Name = "spritePaths"; + tmp5.Type = TType.List; + tmp5.ID = 2; + await oprot.WriteFieldBeginAsync(tmp5, cancellationToken); + await oprot.WriteListBeginAsync(new TList(TType.String, SpritePaths.Count), cancellationToken); + foreach (string _iter6 in SpritePaths) + { + await oprot.WriteStringAsync(_iter6, cancellationToken); + } + await oprot.WriteListEndAsync(cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + } + await oprot.WriteFieldStopAsync(cancellationToken); + await oprot.WriteStructEndAsync(cancellationToken); + } + finally + { + oprot.DecrementRecursionDepth(); + } + } + + public override bool Equals(object that) + { + if (!(that is ArtAtlasInfo other)) return false; + if (ReferenceEquals(this, other)) return true; + return global::System.Object.Equals(Name, other.Name) + && TCollections.Equals(SpritePaths, other.SpritePaths); + } + + public override int GetHashCode() { + int hashcode = 157; + unchecked { + if((Name != null)) + { + hashcode = (hashcode * 397) + Name.GetHashCode(); + } + if((SpritePaths != null)) + { + hashcode = (hashcode * 397) + TCollections.GetHashCode(SpritePaths); + } + } + return hashcode; + } + + public override string ToString() + { + var tmp7 = new StringBuilder("ArtAtlasInfo("); + if((Name != null)) + { + tmp7.Append(", Name: "); + Name.ToString(tmp7); + } + if((SpritePaths != null)) + { + tmp7.Append(", SpritePaths: "); + SpritePaths.ToString(tmp7); + } + tmp7.Append(')'); + return tmp7.ToString(); + } + } + +} diff --git a/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtAtlasInfo.cs.meta b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtAtlasInfo.cs.meta new file mode 100644 index 00000000..bbaa79c1 --- /dev/null +++ b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtAtlasInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 45d38a05c0140bc44b5e33c113bfbe7c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtItem.cs b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtItem.cs new file mode 100644 index 00000000..4c69cdb8 --- /dev/null +++ b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtItem.cs @@ -0,0 +1,442 @@ +/** + * + * Autogenerated by Thrift Compiler (0.22.0) + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * + */ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Thrift; +using Thrift.Collections; +using System.Runtime.Serialization; +using Thrift.Protocol; +using Thrift.Protocol.Entities; +using Thrift.Protocol.Utilities; +using Thrift.Transport; +using Thrift.Transport.Client; + + +#pragma warning disable IDE0079 // remove unnecessary pragmas +#pragma warning disable IDE0017 // object init can be simplified +#pragma warning disable IDE0028 // collection init can be simplified +#pragma warning disable IDE0305 // collection init can be simplified +#pragma warning disable IDE0034 // simplify default expression +#pragma warning disable IDE0066 // use switch expression +#pragma warning disable IDE0090 // simplify new expression +#pragma warning disable IDE0290 // use primary CTOR +#pragma warning disable IDE1006 // parts of the code use IDL spelling +#pragma warning disable CA1822 // empty DeepCopy() methods still non-static +#pragma warning disable IDE0083 // pattern matching "that is not SomeType" requires net5.0 but we still support earlier versions + +namespace Byway.Thrift.Data +{ + + /// + /// 资源项 + /// + [DataContract(Namespace="")] + public partial class ArtItem : TBase + { + private string _desc; + private string _spritePath; + private string _spineAssetPath; + private string _spineAnimName; + + [DataMember(Order = 0)] + public int Id { get; set; } + + [DataMember(Order = 0)] + public string Name { get; set; } + + [DataMember(Order = 0)] + public string Desc + { + get + { + return _desc; + } + set + { + __isset.@desc = true; + this._desc = value; + } + } + + [DataMember(Order = 0)] + public string SpritePath + { + get + { + return _spritePath; + } + set + { + __isset.spritePath = true; + this._spritePath = value; + } + } + + [DataMember(Order = 0)] + public string SpineAssetPath + { + get + { + return _spineAssetPath; + } + set + { + __isset.spineAssetPath = true; + this._spineAssetPath = value; + } + } + + [DataMember(Order = 0)] + public string SpineAnimName + { + get + { + return _spineAnimName; + } + set + { + __isset.spineAnimName = true; + this._spineAnimName = value; + } + } + + + [DataMember(Order = 1)] + public Isset __isset; + [DataContract] + public struct Isset + { + [DataMember] + public bool @desc; + [DataMember] + public bool spritePath; + [DataMember] + public bool spineAssetPath; + [DataMember] + public bool spineAnimName; + } + + #region XmlSerializer support + + public bool ShouldSerializeDesc() + { + return __isset.@desc; + } + + public bool ShouldSerializeSpritePath() + { + return __isset.spritePath; + } + + public bool ShouldSerializeSpineAssetPath() + { + return __isset.spineAssetPath; + } + + public bool ShouldSerializeSpineAnimName() + { + return __isset.spineAnimName; + } + + #endregion XmlSerializer support + + public ArtItem() + { + } + + public ArtItem(int @id, string @name) : this() + { + this.Id = @id; + this.Name = @name; + } + + public ArtItem DeepCopy() + { + var tmp0 = new ArtItem(); + tmp0.Id = this.Id; + if((Name != null)) + { + tmp0.Name = this.Name; + } + if((Desc != null) && __isset.@desc) + { + tmp0.Desc = this.Desc; + } + tmp0.__isset.@desc = this.__isset.@desc; + if((SpritePath != null) && __isset.spritePath) + { + tmp0.SpritePath = this.SpritePath; + } + tmp0.__isset.spritePath = this.__isset.spritePath; + if((SpineAssetPath != null) && __isset.spineAssetPath) + { + tmp0.SpineAssetPath = this.SpineAssetPath; + } + tmp0.__isset.spineAssetPath = this.__isset.spineAssetPath; + if((SpineAnimName != null) && __isset.spineAnimName) + { + tmp0.SpineAnimName = this.SpineAnimName; + } + tmp0.__isset.spineAnimName = this.__isset.spineAnimName; + return tmp0; + } + + public async global::System.Threading.Tasks.Task ReadAsync(TProtocol iprot, CancellationToken cancellationToken) + { + iprot.IncrementRecursionDepth(); + try + { + bool isset_id = false; + bool isset_name = false; + TField field; + await iprot.ReadStructBeginAsync(cancellationToken); + while (true) + { + field = await iprot.ReadFieldBeginAsync(cancellationToken); + if (field.Type == TType.Stop) + { + break; + } + + switch (field.ID) + { + case 1: + if (field.Type == TType.I32) + { + Id = await iprot.ReadI32Async(cancellationToken); + isset_id = true; + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + case 2: + if (field.Type == TType.String) + { + Name = await iprot.ReadStringAsync(cancellationToken); + isset_name = true; + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + case 3: + if (field.Type == TType.String) + { + Desc = await iprot.ReadStringAsync(cancellationToken); + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + case 4: + if (field.Type == TType.String) + { + SpritePath = await iprot.ReadStringAsync(cancellationToken); + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + case 5: + if (field.Type == TType.String) + { + SpineAssetPath = await iprot.ReadStringAsync(cancellationToken); + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + case 6: + if (field.Type == TType.String) + { + SpineAnimName = await iprot.ReadStringAsync(cancellationToken); + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + default: + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + break; + } + + await iprot.ReadFieldEndAsync(cancellationToken); + } + + await iprot.ReadStructEndAsync(cancellationToken); + if (!isset_id) + { + throw new TProtocolException(TProtocolException.INVALID_DATA); + } + if (!isset_name) + { + throw new TProtocolException(TProtocolException.INVALID_DATA); + } + } + finally + { + iprot.DecrementRecursionDepth(); + } + } + + public async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken cancellationToken) + { + oprot.IncrementRecursionDepth(); + try + { + var tmp1 = new TStruct("ArtItem"); + await oprot.WriteStructBeginAsync(tmp1, cancellationToken); + var tmp2 = new TField(); + tmp2.Name = "id"; + tmp2.Type = TType.I32; + tmp2.ID = 1; + await oprot.WriteFieldBeginAsync(tmp2, cancellationToken); + await oprot.WriteI32Async(Id, cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + if((Name != null)) + { + tmp2.Name = "name"; + tmp2.Type = TType.String; + tmp2.ID = 2; + await oprot.WriteFieldBeginAsync(tmp2, cancellationToken); + await oprot.WriteStringAsync(Name, cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + } + if((Desc != null) && __isset.@desc) + { + tmp2.Name = "desc"; + tmp2.Type = TType.String; + tmp2.ID = 3; + await oprot.WriteFieldBeginAsync(tmp2, cancellationToken); + await oprot.WriteStringAsync(Desc, cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + } + if((SpritePath != null) && __isset.spritePath) + { + tmp2.Name = "spritePath"; + tmp2.Type = TType.String; + tmp2.ID = 4; + await oprot.WriteFieldBeginAsync(tmp2, cancellationToken); + await oprot.WriteStringAsync(SpritePath, cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + } + if((SpineAssetPath != null) && __isset.spineAssetPath) + { + tmp2.Name = "spineAssetPath"; + tmp2.Type = TType.String; + tmp2.ID = 5; + await oprot.WriteFieldBeginAsync(tmp2, cancellationToken); + await oprot.WriteStringAsync(SpineAssetPath, cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + } + if((SpineAnimName != null) && __isset.spineAnimName) + { + tmp2.Name = "spineAnimName"; + tmp2.Type = TType.String; + tmp2.ID = 6; + await oprot.WriteFieldBeginAsync(tmp2, cancellationToken); + await oprot.WriteStringAsync(SpineAnimName, cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + } + await oprot.WriteFieldStopAsync(cancellationToken); + await oprot.WriteStructEndAsync(cancellationToken); + } + finally + { + oprot.DecrementRecursionDepth(); + } + } + + public override bool Equals(object that) + { + if (!(that is ArtItem other)) return false; + if (ReferenceEquals(this, other)) return true; + return global::System.Object.Equals(Id, other.Id) + && global::System.Object.Equals(Name, other.Name) + && ((__isset.@desc == other.__isset.@desc) && ((!__isset.@desc) || (global::System.Object.Equals(Desc, other.Desc)))) + && ((__isset.spritePath == other.__isset.spritePath) && ((!__isset.spritePath) || (global::System.Object.Equals(SpritePath, other.SpritePath)))) + && ((__isset.spineAssetPath == other.__isset.spineAssetPath) && ((!__isset.spineAssetPath) || (global::System.Object.Equals(SpineAssetPath, other.SpineAssetPath)))) + && ((__isset.spineAnimName == other.__isset.spineAnimName) && ((!__isset.spineAnimName) || (global::System.Object.Equals(SpineAnimName, other.SpineAnimName)))); + } + + public override int GetHashCode() { + int hashcode = 157; + unchecked { + hashcode = (hashcode * 397) + Id.GetHashCode(); + if((Name != null)) + { + hashcode = (hashcode * 397) + Name.GetHashCode(); + } + if((Desc != null) && __isset.@desc) + { + hashcode = (hashcode * 397) + Desc.GetHashCode(); + } + if((SpritePath != null) && __isset.spritePath) + { + hashcode = (hashcode * 397) + SpritePath.GetHashCode(); + } + if((SpineAssetPath != null) && __isset.spineAssetPath) + { + hashcode = (hashcode * 397) + SpineAssetPath.GetHashCode(); + } + if((SpineAnimName != null) && __isset.spineAnimName) + { + hashcode = (hashcode * 397) + SpineAnimName.GetHashCode(); + } + } + return hashcode; + } + + public override string ToString() + { + var tmp3 = new StringBuilder("ArtItem("); + tmp3.Append(", Id: "); + Id.ToString(tmp3); + if((Name != null)) + { + tmp3.Append(", Name: "); + Name.ToString(tmp3); + } + if((Desc != null) && __isset.@desc) + { + tmp3.Append(", Desc: "); + Desc.ToString(tmp3); + } + if((SpritePath != null) && __isset.spritePath) + { + tmp3.Append(", SpritePath: "); + SpritePath.ToString(tmp3); + } + if((SpineAssetPath != null) && __isset.spineAssetPath) + { + tmp3.Append(", SpineAssetPath: "); + SpineAssetPath.ToString(tmp3); + } + if((SpineAnimName != null) && __isset.spineAnimName) + { + tmp3.Append(", SpineAnimName: "); + SpineAnimName.ToString(tmp3); + } + tmp3.Append(')'); + return tmp3.ToString(); + } + } + +} diff --git a/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtItem.cs.meta b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtItem.cs.meta new file mode 100644 index 00000000..48a76ec5 --- /dev/null +++ b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 64ddf897cd11e7d4b9a3281d0e2796aa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.Extensions.cs b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.Extensions.cs new file mode 100644 index 00000000..a8ed2571 --- /dev/null +++ b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.Extensions.cs @@ -0,0 +1,119 @@ +/** + * + * Autogenerated by Thrift Compiler (0.22.0) + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * + */ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Thrift; +using Thrift.Collections; +using System.Runtime.Serialization; +using Thrift.Protocol; + + +#pragma warning disable IDE0079 // remove unnecessary pragmas +#pragma warning disable IDE0017 // object init can be simplified +#pragma warning disable IDE0028 // collection init can be simplified +#pragma warning disable IDE0305 // collection init can be simplified +#pragma warning disable IDE0034 // simplify default expression +#pragma warning disable IDE0066 // use switch expression +#pragma warning disable IDE0090 // simplify new expression +#pragma warning disable IDE0290 // use primary CTOR +#pragma warning disable IDE1006 // parts of the code use IDL spelling +#pragma warning disable CA1822 // empty DeepCopy() methods still non-static +#pragma warning disable IDE0083 // pattern matching "that is not SomeType" requires net5.0 but we still support earlier versions + +namespace Byway.Thrift.Data +{ + public static class ArtResourceConfigExtensions + { + public static bool Equals(this List instance, object that) + { + if (!(that is List other)) return false; + if (ReferenceEquals(instance, other)) return true; + + return TCollections.Equals(instance, other); + } + + + public static int GetHashCode(this List instance) + { + return TCollections.GetHashCode(instance); + } + + + public static List DeepCopy(this List source) + { + if (source == null) + return null; + + var tmp27 = new List(source.Count); + foreach (var elem in source) + tmp27.Add((elem != null) ? elem.DeepCopy() : null); + return tmp27; + } + + + public static bool Equals(this List instance, object that) + { + if (!(that is List other)) return false; + if (ReferenceEquals(instance, other)) return true; + + return TCollections.Equals(instance, other); + } + + + public static int GetHashCode(this List instance) + { + return TCollections.GetHashCode(instance); + } + + + public static List DeepCopy(this List source) + { + if (source == null) + return null; + + var tmp28 = new List(source.Count); + foreach (var elem in source) + tmp28.Add((elem != null) ? elem.DeepCopy() : null); + return tmp28; + } + + + public static bool Equals(this List instance, object that) + { + if (!(that is List other)) return false; + if (ReferenceEquals(instance, other)) return true; + + return TCollections.Equals(instance, other); + } + + + public static int GetHashCode(this List instance) + { + return TCollections.GetHashCode(instance); + } + + + public static List DeepCopy(this List source) + { + if (source == null) + return null; + + var tmp29 = new List(source.Count); + foreach (var elem in source) + tmp29.Add(elem); + return tmp29; + } + + + } +} diff --git a/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.Extensions.cs.meta b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.Extensions.cs.meta new file mode 100644 index 00000000..6796ec63 --- /dev/null +++ b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.Extensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3a687987ea5895148b41c2bf914c8ff5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.cs b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.cs new file mode 100644 index 00000000..d9e29ecb --- /dev/null +++ b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.cs @@ -0,0 +1,362 @@ +/** + * + * Autogenerated by Thrift Compiler (0.22.0) + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * + */ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Thrift; +using Thrift.Collections; +using System.Runtime.Serialization; +using Thrift.Protocol; +using Thrift.Protocol.Entities; +using Thrift.Protocol.Utilities; +using Thrift.Transport; +using Thrift.Transport.Client; + + +#pragma warning disable IDE0079 // remove unnecessary pragmas +#pragma warning disable IDE0017 // object init can be simplified +#pragma warning disable IDE0028 // collection init can be simplified +#pragma warning disable IDE0305 // collection init can be simplified +#pragma warning disable IDE0034 // simplify default expression +#pragma warning disable IDE0066 // use switch expression +#pragma warning disable IDE0090 // simplify new expression +#pragma warning disable IDE0290 // use primary CTOR +#pragma warning disable IDE1006 // parts of the code use IDL spelling +#pragma warning disable CA1822 // empty DeepCopy() methods still non-static +#pragma warning disable IDE0083 // pattern matching "that is not SomeType" requires net5.0 but we still support earlier versions + +namespace Byway.Thrift.Data +{ + + /// + /// 美术资源总配置 + /// 包含所有表数据 + manifest信息(预加载配置) + /// + [DataContract(Namespace="")] + public partial class ArtResourceConfig : TBase + { + private List _preloadTableIds; + private string _generateTime; + + [DataMember(Order = 0)] + public List Tables { get; set; } + + [DataMember(Order = 0)] + public List PreloadTableIds + { + get + { + return _preloadTableIds; + } + set + { + __isset.preloadTableIds = true; + this._preloadTableIds = value; + } + } + + [DataMember(Order = 0)] + public long Version { get; set; } + + [DataMember(Order = 0)] + public string GenerateTime + { + get + { + return _generateTime; + } + set + { + __isset.generateTime = true; + this._generateTime = value; + } + } + + + [DataMember(Order = 1)] + public Isset __isset; + [DataContract] + public struct Isset + { + [DataMember] + public bool preloadTableIds; + [DataMember] + public bool generateTime; + } + + #region XmlSerializer support + + public bool ShouldSerializePreloadTableIds() + { + return __isset.preloadTableIds; + } + + public bool ShouldSerializeGenerateTime() + { + return __isset.generateTime; + } + + #endregion XmlSerializer support + + public ArtResourceConfig() + { + } + + public ArtResourceConfig(List @tables, long @version) : this() + { + this.Tables = @tables; + this.Version = @version; + } + + public ArtResourceConfig DeepCopy() + { + var tmp14 = new ArtResourceConfig(); + if((Tables != null)) + { + tmp14.Tables = this.Tables.DeepCopy(); + } + if((PreloadTableIds != null) && __isset.preloadTableIds) + { + tmp14.PreloadTableIds = this.PreloadTableIds.DeepCopy(); + } + tmp14.__isset.preloadTableIds = this.__isset.preloadTableIds; + tmp14.Version = this.Version; + if((GenerateTime != null) && __isset.generateTime) + { + tmp14.GenerateTime = this.GenerateTime; + } + tmp14.__isset.generateTime = this.__isset.generateTime; + return tmp14; + } + + public async global::System.Threading.Tasks.Task ReadAsync(TProtocol iprot, CancellationToken cancellationToken) + { + iprot.IncrementRecursionDepth(); + try + { + bool isset_tables = false; + bool isset_version = false; + TField field; + await iprot.ReadStructBeginAsync(cancellationToken); + while (true) + { + field = await iprot.ReadFieldBeginAsync(cancellationToken); + if (field.Type == TType.Stop) + { + break; + } + + switch (field.ID) + { + case 1: + if (field.Type == TType.List) + { + { + var _list15 = await iprot.ReadListBeginAsync(cancellationToken); + Tables = new List(_list15.Count); + for(int _i16 = 0; _i16 < _list15.Count; ++_i16) + { + global::Byway.Thrift.Data.ArtTable _elem17; + _elem17 = new global::Byway.Thrift.Data.ArtTable(); + await _elem17.ReadAsync(iprot, cancellationToken); + Tables.Add(_elem17); + } + await iprot.ReadListEndAsync(cancellationToken); + } + isset_tables = true; + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + case 2: + if (field.Type == TType.List) + { + { + var _list18 = await iprot.ReadListBeginAsync(cancellationToken); + PreloadTableIds = new List(_list18.Count); + for(int _i19 = 0; _i19 < _list18.Count; ++_i19) + { + int _elem20; + _elem20 = await iprot.ReadI32Async(cancellationToken); + PreloadTableIds.Add(_elem20); + } + await iprot.ReadListEndAsync(cancellationToken); + } + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + case 3: + if (field.Type == TType.I64) + { + Version = await iprot.ReadI64Async(cancellationToken); + isset_version = true; + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + case 4: + if (field.Type == TType.String) + { + GenerateTime = await iprot.ReadStringAsync(cancellationToken); + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + default: + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + break; + } + + await iprot.ReadFieldEndAsync(cancellationToken); + } + + await iprot.ReadStructEndAsync(cancellationToken); + if (!isset_tables) + { + throw new TProtocolException(TProtocolException.INVALID_DATA); + } + if (!isset_version) + { + throw new TProtocolException(TProtocolException.INVALID_DATA); + } + } + finally + { + iprot.DecrementRecursionDepth(); + } + } + + public async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken cancellationToken) + { + oprot.IncrementRecursionDepth(); + try + { + var tmp21 = new TStruct("ArtResourceConfig"); + await oprot.WriteStructBeginAsync(tmp21, cancellationToken); + var tmp22 = new TField(); + if((Tables != null)) + { + tmp22.Name = "tables"; + tmp22.Type = TType.List; + tmp22.ID = 1; + await oprot.WriteFieldBeginAsync(tmp22, cancellationToken); + await oprot.WriteListBeginAsync(new TList(TType.Struct, Tables.Count), cancellationToken); + foreach (global::Byway.Thrift.Data.ArtTable _iter23 in Tables) + { + await _iter23.WriteAsync(oprot, cancellationToken); + } + await oprot.WriteListEndAsync(cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + } + if((PreloadTableIds != null) && __isset.preloadTableIds) + { + tmp22.Name = "preloadTableIds"; + tmp22.Type = TType.List; + tmp22.ID = 2; + await oprot.WriteFieldBeginAsync(tmp22, cancellationToken); + await oprot.WriteListBeginAsync(new TList(TType.I32, PreloadTableIds.Count), cancellationToken); + foreach (int _iter24 in PreloadTableIds) + { + await oprot.WriteI32Async(_iter24, cancellationToken); + } + await oprot.WriteListEndAsync(cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + } + tmp22.Name = "version"; + tmp22.Type = TType.I64; + tmp22.ID = 3; + await oprot.WriteFieldBeginAsync(tmp22, cancellationToken); + await oprot.WriteI64Async(Version, cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + if((GenerateTime != null) && __isset.generateTime) + { + tmp22.Name = "generateTime"; + tmp22.Type = TType.String; + tmp22.ID = 4; + await oprot.WriteFieldBeginAsync(tmp22, cancellationToken); + await oprot.WriteStringAsync(GenerateTime, cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + } + await oprot.WriteFieldStopAsync(cancellationToken); + await oprot.WriteStructEndAsync(cancellationToken); + } + finally + { + oprot.DecrementRecursionDepth(); + } + } + + public override bool Equals(object that) + { + if (!(that is ArtResourceConfig other)) return false; + if (ReferenceEquals(this, other)) return true; + return TCollections.Equals(Tables, other.Tables) + && ((__isset.preloadTableIds == other.__isset.preloadTableIds) && ((!__isset.preloadTableIds) || (TCollections.Equals(PreloadTableIds, other.PreloadTableIds)))) + && global::System.Object.Equals(Version, other.Version) + && ((__isset.generateTime == other.__isset.generateTime) && ((!__isset.generateTime) || (global::System.Object.Equals(GenerateTime, other.GenerateTime)))); + } + + public override int GetHashCode() { + int hashcode = 157; + unchecked { + if((Tables != null)) + { + hashcode = (hashcode * 397) + TCollections.GetHashCode(Tables); + } + if((PreloadTableIds != null) && __isset.preloadTableIds) + { + hashcode = (hashcode * 397) + TCollections.GetHashCode(PreloadTableIds); + } + hashcode = (hashcode * 397) + Version.GetHashCode(); + if((GenerateTime != null) && __isset.generateTime) + { + hashcode = (hashcode * 397) + GenerateTime.GetHashCode(); + } + } + return hashcode; + } + + public override string ToString() + { + var tmp25 = new StringBuilder("ArtResourceConfig("); + if((Tables != null)) + { + tmp25.Append(", Tables: "); + Tables.ToString(tmp25); + } + if((PreloadTableIds != null) && __isset.preloadTableIds) + { + tmp25.Append(", PreloadTableIds: "); + PreloadTableIds.ToString(tmp25); + } + tmp25.Append(", Version: "); + Version.ToString(tmp25); + if((GenerateTime != null) && __isset.generateTime) + { + tmp25.Append(", GenerateTime: "); + GenerateTime.ToString(tmp25); + } + tmp25.Append(')'); + return tmp25.ToString(); + } + } + +} diff --git a/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.cs.meta b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.cs.meta new file mode 100644 index 00000000..67ac30d8 --- /dev/null +++ b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtResourceConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5dd576b0b43cfec459d8aa0627293ce0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtTable.cs b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtTable.cs new file mode 100644 index 00000000..7ccd9e1d --- /dev/null +++ b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtTable.cs @@ -0,0 +1,265 @@ +/** + * + * Autogenerated by Thrift Compiler (0.22.0) + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * + */ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Thrift; +using Thrift.Collections; +using System.Runtime.Serialization; +using Thrift.Protocol; +using Thrift.Protocol.Entities; +using Thrift.Protocol.Utilities; +using Thrift.Transport; +using Thrift.Transport.Client; + + +#pragma warning disable IDE0079 // remove unnecessary pragmas +#pragma warning disable IDE0017 // object init can be simplified +#pragma warning disable IDE0028 // collection init can be simplified +#pragma warning disable IDE0305 // collection init can be simplified +#pragma warning disable IDE0034 // simplify default expression +#pragma warning disable IDE0066 // use switch expression +#pragma warning disable IDE0090 // simplify new expression +#pragma warning disable IDE0290 // use primary CTOR +#pragma warning disable IDE1006 // parts of the code use IDL spelling +#pragma warning disable CA1822 // empty DeepCopy() methods still non-static +#pragma warning disable IDE0083 // pattern matching "that is not SomeType" requires net5.0 but we still support earlier versions + +namespace Byway.Thrift.Data +{ + + /// + /// 资源表 + /// + [DataContract(Namespace="")] + public partial class ArtTable : TBase + { + + [DataMember(Order = 0)] + public int TableId { get; set; } + + [DataMember(Order = 0)] + public string TableName { get; set; } + + [DataMember(Order = 0)] + public List Items { get; set; } + + public ArtTable() + { + } + + public ArtTable(int tableId, string tableName, List @items) : this() + { + this.TableId = tableId; + this.TableName = tableName; + this.Items = @items; + } + + public ArtTable DeepCopy() + { + var tmp5 = new ArtTable(); + tmp5.TableId = this.TableId; + if((TableName != null)) + { + tmp5.TableName = this.TableName; + } + if((Items != null)) + { + tmp5.Items = this.Items.DeepCopy(); + } + return tmp5; + } + + public async global::System.Threading.Tasks.Task ReadAsync(TProtocol iprot, CancellationToken cancellationToken) + { + iprot.IncrementRecursionDepth(); + try + { + bool isset_tableId = false; + bool isset_tableName = false; + bool isset_items = false; + TField field; + await iprot.ReadStructBeginAsync(cancellationToken); + while (true) + { + field = await iprot.ReadFieldBeginAsync(cancellationToken); + if (field.Type == TType.Stop) + { + break; + } + + switch (field.ID) + { + case 1: + if (field.Type == TType.I32) + { + TableId = await iprot.ReadI32Async(cancellationToken); + isset_tableId = true; + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + case 2: + if (field.Type == TType.String) + { + TableName = await iprot.ReadStringAsync(cancellationToken); + isset_tableName = true; + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + case 3: + if (field.Type == TType.List) + { + { + var _list6 = await iprot.ReadListBeginAsync(cancellationToken); + Items = new List(_list6.Count); + for(int _i7 = 0; _i7 < _list6.Count; ++_i7) + { + global::Byway.Thrift.Data.ArtItem _elem8; + _elem8 = new global::Byway.Thrift.Data.ArtItem(); + await _elem8.ReadAsync(iprot, cancellationToken); + Items.Add(_elem8); + } + await iprot.ReadListEndAsync(cancellationToken); + } + isset_items = true; + } + else + { + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + } + break; + default: + await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken); + break; + } + + await iprot.ReadFieldEndAsync(cancellationToken); + } + + await iprot.ReadStructEndAsync(cancellationToken); + if (!isset_tableId) + { + throw new TProtocolException(TProtocolException.INVALID_DATA); + } + if (!isset_tableName) + { + throw new TProtocolException(TProtocolException.INVALID_DATA); + } + if (!isset_items) + { + throw new TProtocolException(TProtocolException.INVALID_DATA); + } + } + finally + { + iprot.DecrementRecursionDepth(); + } + } + + public async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken cancellationToken) + { + oprot.IncrementRecursionDepth(); + try + { + var tmp9 = new TStruct("ArtTable"); + await oprot.WriteStructBeginAsync(tmp9, cancellationToken); + var tmp10 = new TField(); + tmp10.Name = "tableId"; + tmp10.Type = TType.I32; + tmp10.ID = 1; + await oprot.WriteFieldBeginAsync(tmp10, cancellationToken); + await oprot.WriteI32Async(TableId, cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + if((TableName != null)) + { + tmp10.Name = "tableName"; + tmp10.Type = TType.String; + tmp10.ID = 2; + await oprot.WriteFieldBeginAsync(tmp10, cancellationToken); + await oprot.WriteStringAsync(TableName, cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + } + if((Items != null)) + { + tmp10.Name = "items"; + tmp10.Type = TType.List; + tmp10.ID = 3; + await oprot.WriteFieldBeginAsync(tmp10, cancellationToken); + await oprot.WriteListBeginAsync(new TList(TType.Struct, Items.Count), cancellationToken); + foreach (global::Byway.Thrift.Data.ArtItem _iter11 in Items) + { + await _iter11.WriteAsync(oprot, cancellationToken); + } + await oprot.WriteListEndAsync(cancellationToken); + await oprot.WriteFieldEndAsync(cancellationToken); + } + await oprot.WriteFieldStopAsync(cancellationToken); + await oprot.WriteStructEndAsync(cancellationToken); + } + finally + { + oprot.DecrementRecursionDepth(); + } + } + + public override bool Equals(object that) + { + if (!(that is ArtTable other)) return false; + if (ReferenceEquals(this, other)) return true; + return global::System.Object.Equals(TableId, other.TableId) + && global::System.Object.Equals(TableName, other.TableName) + && TCollections.Equals(Items, other.Items); + } + + public override int GetHashCode() { + int hashcode = 157; + unchecked { + hashcode = (hashcode * 397) + TableId.GetHashCode(); + if((TableName != null)) + { + hashcode = (hashcode * 397) + TableName.GetHashCode(); + } + if((Items != null)) + { + hashcode = (hashcode * 397) + TCollections.GetHashCode(Items); + } + } + return hashcode; + } + + public override string ToString() + { + var tmp12 = new StringBuilder("ArtTable("); + tmp12.Append(", TableId: "); + TableId.ToString(tmp12); + if((TableName != null)) + { + tmp12.Append(", TableName: "); + TableName.ToString(tmp12); + } + if((Items != null)) + { + tmp12.Append(", Items: "); + Items.ToString(tmp12); + } + tmp12.Append(')'); + return tmp12.ToString(); + } + } + +} diff --git a/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtTable.cs.meta b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtTable.cs.meta new file mode 100644 index 00000000..340b9254 --- /dev/null +++ b/Art_Scripts/gen-netstd/Byway/Thrift/Data/ArtTable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d527a6fcc7860a44983ae072a2f75a9f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Art_Scripts/gen-netstd/Byway/Thrift/Data/AtlasConfig.Extensions.cs b/Art_Scripts/gen-netstd/Byway/Thrift/Data/AtlasConfig.Extensions.cs new file mode 100644 index 00000000..493f13dc --- /dev/null +++ b/Art_Scripts/gen-netstd/Byway/Thrift/Data/AtlasConfig.Extensions.cs @@ -0,0 +1,92 @@ +/** + * + * Autogenerated by Thrift Compiler (0.22.0) + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * + */ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Thrift; +using Thrift.Collections; +using System.Runtime.Serialization; +using Thrift.Protocol; + + +#pragma warning disable IDE0079 // remove unnecessary pragmas +#pragma warning disable IDE0017 // object init can be simplified +#pragma warning disable IDE0028 // collection init can be simplified +#pragma warning disable IDE0305 // collection init can be simplified +#pragma warning disable IDE0034 // simplify default expression +#pragma warning disable IDE0066 // use switch expression +#pragma warning disable IDE0090 // simplify new expression +#pragma warning disable IDE0290 // use primary CTOR +#pragma warning disable IDE1006 // parts of the code use IDL spelling +#pragma warning disable CA1822 // empty DeepCopy() methods still non-static +#pragma warning disable IDE0083 // pattern matching "that is not SomeType" requires net5.0 but we still support earlier versions + +namespace Byway.Thrift.Data +{ + public static class AtlasConfigExtensions + { + public static bool Equals(this List instance, object that) + { + if (!(that is List other)) return false; + if (ReferenceEquals(instance, other)) return true; + + return TCollections.Equals(instance, other); + } + + + public static int GetHashCode(this List instance) + { + return TCollections.GetHashCode(instance); + } + + + public static List DeepCopy(this List source) + { + if (source == null) + return null; + + var tmp18 = new List(source.Count); + foreach (var elem in source) + tmp18.Add((elem != null) ? elem.DeepCopy() : null); + return tmp18; + } + + + public static bool Equals(this List instance, object that) + { + if (!(that is List other)) return false; + if (ReferenceEquals(instance, other)) return true; + + return TCollections.Equals(instance, other); + } + + + public static int GetHashCode(this List instance) + { + return TCollections.GetHashCode(instance); + } + + + public static List DeepCopy(this List source) + { + if (source == null) + return null; + + var tmp19 = new List(source.Count); + foreach (var elem in source) + tmp19.Add((elem != null) ? elem : null); + return tmp19; + } + + + } +} diff --git a/Art_Scripts/gen-netstd/Byway/Thrift/Data/AtlasConfig.Extensions.cs.meta b/Art_Scripts/gen-netstd/Byway/Thrift/Data/AtlasConfig.Extensions.cs.meta new file mode 100644 index 00000000..0c75d1a2 --- /dev/null +++ b/Art_Scripts/gen-netstd/Byway/Thrift/Data/AtlasConfig.Extensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eb43d0f74ccd367459662968312c8e6b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Art_Tools/ArtBytesViewer.cs b/Editor/Art_Tools/ArtBytesViewer.cs new file mode 100644 index 00000000..a3d9d4c8 --- /dev/null +++ b/Editor/Art_Tools/ArtBytesViewer.cs @@ -0,0 +1,452 @@ +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Thrift; +using Thrift.Protocol; +using Thrift.Transport; +using Thrift.Transport.Client; +using Byway.Thrift.Data; + +namespace ArtTools +{ + /// + /// 美术资源Bytes文件查看器 + /// 用于查看ArtResourceConfig.bytes和ArtAtlasConfig.bytes的内容 + /// + public class ArtBytesViewer : EditorWindow + { + private enum ViewMode + { + ArtResourceConfig, + AtlasConfig + } + + private ViewMode currentMode = ViewMode.ArtResourceConfig; + private Vector2 scrollPosition; + private Vector2 tableListScrollPosition; + private Vector2 itemListScrollPosition; + + // ArtResourceConfig相关 + private ArtResourceConfig artConfig; + private int selectedTableIndex = -1; + private string tableSearchText = ""; + private string itemSearchText = ""; + + // AtlasConfig相关 + private ArtAtlasConfig atlasConfig; + private int selectedAtlasIndex = -1; + private string atlasSearchText = ""; + + // 文件信息 + private string artConfigPath = "Assets/Art_SubModule/Art_Bytes/ArtResourceConfig.bytes"; + private string atlasConfigPath = "Assets/Art_SubModule/Art_Bytes/ArtAtlasConfig.bytes"; + private FileInfo artConfigFileInfo; + private FileInfo atlasConfigFileInfo; + + [MenuItem("美术工具/Thrift/Bytes查看器")] + public static void ShowWindow() + { + var window = GetWindow("美术资源Bytes查看器"); + window.minSize = new Vector2(800, 600); + window.Show(); + } + + private void OnEnable() + { + LoadBytesFiles(); + } + + private void OnGUI() + { + EditorGUILayout.BeginVertical(); + + // 顶部工具栏 + DrawToolbar(); + + EditorGUILayout.Space(5); + + // 根据模式显示不同内容 + if (currentMode == ViewMode.ArtResourceConfig) + { + DrawArtResourceConfigView(); + } + else + { + DrawAtlasConfigView(); + } + + EditorGUILayout.EndVertical(); + } + + private void DrawToolbar() + { + EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); + + // 模式切换 + if (GUILayout.Toggle(currentMode == ViewMode.ArtResourceConfig, "美术资源配置", EditorStyles.toolbarButton)) + { + if (currentMode != ViewMode.ArtResourceConfig) + { + currentMode = ViewMode.ArtResourceConfig; + selectedTableIndex = -1; + } + } + + if (GUILayout.Toggle(currentMode == ViewMode.AtlasConfig, "图集配置", EditorStyles.toolbarButton)) + { + if (currentMode != ViewMode.AtlasConfig) + { + currentMode = ViewMode.AtlasConfig; + selectedAtlasIndex = -1; + } + } + + GUILayout.FlexibleSpace(); + + // 刷新按钮 + if (GUILayout.Button("🔄 刷新", EditorStyles.toolbarButton, GUILayout.Width(60))) + { + LoadBytesFiles(); + } + + EditorGUILayout.EndHorizontal(); + } + + private void LoadBytesFiles() + { + // 加载ArtResourceConfig + try + { + string fullArtPath = Path.Combine(Application.dataPath, "..", artConfigPath); + if (File.Exists(fullArtPath)) + { + byte[] bytes = File.ReadAllBytes(fullArtPath); + artConfigFileInfo = new FileInfo(fullArtPath); + + using (var transport = new TMemoryBufferTransport(bytes, new TConfiguration())) + { + using (var protocol = new TBinaryProtocol(transport)) + { + artConfig = new ArtResourceConfig(); + artConfig.ReadAsync(protocol, System.Threading.CancellationToken.None).GetAwaiter().GetResult(); + } + } + + Debug.Log($"[ArtBytesViewer] 成功加载 ArtResourceConfig.bytes ({bytes.Length / 1024f:F2} KB, {artConfig.Tables.Count} 个表)"); + } + else + { + Debug.LogWarning($"[ArtBytesViewer] 找不到文件: {fullArtPath}"); + } + } + catch (System.Exception ex) + { + Debug.LogError($"[ArtBytesViewer] 加载ArtResourceConfig失败: {ex.Message}"); + } + + // 加载AtlasConfig + try + { + string fullAtlasPath = Path.Combine(Application.dataPath, "..", atlasConfigPath); + if (File.Exists(fullAtlasPath)) + { + byte[] bytes = File.ReadAllBytes(fullAtlasPath); + atlasConfigFileInfo = new FileInfo(fullAtlasPath); + + using (var transport = new TMemoryBufferTransport(bytes, new TConfiguration())) + { + using (var protocol = new TBinaryProtocol(transport)) + { + atlasConfig = new ArtAtlasConfig(); + atlasConfig.ReadAsync(protocol, System.Threading.CancellationToken.None).GetAwaiter().GetResult(); + } + } + + Debug.Log($"[ArtBytesViewer] 成功加载 ArtAtlasConfig.bytes ({bytes.Length / 1024f:F2} KB, {atlasConfig.Atlases.Count} 个图集)"); + } + else + { + Debug.LogWarning($"[ArtBytesViewer] 找不到文件: {fullAtlasPath}"); + } + } + catch (System.Exception ex) + { + Debug.LogError($"[ArtBytesViewer] 加载AtlasConfig失败: {ex.Message}"); + } + } + + private void DrawArtResourceConfigView() + { + if (artConfig == null) + { + EditorGUILayout.HelpBox("未加载ArtResourceConfig.bytes\n请确保文件存在: " + artConfigPath, MessageType.Warning); + return; + } + + // 文件信息 + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + EditorGUILayout.LabelField("文件信息", EditorStyles.boldLabel); + EditorGUILayout.LabelField($"路径: {artConfigPath}"); + if (artConfigFileInfo != null) + { + EditorGUILayout.LabelField($"大小: {artConfigFileInfo.Length / 1024f:F2} KB"); + EditorGUILayout.LabelField($"修改时间: {artConfigFileInfo.LastWriteTime:yyyy-MM-dd HH:mm:ss}"); + } + EditorGUILayout.LabelField($"表数量: {artConfig.Tables.Count}"); + EditorGUILayout.LabelField($"版本: {artConfig.Version}"); + if (!string.IsNullOrEmpty(artConfig.GenerateTime)) + { + EditorGUILayout.LabelField($"生成时间: {artConfig.GenerateTime}"); + } + if (artConfig.PreloadTableIds != null && artConfig.PreloadTableIds.Count > 0) + { + EditorGUILayout.LabelField($"预加载表: {string.Join(", ", artConfig.PreloadTableIds)}"); + } + EditorGUILayout.EndVertical(); + + EditorGUILayout.Space(5); + + // 两栏布局 + EditorGUILayout.BeginHorizontal(); + + // 左侧:表列表 + EditorGUILayout.BeginVertical(GUILayout.Width(250)); + EditorGUILayout.LabelField("资源表列表", EditorStyles.boldLabel); + + // 搜索框 + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("搜索:", GUILayout.Width(40)); + tableSearchText = EditorGUILayout.TextField(tableSearchText); + EditorGUILayout.EndHorizontal(); + + tableListScrollPosition = EditorGUILayout.BeginScrollView(tableListScrollPosition, EditorStyles.helpBox); + + var filteredTables = artConfig.Tables; + if (!string.IsNullOrEmpty(tableSearchText)) + { + filteredTables = artConfig.Tables.Where(t => + t.TableName.ToLower().Contains(tableSearchText.ToLower()) || + t.TableId.ToString().Contains(tableSearchText) + ).ToList(); + } + + for (int i = 0; i < filteredTables.Count; i++) + { + var table = filteredTables[i]; + bool isSelected = selectedTableIndex == artConfig.Tables.IndexOf(table); + + var style = new GUIStyle(GUI.skin.button); + style.alignment = TextAnchor.MiddleLeft; + if (isSelected) + { + style.normal.background = Texture2D.grayTexture; + } + + if (GUILayout.Button($"[{table.TableId}] {table.TableName} ({table.Items.Count})", style)) + { + selectedTableIndex = artConfig.Tables.IndexOf(table); + } + } + + EditorGUILayout.EndScrollView(); + EditorGUILayout.EndVertical(); + + // 右侧:详细信息 + EditorGUILayout.BeginVertical(); + if (selectedTableIndex >= 0 && selectedTableIndex < artConfig.Tables.Count) + { + var selectedTable = artConfig.Tables[selectedTableIndex]; + + EditorGUILayout.LabelField($"表: {selectedTable.TableName} (ID: {selectedTable.TableId})", EditorStyles.boldLabel); + EditorGUILayout.LabelField($"资源项数量: {selectedTable.Items.Count}"); + + EditorGUILayout.Space(5); + + // 资源项搜索 + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("筛选:", GUILayout.Width(40)); + itemSearchText = EditorGUILayout.TextField(itemSearchText); + EditorGUILayout.EndHorizontal(); + + // 资源项列表 + itemListScrollPosition = EditorGUILayout.BeginScrollView(itemListScrollPosition); + + var filteredItems = selectedTable.Items; + if (!string.IsNullOrEmpty(itemSearchText)) + { + filteredItems = selectedTable.Items.Where(item => + item.Name.ToLower().Contains(itemSearchText.ToLower()) || + item.Id.ToString().Contains(itemSearchText) || + (!string.IsNullOrEmpty(item.Desc) && item.Desc.ToLower().Contains(itemSearchText.ToLower())) + ).ToList(); + } + + // 表头 + EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); + EditorGUILayout.LabelField("ID", EditorStyles.boldLabel, GUILayout.Width(50)); + EditorGUILayout.LabelField("名称", EditorStyles.boldLabel, GUILayout.Width(150)); + EditorGUILayout.LabelField("描述", EditorStyles.boldLabel, GUILayout.Width(200)); + EditorGUILayout.LabelField("Sprite", EditorStyles.boldLabel, GUILayout.Width(80)); + EditorGUILayout.LabelField("Spine", EditorStyles.boldLabel, GUILayout.Width(80)); + EditorGUILayout.EndHorizontal(); + + foreach (var item in filteredItems) + { + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(item.Id.ToString(), GUILayout.Width(50)); + EditorGUILayout.LabelField(item.Name, GUILayout.Width(150)); + EditorGUILayout.LabelField(item.Desc ?? "", GUILayout.Width(200)); + EditorGUILayout.LabelField(string.IsNullOrEmpty(item.SpritePath) ? "-" : "✓", GUILayout.Width(80)); + EditorGUILayout.LabelField(string.IsNullOrEmpty(item.SpineAssetPath) ? "-" : "✓", GUILayout.Width(80)); + EditorGUILayout.EndHorizontal(); + + // 详细路径信息 + if (!string.IsNullOrEmpty(item.SpritePath)) + { + EditorGUI.indentLevel++; + EditorGUILayout.LabelField("Sprite路径:", item.SpritePath, EditorStyles.wordWrappedLabel); + EditorGUI.indentLevel--; + } + + if (!string.IsNullOrEmpty(item.SpineAssetPath)) + { + EditorGUI.indentLevel++; + EditorGUILayout.LabelField("Spine路径:", item.SpineAssetPath, EditorStyles.wordWrappedLabel); + if (!string.IsNullOrEmpty(item.SpineAnimName)) + { + EditorGUILayout.LabelField("动画名:", item.SpineAnimName); + } + EditorGUI.indentLevel--; + } + + EditorGUILayout.EndVertical(); + } + + EditorGUILayout.EndScrollView(); + + EditorGUILayout.LabelField($"显示: {filteredItems.Count} / {selectedTable.Items.Count} 项"); + } + else + { + EditorGUILayout.HelpBox("请在左侧选择一个资源表", MessageType.Info); + } + + EditorGUILayout.EndVertical(); + + EditorGUILayout.EndHorizontal(); + } + + private void DrawAtlasConfigView() + { + if (atlasConfig == null) + { + EditorGUILayout.HelpBox("未加载ArtAtlasConfig.bytes\n请确保文件存在: " + atlasConfigPath, MessageType.Warning); + return; + } + + // 文件信息 + EditorGUILayout.BeginVertical(EditorStyles.helpBox); + EditorGUILayout.LabelField("文件信息", EditorStyles.boldLabel); + EditorGUILayout.LabelField($"路径: {atlasConfigPath}"); + if (atlasConfigFileInfo != null) + { + EditorGUILayout.LabelField($"大小: {atlasConfigFileInfo.Length / 1024f:F2} KB"); + EditorGUILayout.LabelField($"修改时间: {atlasConfigFileInfo.LastWriteTime:yyyy-MM-dd HH:mm:ss}"); + } + EditorGUILayout.LabelField($"图集数量: {atlasConfig.Atlases.Count}"); + EditorGUILayout.LabelField($"版本: {atlasConfig.Version}"); + if (!string.IsNullOrEmpty(atlasConfig.GenerateTime)) + { + EditorGUILayout.LabelField($"生成时间: {atlasConfig.GenerateTime}"); + } + EditorGUILayout.EndVertical(); + + EditorGUILayout.Space(5); + + // 两栏布局 + EditorGUILayout.BeginHorizontal(); + + // 左侧:图集列表 + EditorGUILayout.BeginVertical(GUILayout.Width(250)); + EditorGUILayout.LabelField("图集列表", EditorStyles.boldLabel); + + // 搜索框 + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("搜索:", GUILayout.Width(40)); + atlasSearchText = EditorGUILayout.TextField(atlasSearchText); + EditorGUILayout.EndHorizontal(); + + tableListScrollPosition = EditorGUILayout.BeginScrollView(tableListScrollPosition, EditorStyles.helpBox); + + var filteredAtlases = atlasConfig.Atlases; + if (!string.IsNullOrEmpty(atlasSearchText)) + { + filteredAtlases = atlasConfig.Atlases.Where(a => + a.Name.ToLower().Contains(atlasSearchText.ToLower()) + ).ToList(); + } + + for (int i = 0; i < filteredAtlases.Count; i++) + { + var atlas = filteredAtlases[i]; + bool isSelected = selectedAtlasIndex == atlasConfig.Atlases.IndexOf(atlas); + + var style = new GUIStyle(GUI.skin.button); + style.alignment = TextAnchor.MiddleLeft; + if (isSelected) + { + style.normal.background = Texture2D.grayTexture; + } + + if (GUILayout.Button($"{atlas.Name} ({atlas.SpritePaths.Count})", style)) + { + selectedAtlasIndex = atlasConfig.Atlases.IndexOf(atlas); + } + } + + EditorGUILayout.EndScrollView(); + EditorGUILayout.EndVertical(); + + // 右侧:详细信息 + EditorGUILayout.BeginVertical(); + if (selectedAtlasIndex >= 0 && selectedAtlasIndex < atlasConfig.Atlases.Count) + { + var selectedAtlas = atlasConfig.Atlases[selectedAtlasIndex]; + + EditorGUILayout.LabelField($"图集: {selectedAtlas.Name}", EditorStyles.boldLabel); + EditorGUILayout.LabelField($"Sprite数量: {selectedAtlas.SpritePaths.Count}"); + + EditorGUILayout.Space(5); + + // Sprite路径列表 + itemListScrollPosition = EditorGUILayout.BeginScrollView(itemListScrollPosition); + + EditorGUILayout.LabelField("包含的Sprite路径:", EditorStyles.boldLabel); + + int index = 1; + foreach (var spritePath in selectedAtlas.SpritePaths) + { + EditorGUILayout.BeginHorizontal(EditorStyles.helpBox); + EditorGUILayout.LabelField(index.ToString(), GUILayout.Width(30)); + EditorGUILayout.LabelField(spritePath, EditorStyles.wordWrappedLabel); + EditorGUILayout.EndHorizontal(); + index++; + } + + EditorGUILayout.EndScrollView(); + } + else + { + EditorGUILayout.HelpBox("请在左侧选择一个图集", MessageType.Info); + } + + EditorGUILayout.EndVertical(); + + EditorGUILayout.EndHorizontal(); + } + } +} diff --git a/Editor/Art_Tools/ArtBytesViewer.cs.meta b/Editor/Art_Tools/ArtBytesViewer.cs.meta new file mode 100644 index 00000000..8e9d2a75 --- /dev/null +++ b/Editor/Art_Tools/ArtBytesViewer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 511cdd52699ebbf4881364398fd09de6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Art_Tools/ArtResourceConfigEditor.cs b/Editor/Art_Tools/ArtResourceConfigEditor.cs index cbdd1d28..991200ee 100644 --- a/Editor/Art_Tools/ArtResourceConfigEditor.cs +++ b/Editor/Art_Tools/ArtResourceConfigEditor.cs @@ -6,6 +6,10 @@ using System.IO; using ArtResource; using Spine.Unity; using UnityEngine.U2D; +using Thrift; +using Thrift.Protocol; +using Thrift.Transport; +using Thrift.Transport.Client; namespace EditorArt_Tools { @@ -17,6 +21,7 @@ namespace EditorArt_Tools { private const string SO_ROOT_PATH = "Assets/Art_SubModule/Art_SO"; private const string JSON_ROOT_PATH = "Assets/Art_SubModule/Art_Json"; + private const string BYTES_ROOT_PATH = "Assets/Art_SubModule/Art_Bytes"; // ===== 数据 ===== private List allTables = new List(); @@ -1256,8 +1261,14 @@ namespace EditorArt_Tools // 同步JSON SyncToJson(selectedTable); + // 同步Thrift Bytes(新增) + SyncToThriftBytes(selectedTable); + // 更新manifest文件 UpdateManifest(); + + // 生成合并的Bytes文件 + GenerateMergedThriftBytes(); hasUnsavedChanges = false; @@ -1417,6 +1428,241 @@ namespace EditorArt_Tools } } + /// + /// 将单个表同步到Thrift Bytes格式(单表文件,暂不使用) + /// + private void SyncToThriftBytes(ArtTableSO table) + { + // 注意:这个方法生成单表bytes,但我们实际使用的是GenerateMergedThriftBytes() + // 保留此方法以防将来需要单表加载 + Debug.Log($"[ArtResourceConfigEditor] 跳过单表Bytes生成: {table.TableName}(使用合并模式)"); + } + + /// + /// 生成合并的Thrift Bytes文件(所有表合并) + /// 参考 ConfigManager 的加载方式 + /// + private void GenerateMergedThriftBytes() + { + try + { + var startTime = System.Diagnostics.Stopwatch.StartNew(); + + // 确保输出目录存在 + if (!Directory.Exists(BYTES_ROOT_PATH)) + { + Directory.CreateDirectory(BYTES_ROOT_PATH); + } + + string outputPath = Path.Combine(BYTES_ROOT_PATH, "ArtResourceConfig.bytes"); + + // 加载所有SO表 + string[] allSOGuids = AssetDatabase.FindAssets("t:ArtTableSO", new[] { SO_ROOT_PATH }); + List allSOTables = new List(); + + foreach (string guid in allSOGuids) + { + string path = AssetDatabase.GUIDToAssetPath(guid); + ArtTableSO table = AssetDatabase.LoadAssetAtPath(path); + if (table != null) + { + allSOTables.Add(table); + } + } + + // 创建Thrift数据结构 + var thriftConfig = new Byway.Thrift.Data.ArtResourceConfig + { + Tables = new List(), + Version = System.DateTimeOffset.UtcNow.ToUnixTimeSeconds(), + GenerateTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + }; + + // 转换所有表 + foreach (var soTable in allSOTables) + { + var thriftTable = new Byway.Thrift.Data.ArtTable + { + TableId = soTable.TableId, + TableName = soTable.TableName, + Items = new List() + }; + + foreach (var soItem in soTable.Items) + { + var thriftItem = new Byway.Thrift.Data.ArtItem + { + Id = soItem.Id, + Name = soItem.Name ?? "", + Desc = soItem.Desc ?? "", + SpritePath = soItem.Sprite != null ? AssetDatabase.GetAssetPath(soItem.Sprite) : "", + SpineAssetPath = soItem.SpineAsset != null ? AssetDatabase.GetAssetPath(soItem.SpineAsset) : "", + SpineAnimName = soItem.SpineAnimName ?? "" + }; + + thriftTable.Items.Add(thriftItem); + } + + thriftConfig.Tables.Add(thriftTable); + } + + // 加载预加载配置(从manifest读取) + const string MANIFEST_PATH = "Assets/Art_SubModule/Art_Json/art_table_manifest.json"; + if (File.Exists(MANIFEST_PATH)) + { + string manifestJson = File.ReadAllText(MANIFEST_PATH); + var manifest = JsonUtility.FromJson(manifestJson); + if (manifest != null && manifest.preloadTableIds != null) + { + thriftConfig.PreloadTableIds = manifest.preloadTableIds.ToList(); + } + } + + // 序列化到bytes + byte[] bytesData; + using (var memoryStream = new MemoryStream()) + { + using (var transport = new TStreamTransport(null, memoryStream, new TConfiguration())) + { + using (var protocol = new TBinaryProtocol(transport)) + { + thriftConfig.WriteAsync(protocol, System.Threading.CancellationToken.None).GetAwaiter().GetResult(); + } + } + bytesData = memoryStream.ToArray(); + } + + // 写入文件 + File.WriteAllBytes(outputPath, bytesData); + AssetDatabase.ImportAsset(outputPath); + + startTime.Stop(); + + Debug.Log($"[ArtResourceConfigEditor] ✅ Thrift Bytes生成成功!\n" + + $" 路径: {outputPath}\n" + + $" 表数量: {thriftConfig.Tables.Count}\n" + + $" 文件大小: {bytesData.Length / 1024f:F2} KB\n" + + $" 耗时: {startTime.ElapsedMilliseconds} ms"); + } + catch (System.Exception ex) + { + Debug.LogError($"[ArtResourceConfigEditor] ❌ 生成Thrift Bytes失败: {ex.Message}\n{ex.StackTrace}"); + } + } + + /// + /// 静态版本:生成合并的Thrift Bytes文件(供外部工具调用) + /// + public static void GenerateMergedThriftBytesStatic() + { + try + { + var startTime = System.Diagnostics.Stopwatch.StartNew(); + + // 确保输出目录存在 + const string BYTES_ROOT_PATH = "Assets/Art_SubModule/Art_Bytes"; + if (!Directory.Exists(BYTES_ROOT_PATH)) + { + Directory.CreateDirectory(BYTES_ROOT_PATH); + } + + string outputPath = Path.Combine(BYTES_ROOT_PATH, "ArtResourceConfig.bytes"); + + // 加载所有SO表 + const string SO_ROOT_PATH = "Assets/Art_SubModule/Art_SO"; + string[] allSOGuids = AssetDatabase.FindAssets("t:ArtTableSO", new[] { SO_ROOT_PATH }); + List allSOTables = new List(); + + foreach (string guid in allSOGuids) + { + string path = AssetDatabase.GUIDToAssetPath(guid); + ArtTableSO table = AssetDatabase.LoadAssetAtPath(path); + if (table != null) + { + allSOTables.Add(table); + } + } + + // 创建Thrift数据结构 + var thriftConfig = new Byway.Thrift.Data.ArtResourceConfig + { + Tables = new List(), + Version = System.DateTimeOffset.UtcNow.ToUnixTimeSeconds(), + GenerateTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + }; + + // 转换所有表 + foreach (var soTable in allSOTables) + { + var thriftTable = new Byway.Thrift.Data.ArtTable + { + TableId = soTable.TableId, + TableName = soTable.TableName, + Items = new List() + }; + + foreach (var soItem in soTable.Items) + { + var thriftItem = new Byway.Thrift.Data.ArtItem + { + Id = soItem.Id, + Name = soItem.Name ?? "", + Desc = soItem.Desc ?? "", + SpritePath = soItem.Sprite != null ? AssetDatabase.GetAssetPath(soItem.Sprite) : "", + SpineAssetPath = soItem.SpineAsset != null ? AssetDatabase.GetAssetPath(soItem.SpineAsset) : "", + SpineAnimName = soItem.SpineAnimName ?? "" + }; + + thriftTable.Items.Add(thriftItem); + } + + thriftConfig.Tables.Add(thriftTable); + } + + // 加载预加载配置(从manifest读取) + const string MANIFEST_PATH = "Assets/Art_SubModule/Art_Json/art_table_manifest.json"; + if (File.Exists(MANIFEST_PATH)) + { + string manifestJson = File.ReadAllText(MANIFEST_PATH); + var manifest = JsonUtility.FromJson(manifestJson); + if (manifest != null && manifest.preloadTableIds != null) + { + thriftConfig.PreloadTableIds = manifest.preloadTableIds.ToList(); + } + } + + // 序列化到bytes + byte[] bytesData; + using (var memoryStream = new MemoryStream()) + { + using (var transport = new TStreamTransport(null, memoryStream, new TConfiguration())) + { + using (var protocol = new TBinaryProtocol(transport)) + { + thriftConfig.WriteAsync(protocol, System.Threading.CancellationToken.None).GetAwaiter().GetResult(); + } + } + bytesData = memoryStream.ToArray(); + } + + // 写入文件 + File.WriteAllBytes(outputPath, bytesData); + AssetDatabase.ImportAsset(outputPath); + + startTime.Stop(); + + Debug.Log($"[ArtResourceConfigEditor] ✅ Thrift Bytes生成成功!\n" + + $" 路径: {outputPath}\n" + + $" 表数量: {thriftConfig.Tables.Count}\n" + + $" 文件大小: {bytesData.Length / 1024f:F2} KB\n" + + $" 耗时: {startTime.ElapsedMilliseconds} ms"); + } + catch (System.Exception ex) + { + Debug.LogError($"[ArtResourceConfigEditor] ❌ 生成Thrift Bytes失败: {ex.Message}\n{ex.StackTrace}"); + } + } + [System.Serializable] public class ArtTableManifest { diff --git a/Editor/Art_Tools/ArtResourcePathFiller.cs b/Editor/Art_Tools/ArtResourcePathFiller.cs index f163a66f..7ce67664 100644 --- a/Editor/Art_Tools/ArtResourcePathFiller.cs +++ b/Editor/Art_Tools/ArtResourcePathFiller.cs @@ -85,6 +85,9 @@ namespace ArtTools // 同步到JSON SyncToJson(table); + + // 注意:不在这里生成Bytes,因为单个表更新会频繁触发 + // 批量操作完成后统一生成Bytes } } @@ -133,6 +136,37 @@ namespace ArtTools } } + /// + /// 生成合并的Thrift Bytes文件(调用ArtResourceConfigEditor的方法) + /// + public static void GenerateMergedThriftBytes() + { + try + { + // 通过反射调用ArtResourceConfigEditor的GenerateMergedThriftBytes方法 + // 因为那是一个实例方法,我们需要找到编辑器窗口实例或使用静态版本 + var editorType = System.Type.GetType("ArtTools.ArtResourceConfigEditor,Assembly-CSharp-Editor"); + if (editorType != null) + { + var method = editorType.GetMethod("GenerateMergedThriftBytesStatic", + System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static); + + if (method != null) + { + method.Invoke(null, null); + } + else + { + Debug.LogWarning("[ArtResourcePathFiller] 未找到GenerateMergedThriftBytesStatic方法,请手动运行【美术工具/Thrift/批量生成所有Bytes文件】"); + } + } + } + catch (System.Exception ex) + { + Debug.LogError($"[ArtResourcePathFiller] 生成Thrift Bytes失败: {ex.Message}"); + } + } + /// /// 手动批量更新所有ArtTableSO的资源路径 /// @@ -176,11 +210,16 @@ namespace ArtTools // 保存所有修改 AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); + + // 生成合并的Thrift Bytes文件 + EditorUtility.DisplayProgressBar("生成Thrift Bytes", "正在生成配置文件...", 0.9f); + GenerateMergedThriftBytes(); + EditorUtility.ClearProgressBar(); - Debug.Log($"[ArtResourcePathFiller] ✓ 批量更新完成: 处理了 {updatedCount} 个ArtTableSO,已同步JSON配置"); + Debug.Log($"[ArtResourcePathFiller] ✓ 批量更新完成: 处理了 {updatedCount} 个ArtTableSO,已同步JSON配置和Thrift Bytes"); EditorUtility.DisplayDialog( "更新完成", - $"已更新 {updatedCount} 个美术资源表的路径信息\n并同步更新了JSON配置文件\n\n现在可以在Runtime模式下正常加载资源了", + $"已更新 {updatedCount} 个美术资源表的路径信息\n并同步更新了JSON配置文件和Thrift Bytes\n\n现在可以在Runtime模式下正常加载资源了", "确定" ); } @@ -309,7 +348,11 @@ namespace ArtTools ArtResourcePathFiller.FillResourcePaths(table); EditorUtility.SetDirty(table); AssetDatabase.SaveAssets(); - EditorUtility.DisplayDialog("更新完成", $"已更新 {table.TableName} 的资源路径", "确定"); + + // 重新生成合并的Thrift Bytes + ArtResourcePathFiller.GenerateMergedThriftBytes(); + + EditorUtility.DisplayDialog("更新完成", $"已更新 {table.TableName} 的资源路径\n并重新生成了Thrift Bytes配置", "确定"); } EditorGUILayout.Space(5); diff --git a/Editor/Art_Tools/ArtResourceThriftMenu.cs b/Editor/Art_Tools/ArtResourceThriftMenu.cs new file mode 100644 index 00000000..c189dfc1 --- /dev/null +++ b/Editor/Art_Tools/ArtResourceThriftMenu.cs @@ -0,0 +1,187 @@ +using UnityEditor; +using UnityEngine; + +namespace EditorArt_Tools +{ + /// + /// 美术资源Thrift工具菜单 + /// + public class ArtResourceThriftMenu + { + [MenuItem("美术工具/Thrift/批量生成所有Bytes文件", priority = 100)] + public static void GenerateAllBytesFiles() + { + if (!EditorUtility.DisplayDialog("生成Bytes文件", + "此操作将:\n" + + "1. 扫描所有SO表,生成 ArtResourceConfig.bytes\n" + + "2. 读取图集配置,生成 ArtAtlasConfig.bytes\n\n" + + "确定继续?", + "确定", "取消")) + { + return; + } + + var startTime = System.Diagnostics.Stopwatch.StartNew(); + + try + { + // 强制保存所有资源 + AssetDatabase.SaveAssets(); + + // 生成ArtResourceConfig.bytes + Debug.Log("========== 开始生成 ArtResourceConfig.bytes =========="); + GenerateArtResourceConfigBytes(); + + // 生成ArtAtlasConfig.bytes + Debug.Log("========== 开始生成 ArtAtlasConfig.bytes =========="); + GenerateAtlasConfigBytes(); + + // 刷新资源 + AssetDatabase.Refresh(); + + startTime.Stop(); + + string message = $"✅ 所有Bytes文件生成完成!\n\n" + + $"总耗时: {startTime.ElapsedMilliseconds} ms\n\n" + + $"生成文件:\n" + + $"• Assets/Art_SubModule/Art_Bytes/ArtResourceConfig.bytes\n" + + $"• Assets/Art_SubModule/Art_Bytes/ArtAtlasConfig.bytes"; + + Debug.Log($"[ArtResourceThriftMenu] {message}"); + EditorUtility.DisplayDialog("生成完成", message, "确定"); + } + catch (System.Exception ex) + { + startTime.Stop(); + string errorMsg = $"❌ 生成失败: {ex.Message}\n\n{ex.StackTrace}"; + Debug.LogError($"[ArtResourceThriftMenu] {errorMsg}"); + EditorUtility.DisplayDialog("生成失败", errorMsg, "确定"); + } + } + + private static void GenerateArtResourceConfigBytes() + { + // 直接调用ArtResourceConfigEditor的静态方法(需要添加) + // 或者模拟其逻辑 + var editor = EditorWindow.GetWindow(); + if (editor != null) + { + // 通过反射调用私有方法 + var method = typeof(ArtResourceConfigEditor).GetMethod("GenerateMergedThriftBytes", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + if (method != null) + { + method.Invoke(editor, null); + } + editor.Close(); + } + } + + private static void GenerateAtlasConfigBytes() + { + // 直接调用AtlasBuilderEditor的静态方法(需要添加) + var editor = EditorWindow.GetWindow(); + if (editor != null) + { + // 通过反射调用私有方法 + var method = typeof(ArtTools.AtlasBuilderEditor).GetMethod("SaveConfigToThriftBytes", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + if (method != null) + { + method.Invoke(editor, null); + } + editor.Close(); + } + } + + [MenuItem("美术工具/Thrift/测试加载Bytes文件", priority = 101)] + public static void TestLoadBytesFiles() + { + Debug.Log("========== 测试加载Bytes文件 =========="); + + // 测试ArtResourceConfig + TestLoadArtResourceConfig(); + + // 测试AtlasConfig + TestLoadAtlasConfig(); + + EditorUtility.DisplayDialog("测试完成", "请查看Console日志", "确定"); + } + + private static void TestLoadArtResourceConfig() + { + const string path = "Assets/Art_SubModule/Art_Bytes/ArtResourceConfig.bytes"; + + var textAsset = AssetDatabase.LoadAssetAtPath(path); + if (textAsset == null) + { + Debug.LogError($"❌ 文件不存在: {path}"); + return; + } + + try + { + var config = new Byway.Thrift.Data.ArtResourceConfig(); + using (var transport = new Thrift.Transport.Client.TMemoryBufferTransport(textAsset.bytes, new Thrift.TConfiguration())) + { + using (var protocol = new Thrift.Protocol.TBinaryProtocol(transport)) + { + config.ReadAsync(protocol, System.Threading.CancellationToken.None).GetAwaiter().GetResult(); + } + } + + Debug.Log($"✅ ArtResourceConfig.bytes 加载成功!\n" + + $" 表数量: {config.Tables.Count}\n" + + $" 版本: {config.Version}\n" + + $" 生成时间: {config.GenerateTime}"); + + foreach (var table in config.Tables) + { + Debug.Log($" 表: {table.TableName} (ID: {table.TableId}, Items: {table.Items.Count})"); + } + } + catch (System.Exception ex) + { + Debug.LogError($"❌ 加载失败: {ex.Message}\n{ex.StackTrace}"); + } + } + + private static void TestLoadAtlasConfig() + { + const string path = "Assets/Art_SubModule/Art_Bytes/ArtAtlasConfig.bytes"; + + var textAsset = AssetDatabase.LoadAssetAtPath(path); + if (textAsset == null) + { + Debug.LogError($"❌ 文件不存在: {path}"); + return; + } + + try + { + var config = new Byway.Thrift.Data.ArtAtlasConfig(); + using (var transport = new Thrift.Transport.Client.TMemoryBufferTransport(textAsset.bytes, new Thrift.TConfiguration())) + { + using (var protocol = new Thrift.Protocol.TBinaryProtocol(transport)) + { + config.ReadAsync(protocol, System.Threading.CancellationToken.None).GetAwaiter().GetResult(); + } + } + + Debug.Log($"✅ ArtAtlasConfig.bytes 加载成功!\n" + + $" 图集数量: {config.Atlases.Count}\n" + + $" 版本: {config.Version}\n" + + $" 生成时间: {config.GenerateTime}"); + + foreach (var atlas in config.Atlases) + { + Debug.Log($" 图集: {atlas.Name} (Sprites: {atlas.SpritePaths.Count})"); + } + } + catch (System.Exception ex) + { + Debug.LogError($"❌ 加载失败: {ex.Message}\n{ex.StackTrace}"); + } + } + } +} diff --git a/Editor/Art_Tools/ArtResourceThriftMenu.cs.meta b/Editor/Art_Tools/ArtResourceThriftMenu.cs.meta new file mode 100644 index 00000000..dccd44fb --- /dev/null +++ b/Editor/Art_Tools/ArtResourceThriftMenu.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 08c567c656adf4648b0fb5064600b46d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: