读取结构修改,json改为读取bytes

This commit is contained in:
zhang hongbo 2026-02-04 16:43:33 +08:00
parent d7cedef93e
commit 1005f2bfa3
33 changed files with 2918 additions and 18 deletions

View File

@ -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"
]
}
]

View File

@ -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}

8
Art_Bytes.meta Normal file
View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5c302f2e95b14184a98997996ac956e9
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: a1d0f95900e059c41a7fd2a89d210c29
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 03dc4370b4db3d84e81b41d2e6fb491c
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -209,6 +209,14 @@
"SpritePath": "Assets/Art_SubModule/Art_Resource/Art_UISprites/collections/DefaultHead/testHead.jpg",
"SpineAssetPath": "",
"SpineAnimName": ""
},
{
"Id": 1005,
"Name": "新资源项_1005",
"Desc": "",
"SpritePath": "Assets/Art_SubModule/Art_Resource/Art_UISprites/test1.png",
"SpineAssetPath": "",
"SpineAnimName": ""
}
]
}

View File

@ -223,3 +223,11 @@ MonoBehaviour:
SpineAsset: {fileID: 0}
SpineAssetPath:
SpineAnimName:
- Id: 1005
Name: "\u65B0\u8D44\u6E90\u9879_1005"
Desc:
Sprite: {fileID: 21300000, guid: 733315d1cf4a069438e2304ec523f0f5, type: 3}
SpritePath: Assets/Art_SubModule/Art_Resource/Art_UISprites/test1.png
SpineAsset: {fileID: 0}
SpineAssetPath:
SpineAnimName:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: bb78523eb2930094391422c0f86ae0b0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 121092cd5b40498489d0e027ac88e1c4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 05720d8b8644d9741bd3c136b9545de6
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 135a5856bdff5244bb4f4ca56d1e122a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,290 @@
/**
* <auto-generated>
* Autogenerated by Thrift Compiler (0.22.0)
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* </auto-generated>
*/
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
{
/// <summary>
/// 图集配置Thrift序列化用
/// </summary>
[DataContract(Namespace="")]
public partial class ArtAtlasConfig : TBase
{
private string _generateTime;
[DataMember(Order = 0)]
public List<global::Byway.Thrift.Data.ArtAtlasInfo> 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<global::Byway.Thrift.Data.ArtAtlasInfo> @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<global::Byway.Thrift.Data.ArtAtlasInfo>(_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();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d4c1297c76694f44b841b0508a9a86e5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,233 @@
/**
* <auto-generated>
* Autogenerated by Thrift Compiler (0.22.0)
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* </auto-generated>
*/
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
{
/// <summary>
/// 图集信息Thrift序列化用
/// </summary>
[DataContract(Namespace="")]
public partial class ArtAtlasInfo : TBase
{
[DataMember(Order = 0)]
public string Name { get; set; }
[DataMember(Order = 0)]
public List<string> SpritePaths { get; set; }
public ArtAtlasInfo()
{
}
public ArtAtlasInfo(string @name, List<string> 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<string>(_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();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 45d38a05c0140bc44b5e33c113bfbe7c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,442 @@
/**
* <auto-generated>
* Autogenerated by Thrift Compiler (0.22.0)
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* </auto-generated>
*/
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
{
/// <summary>
/// 资源项
/// </summary>
[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();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 64ddf897cd11e7d4b9a3281d0e2796aa
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,119 @@
/**
* <auto-generated>
* Autogenerated by Thrift Compiler (0.22.0)
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* </auto-generated>
*/
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<global::Byway.Thrift.Data.ArtItem> instance, object that)
{
if (!(that is List<global::Byway.Thrift.Data.ArtItem> other)) return false;
if (ReferenceEquals(instance, other)) return true;
return TCollections.Equals(instance, other);
}
public static int GetHashCode(this List<global::Byway.Thrift.Data.ArtItem> instance)
{
return TCollections.GetHashCode(instance);
}
public static List<global::Byway.Thrift.Data.ArtItem> DeepCopy(this List<global::Byway.Thrift.Data.ArtItem> source)
{
if (source == null)
return null;
var tmp27 = new List<global::Byway.Thrift.Data.ArtItem>(source.Count);
foreach (var elem in source)
tmp27.Add((elem != null) ? elem.DeepCopy() : null);
return tmp27;
}
public static bool Equals(this List<global::Byway.Thrift.Data.ArtTable> instance, object that)
{
if (!(that is List<global::Byway.Thrift.Data.ArtTable> other)) return false;
if (ReferenceEquals(instance, other)) return true;
return TCollections.Equals(instance, other);
}
public static int GetHashCode(this List<global::Byway.Thrift.Data.ArtTable> instance)
{
return TCollections.GetHashCode(instance);
}
public static List<global::Byway.Thrift.Data.ArtTable> DeepCopy(this List<global::Byway.Thrift.Data.ArtTable> source)
{
if (source == null)
return null;
var tmp28 = new List<global::Byway.Thrift.Data.ArtTable>(source.Count);
foreach (var elem in source)
tmp28.Add((elem != null) ? elem.DeepCopy() : null);
return tmp28;
}
public static bool Equals(this List<int> instance, object that)
{
if (!(that is List<int> other)) return false;
if (ReferenceEquals(instance, other)) return true;
return TCollections.Equals(instance, other);
}
public static int GetHashCode(this List<int> instance)
{
return TCollections.GetHashCode(instance);
}
public static List<int> DeepCopy(this List<int> source)
{
if (source == null)
return null;
var tmp29 = new List<int>(source.Count);
foreach (var elem in source)
tmp29.Add(elem);
return tmp29;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3a687987ea5895148b41c2bf914c8ff5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,362 @@
/**
* <auto-generated>
* Autogenerated by Thrift Compiler (0.22.0)
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* </auto-generated>
*/
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
{
/// <summary>
/// 美术资源总配置
/// 包含所有表数据 + manifest信息预加载配置
/// </summary>
[DataContract(Namespace="")]
public partial class ArtResourceConfig : TBase
{
private List<int> _preloadTableIds;
private string _generateTime;
[DataMember(Order = 0)]
public List<global::Byway.Thrift.Data.ArtTable> Tables { get; set; }
[DataMember(Order = 0)]
public List<int> 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<global::Byway.Thrift.Data.ArtTable> @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<global::Byway.Thrift.Data.ArtTable>(_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<int>(_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();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5dd576b0b43cfec459d8aa0627293ce0
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,265 @@
/**
* <auto-generated>
* Autogenerated by Thrift Compiler (0.22.0)
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* </auto-generated>
*/
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
{
/// <summary>
/// 资源表
/// </summary>
[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<global::Byway.Thrift.Data.ArtItem> Items { get; set; }
public ArtTable()
{
}
public ArtTable(int tableId, string tableName, List<global::Byway.Thrift.Data.ArtItem> @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<global::Byway.Thrift.Data.ArtItem>(_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();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d527a6fcc7860a44983ae072a2f75a9f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,92 @@
/**
* <auto-generated>
* Autogenerated by Thrift Compiler (0.22.0)
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* </auto-generated>
*/
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<global::Byway.Thrift.Data.ArtAtlasInfo> instance, object that)
{
if (!(that is List<global::Byway.Thrift.Data.ArtAtlasInfo> other)) return false;
if (ReferenceEquals(instance, other)) return true;
return TCollections.Equals(instance, other);
}
public static int GetHashCode(this List<global::Byway.Thrift.Data.ArtAtlasInfo> instance)
{
return TCollections.GetHashCode(instance);
}
public static List<global::Byway.Thrift.Data.ArtAtlasInfo> DeepCopy(this List<global::Byway.Thrift.Data.ArtAtlasInfo> source)
{
if (source == null)
return null;
var tmp18 = new List<global::Byway.Thrift.Data.ArtAtlasInfo>(source.Count);
foreach (var elem in source)
tmp18.Add((elem != null) ? elem.DeepCopy() : null);
return tmp18;
}
public static bool Equals(this List<string> instance, object that)
{
if (!(that is List<string> other)) return false;
if (ReferenceEquals(instance, other)) return true;
return TCollections.Equals(instance, other);
}
public static int GetHashCode(this List<string> instance)
{
return TCollections.GetHashCode(instance);
}
public static List<string> DeepCopy(this List<string> source)
{
if (source == null)
return null;
var tmp19 = new List<string>(source.Count);
foreach (var elem in source)
tmp19.Add((elem != null) ? elem : null);
return tmp19;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: eb43d0f74ccd367459662968312c8e6b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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
{
/// <summary>
/// 美术资源Bytes文件查看器
/// 用于查看ArtResourceConfig.bytes和ArtAtlasConfig.bytes的内容
/// </summary>
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<ArtBytesViewer>("美术资源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();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 511cdd52699ebbf4881364398fd09de6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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<ArtTableSO> allTables = new List<ArtTableSO>();
@ -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
}
}
/// <summary>
/// 将单个表同步到Thrift Bytes格式单表文件暂不使用
/// </summary>
private void SyncToThriftBytes(ArtTableSO table)
{
// 注意这个方法生成单表bytes但我们实际使用的是GenerateMergedThriftBytes()
// 保留此方法以防将来需要单表加载
Debug.Log($"[ArtResourceConfigEditor] 跳过单表Bytes生成: {table.TableName}(使用合并模式)");
}
/// <summary>
/// 生成合并的Thrift Bytes文件所有表合并
/// 参考 ConfigManager 的加载方式
/// </summary>
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<ArtTableSO> allSOTables = new List<ArtTableSO>();
foreach (string guid in allSOGuids)
{
string path = AssetDatabase.GUIDToAssetPath(guid);
ArtTableSO table = AssetDatabase.LoadAssetAtPath<ArtTableSO>(path);
if (table != null)
{
allSOTables.Add(table);
}
}
// 创建Thrift数据结构
var thriftConfig = new Byway.Thrift.Data.ArtResourceConfig
{
Tables = new List<Byway.Thrift.Data.ArtTable>(),
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<Byway.Thrift.Data.ArtItem>()
};
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<ArtTableManifest>(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}");
}
}
/// <summary>
/// 静态版本生成合并的Thrift Bytes文件供外部工具调用
/// </summary>
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<ArtTableSO> allSOTables = new List<ArtTableSO>();
foreach (string guid in allSOGuids)
{
string path = AssetDatabase.GUIDToAssetPath(guid);
ArtTableSO table = AssetDatabase.LoadAssetAtPath<ArtTableSO>(path);
if (table != null)
{
allSOTables.Add(table);
}
}
// 创建Thrift数据结构
var thriftConfig = new Byway.Thrift.Data.ArtResourceConfig
{
Tables = new List<Byway.Thrift.Data.ArtTable>(),
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<Byway.Thrift.Data.ArtItem>()
};
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<ArtTableManifest>(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
{

View File

@ -85,6 +85,9 @@ namespace ArtTools
// 同步到JSON
SyncToJson(table);
// 注意不在这里生成Bytes因为单个表更新会频繁触发
// 批量操作完成后统一生成Bytes
}
}
@ -133,6 +136,37 @@ namespace ArtTools
}
}
/// <summary>
/// 生成合并的Thrift Bytes文件调用ArtResourceConfigEditor的方法
/// </summary>
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}");
}
}
/// <summary>
/// 手动批量更新所有ArtTableSO的资源路径
/// </summary>
@ -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);

View File

@ -0,0 +1,187 @@
using UnityEditor;
using UnityEngine;
namespace EditorArt_Tools
{
/// <summary>
/// 美术资源Thrift工具菜单
/// </summary>
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<ArtResourceConfigEditor>();
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<ArtTools.AtlasBuilderEditor>();
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<TextAsset>(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<TextAsset>(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}");
}
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 08c567c656adf4648b0fb5064600b46d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: