From c4ddc0d6939e4a70c3403a556ee80edb81be0604 Mon Sep 17 00:00:00 2001 From: m0_75251201 Date: Thu, 24 Jul 2025 23:19:48 +0800 Subject: [PATCH] =?UTF-8?q?(client)=20feat:=E5=AE=9E=E7=8E=B0=E8=BA=AB?= =?UTF-8?q?=E4=BD=93=E8=B4=B4=E5=9B=BE=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Client/Assets/Prefab/Animation.prefab | 2 +- Client/Assets/Prefab/EntityPrefab.prefab | 2 +- Client/Assets/Prefab/Image.prefab | 5 +- .../Resources/Default/DefaultAnimation.meta | 8 + .../Resources/Default/DefaultAnimation/00.png | Bin 0 -> 1100 bytes .../Default/DefaultAnimation/00.png.meta | 117 ++++++++++++++ .../Resources/Default/DefaultAnimation/01.png | Bin 0 -> 1930 bytes .../Default/DefaultAnimation/01.png.meta | 117 ++++++++++++++ .../Resources/Default/DefaultEntity.prefab | 145 ++++++++++++++++++ .../Default/DefaultEntity.prefab.meta | 7 + Client/Assets/Scenes/Test.unity | 117 +------------- .../Assets/Scripts/Configs/ConfigProcessor.cs | 49 ++++++ Client/Assets/Scripts/Entity/Entity.cs | 47 ++++-- .../Assets/Scripts/Managers/DefineManager.cs | 11 +- .../Assets/Scripts/Managers/EntityManage.cs | 26 ++++ .../Scripts/Managers/PackagesImageManager.cs | 86 ++++++++++- Client/Assets/Scripts/Prefab/ImagePrefab.cs | 128 ++-------------- Client/Assets/Scripts/Test/TestDefine.cs | 2 + Client/Data/Core/Define/Map/Map.xml | 2 +- .../Body/ab3cf10a9bf5bf22b4a28da98a2ecd3b.png | Bin 0 -> 6518 bytes 20 files changed, 613 insertions(+), 258 deletions(-) create mode 100644 Client/Assets/Resources/Default/DefaultAnimation.meta create mode 100644 Client/Assets/Resources/Default/DefaultAnimation/00.png create mode 100644 Client/Assets/Resources/Default/DefaultAnimation/00.png.meta create mode 100644 Client/Assets/Resources/Default/DefaultAnimation/01.png create mode 100644 Client/Assets/Resources/Default/DefaultAnimation/01.png.meta create mode 100644 Client/Assets/Resources/Default/DefaultEntity.prefab create mode 100644 Client/Assets/Resources/Default/DefaultEntity.prefab.meta create mode 100644 Client/Data/Core/Resources/Character/Test/Body/ab3cf10a9bf5bf22b4a28da98a2ecd3b.png diff --git a/Client/Assets/Prefab/Animation.prefab b/Client/Assets/Prefab/Animation.prefab index 5859295..5ee3c0a 100644 --- a/Client/Assets/Prefab/Animation.prefab +++ b/Client/Assets/Prefab/Animation.prefab @@ -77,7 +77,7 @@ SpriteRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 - m_Sprite: {fileID: 7482667652216324306, guid: 311925a002f4447b3a28927169b83ea6, type: 3} + m_Sprite: {fileID: 21300000, guid: 620e16cb0aec3684db9ef80bdcc85695, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 m_FlipY: 0 diff --git a/Client/Assets/Prefab/EntityPrefab.prefab b/Client/Assets/Prefab/EntityPrefab.prefab index 92fb1cf..15f2904 100644 --- a/Client/Assets/Prefab/EntityPrefab.prefab +++ b/Client/Assets/Prefab/EntityPrefab.prefab @@ -173,8 +173,8 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1697214530303839877} - {fileID: 5549544358816209289} + - {fileID: 1697214530303839877} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &3332598847335032684 diff --git a/Client/Assets/Prefab/Image.prefab b/Client/Assets/Prefab/Image.prefab index 91a375a..88bd3ef 100644 --- a/Client/Assets/Prefab/Image.prefab +++ b/Client/Assets/Prefab/Image.prefab @@ -100,7 +100,4 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0c360a9f1baf4eaf9afa85617c395b0d, type: 3} m_Name: m_EditorClassIdentifier: - _defaultSprite: {fileID: 21300000, guid: 620e16cb0aec3684db9ef80bdcc85695, type: 3} - _tintColor: {r: 1, g: 1, b: 1, a: 1} - _alpha: 1 - _preserveAspect: 1 + defaultSprite: {fileID: 21300000, guid: 620e16cb0aec3684db9ef80bdcc85695, type: 3} diff --git a/Client/Assets/Resources/Default/DefaultAnimation.meta b/Client/Assets/Resources/Default/DefaultAnimation.meta new file mode 100644 index 0000000..0ebbc20 --- /dev/null +++ b/Client/Assets/Resources/Default/DefaultAnimation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e0d6e117bfb89f14689759c2ed37bcb4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/Assets/Resources/Default/DefaultAnimation/00.png b/Client/Assets/Resources/Default/DefaultAnimation/00.png new file mode 100644 index 0000000000000000000000000000000000000000..f92c6e175ef118790260591ddb6c63da386c3fc3 GIT binary patch literal 1100 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 QdH?_b07*qoM6N<$f}Vu6F8}}l literal 0 HcmV?d00001 diff --git a/Client/Assets/Resources/Default/DefaultAnimation/01.png.meta b/Client/Assets/Resources/Default/DefaultAnimation/01.png.meta new file mode 100644 index 0000000..fb7d81b --- /dev/null +++ b/Client/Assets/Resources/Default/DefaultAnimation/01.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: d306bc49c39e71f40870ef415657b5ba +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 40 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/Assets/Resources/Default/DefaultEntity.prefab b/Client/Assets/Resources/Default/DefaultEntity.prefab new file mode 100644 index 0000000..e1f6ff9 --- /dev/null +++ b/Client/Assets/Resources/Default/DefaultEntity.prefab @@ -0,0 +1,145 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &4172273043265116072 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 978302365984264250} + m_Modifications: + - target: {fileID: 2113064398104960506, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} + propertyPath: _sprites.Array.size + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 2113064398104960506, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} + propertyPath: '_sprites.Array.data[0]' + value: + objectReference: {fileID: 21300000, guid: 3c21903d3e2b0754faf71558957968d5, type: 3} + - target: {fileID: 2113064398104960506, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} + propertyPath: '_sprites.Array.data[1]' + value: + objectReference: {fileID: 21300000, guid: d306bc49c39e71f40870ef415657b5ba, type: 3} + - target: {fileID: 5021031438404678310, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} + propertyPath: m_Name + value: Animation + objectReference: {fileID: 0} + - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} +--- !u!4 &5706548514770437405 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} + m_PrefabInstance: {fileID: 4172273043265116072} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &4652308439801383347 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 697189026367054479, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} + propertyPath: m_LocalPosition.x + value: -0.93 + objectReference: {fileID: 0} + - target: {fileID: 697189026367054479, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} + propertyPath: m_LocalPosition.y + value: -0.25 + objectReference: {fileID: 0} + - target: {fileID: 697189026367054479, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 697189026367054479, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 697189026367054479, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 697189026367054479, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 697189026367054479, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 697189026367054479, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 697189026367054479, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 697189026367054479, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 887327274103887133, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} + propertyPath: m_Name + value: DefaultEntity Variant + objectReference: {fileID: 0} + - target: {fileID: 887327274103887133, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: 5549544358816209289, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} + insertIndex: -1 + addedObject: {fileID: 5706548514770437405} + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} +--- !u!4 &978302365984264250 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5549544358816209289, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} + m_PrefabInstance: {fileID: 4652308439801383347} + m_PrefabAsset: {fileID: 0} diff --git a/Client/Assets/Resources/Default/DefaultEntity.prefab.meta b/Client/Assets/Resources/Default/DefaultEntity.prefab.meta new file mode 100644 index 0000000..51ea59e --- /dev/null +++ b/Client/Assets/Resources/Default/DefaultEntity.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 89661daa5f100c64783f0ad9cd37a7ff +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/Assets/Scenes/Test.unity b/Client/Assets/Scenes/Test.unity index ff90861..c6005b0 100644 --- a/Client/Assets/Scenes/Test.unity +++ b/Client/Assets/Scenes/Test.unity @@ -686,6 +686,7 @@ MonoBehaviour: isGlobal: 1 entityLevel: {fileID: 309861628} entityPrefab: {fileID: 3332598847335032684, guid: 6cd8b01a0f57372438dc30c864ae1530, type: 3} + defaultEntityPrefab: {fileID: 0} --- !u!114 &2036983434 MonoBehaviour: m_ObjectHideFlags: 0 @@ -743,120 +744,6 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1001 &4078005684296227559 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 4201281305206751642, guid: a6657f26d735fab4690c8185980fda29, type: 3} - propertyPath: m_LocalPosition.x - value: -5.781 - objectReference: {fileID: 0} - - target: {fileID: 4201281305206751642, guid: a6657f26d735fab4690c8185980fda29, type: 3} - propertyPath: m_LocalPosition.y - value: -0.39 - objectReference: {fileID: 0} - - target: {fileID: 4201281305206751642, guid: a6657f26d735fab4690c8185980fda29, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4201281305206751642, guid: a6657f26d735fab4690c8185980fda29, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4201281305206751642, guid: a6657f26d735fab4690c8185980fda29, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4201281305206751642, guid: a6657f26d735fab4690c8185980fda29, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4201281305206751642, guid: a6657f26d735fab4690c8185980fda29, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4201281305206751642, guid: a6657f26d735fab4690c8185980fda29, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4201281305206751642, guid: a6657f26d735fab4690c8185980fda29, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4201281305206751642, guid: a6657f26d735fab4690c8185980fda29, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5309816858037840717, guid: a6657f26d735fab4690c8185980fda29, type: 3} - propertyPath: m_Name - value: Image - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: a6657f26d735fab4690c8185980fda29, type: 3} ---- !u!1001 &7665142047032752812 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 5021031438404678310, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} - propertyPath: m_Name - value: Animation - objectReference: {fileID: 0} - - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} - propertyPath: m_LocalPosition.x - value: -7.758 - objectReference: {fileID: 0} - - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} - propertyPath: m_LocalPosition.y - value: -0.34 - objectReference: {fileID: 0} - - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8563418329714102965, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: ea9af70ce0f4c8b4a9de58ac63074156, type: 3} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 @@ -867,5 +754,3 @@ SceneRoots: - {fileID: 309861630} - {fileID: 2036983432} - {fileID: 1371068282} - - {fileID: 7665142047032752812} - - {fileID: 4078005684296227559} diff --git a/Client/Assets/Scripts/Configs/ConfigProcessor.cs b/Client/Assets/Scripts/Configs/ConfigProcessor.cs index 9dc772a..d4bc34e 100644 --- a/Client/Assets/Scripts/Configs/ConfigProcessor.cs +++ b/Client/Assets/Scripts/Configs/ConfigProcessor.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Xml.Linq; @@ -339,5 +340,53 @@ namespace Configs return null; } } + /// + /// 获取指定目录下所有匹配后缀名的文件路径(可递归) + /// + /// 目标文件夹路径 + /// 后缀名列表(如 ["txt", "jpg"]) + /// 是否包含子文件夹 + /// 匹配的文件路径列表 + public static List GetFilesByExtensions( + string directoryPath, + string[] extensions, + SearchOption searchOption = SearchOption.AllDirectories) + { + if (string.IsNullOrWhiteSpace(directoryPath)) + throw new ArgumentException("目录路径不能为空", nameof(directoryPath)); + + if (!Directory.Exists(directoryPath)) + throw new DirectoryNotFoundException($"目录不存在: {directoryPath}"); + + if (extensions == null || extensions.Length == 0) + throw new ArgumentException("后缀名列表不能为空", nameof(extensions)); + + // 标准化后缀名(去掉点,转小写) + var normalizedExtensions = new HashSet( + extensions.Select(ext => ext.TrimStart('.').ToLower()) + ); + + var result = new List(); + + try + { + var files = Directory.GetFiles(directoryPath, "*", searchOption); + foreach (var file in files) + { + var ext = Path.GetExtension(file).TrimStart('.').ToLower(); + if (normalizedExtensions.Contains(ext)) + { + result.Add(file); + } + } + } + catch (UnauthorizedAccessException ex) + { + // 可选:记录日志或忽略无权限目录 + Console.WriteLine($"访问被拒绝: {ex.Message}"); + } + + return result; + } } } \ No newline at end of file diff --git a/Client/Assets/Scripts/Entity/Entity.cs b/Client/Assets/Scripts/Entity/Entity.cs index e8dc4be..d91d736 100644 --- a/Client/Assets/Scripts/Entity/Entity.cs +++ b/Client/Assets/Scripts/Entity/Entity.cs @@ -16,7 +16,7 @@ namespace Entity public AIBase aiTree; public JobBase currentJob; - public AttributesDef attributes; + public AttributesDef attributes=new(); public Vector3 direction; public GameObject body; public string affiliation; @@ -42,15 +42,18 @@ namespace Entity private bool _isPlayerControlled = false; private bool _warning = false; - private Dictionary> bodyNode=new(); - private Orientation currentOrientation=Orientation.Down; + private Dictionary> bodyAnimationNode=new(); + private Dictionary bodyNodes = new(); + + private Orientation currentOrientation = Orientation.Down; public virtual void Init(PawnDef pawnDef) { attributes = pawnDef.attributes.Clone(); aiTree = ConvertToAIBase(pawnDef.behaviorTree); - affiliation=pawnDef.affiliation; + affiliation = pawnDef.affiliation; InitBody(pawnDef.drawingOrder); + } public virtual void InitBody(DrawingOrderDef drawingOrder) @@ -60,8 +63,8 @@ namespace Entity foreach (var orientation in orientations) { - currentOrientation=orientation; - bodyNode[orientation]=new(); + currentOrientation = orientation; + bodyAnimationNode[orientation] = new(); // 获取当前方向的绘图节点 var drawNode = drawingOrder.GetDrawingOrder(orientation); @@ -70,8 +73,15 @@ namespace Entity directionRoot.transform.SetParent(body.transform, false); InitBodyPart(drawNode, directionRoot); + bodyNodes[orientation] = directionRoot; } - currentOrientation=Orientation.Down; + currentOrientation = Orientation.Down; + + foreach (var bodyNode in bodyNodes) + { + bodyNode.Value.SetActive(false); + } + SetOrientation(Orientation.Down); } // 递归初始化单个绘图节点及其子节点 @@ -83,19 +93,19 @@ namespace Entity switch (drawNode.drawNodeType) { case DrawNodeType.Image: - nodeObject = Instantiate(imagePrefab.gameObject); + nodeObject = Instantiate(imagePrefab.gameObject,parent.transform); break; case DrawNodeType.Animation: - nodeObject = Instantiate(animatorPrefab.gameObject); + nodeObject = Instantiate(animatorPrefab.gameObject,parent.transform); ITick tick = nodeObject.GetComponent(); if (tick != null) - bodyNode[currentOrientation].Add(tick); + bodyAnimationNode[currentOrientation].Add(tick); break; default: throw new ArgumentOutOfRangeException(); } - + nodeObject.transform.localPosition = drawNode.position; // 递归初始化子节点 foreach (var child in drawNode.children) { @@ -113,9 +123,9 @@ namespace Entity AutoBehave(); } - foreach (var bodyPart in bodyNode.Values) + if (bodyAnimationNode.TryGetValue(currentOrientation, out var ticks)) { - foreach (var tick in bodyPart) + foreach (var tick in ticks) { tick.Tick(); } @@ -126,12 +136,19 @@ namespace Entity { } + + public virtual void SetOrientation(Orientation orientation) + { + bodyNodes[currentOrientation]?.SetActive(false); + currentOrientation = orientation; + bodyNodes[orientation]?.SetActive(true); + } /// /// 往对应朝向移动moveSpeed*deltaTime的距离 /// public virtual void TryMove() { - transform.position+=direction * (attributes.moveSpeed * Time.deltaTime * (IsChase ? 1 : 0.5f)); + transform.position += direction * (attributes.moveSpeed * Time.deltaTime * (IsChase ? 1 : 0.5f)); } public virtual void OnHit(Entity from) @@ -156,6 +173,8 @@ namespace Entity private void AutoBehave() { + if(aiTree == null) + return; if (currentJob == null || !currentJob.Running) { currentJob = aiTree.GetJob(this); diff --git a/Client/Assets/Scripts/Managers/DefineManager.cs b/Client/Assets/Scripts/Managers/DefineManager.cs index 44c06b3..964320f 100644 --- a/Client/Assets/Scripts/Managers/DefineManager.cs +++ b/Client/Assets/Scripts/Managers/DefineManager.cs @@ -14,9 +14,11 @@ namespace Managers public class DefineManager : Singleton { private static readonly string[] dataSetFilePath = { "Data", "Mods" }; - + //类别,定义名,定义 public Dictionary> defines = new(); + //包id,包 public Dictionary packs = new(); + //类别,定义 public Dictionary> anonymousDefines = new(); /// /// 初始化定义管理器,加载所有定义包并构建定义字典。 @@ -46,12 +48,14 @@ namespace Managers Dictionary fieldCache = new(); // 需要链接的定义、需要链接的字段、链接信息 List> defineCache = new(); + + string currentPackID = string.Empty; void ProcessDefine(Define def) { if (def == null || def.isReferene) return; - + def.packID = currentPackID; // 如果字段信息已经缓存,则直接使用缓存 if (!fieldCache.TryGetValue(def.GetType(), out var defineFields)) { @@ -89,11 +93,12 @@ namespace Managers foreach (var pack in packs) { + currentPackID = pack.Value.packID; foreach (var (typeName, defList) in pack.Value.defines) { if (!defines.ContainsKey(typeName)) defines[typeName] = new Dictionary(); - + foreach (var def in defList) { defines[typeName][def.defName] = def; diff --git a/Client/Assets/Scripts/Managers/EntityManage.cs b/Client/Assets/Scripts/Managers/EntityManage.cs index 5610772..6d968d1 100644 --- a/Client/Assets/Scripts/Managers/EntityManage.cs +++ b/Client/Assets/Scripts/Managers/EntityManage.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using Base; @@ -12,6 +13,8 @@ namespace Managers public GameObject entityLevel; public EntityPrefab entityPrefab; + + public EntityPrefab defaultEntityPrefab; public void Tick() { @@ -57,6 +60,7 @@ namespace Managers if (entityPrefab == null) { Debug.LogError("Error: entityPrefab is null. Please assign a valid prefab."); + GenerateDefaultEntity(pos); return; } @@ -64,6 +68,7 @@ namespace Managers if (pawnDef == null) { Debug.LogError("Error: PawnDef is null. Cannot generate entity without a valid PawnDef."); + GenerateDefaultEntity(pos); return; } @@ -79,6 +84,7 @@ namespace Managers if (entityComponent == null) { Debug.LogError($"Error: EntityPrefab component not found on the instantiated object: {entity.name}"); + GenerateDefaultEntity(pos); return; } @@ -96,12 +102,32 @@ namespace Managers { // 捕获并记录任何异常 Debug.LogError($"An error occurred while generating the entity: {ex.Message}"); + GenerateDefaultEntity(pos); } } + public void GenerateDefaultEntity(Vector3 pos) + { + var entity = Instantiate(entityPrefab.gameObject, pos, Quaternion.identity, entityLevel.transform); + var entityComponent = entity.GetComponent(); + const string factionKey = "default"; + if (!factionEntities.ContainsKey(factionKey)) + { + factionEntities[factionKey] = new List(); + } + factionEntities[factionKey].Add(entityComponent); + } protected override void OnStart() { factionEntities.Clear(); + + } + + private void Start() + { + var pre = Resources.Load("Default/DefaultEntity"); + defaultEntityPrefab = pre.GetComponent(); + } } } \ No newline at end of file diff --git a/Client/Assets/Scripts/Managers/PackagesImageManager.cs b/Client/Assets/Scripts/Managers/PackagesImageManager.cs index 39f60bb..7acc03c 100644 --- a/Client/Assets/Scripts/Managers/PackagesImageManager.cs +++ b/Client/Assets/Scripts/Managers/PackagesImageManager.cs @@ -1,6 +1,8 @@ +using System; using System.Collections.Generic; using System.IO; using Data; +using NUnit.Framework; using UnityEngine; namespace Managers @@ -8,17 +10,25 @@ namespace Managers public class PackagesImageManager : Utils.Singleton { public Sprite defaultSprite; - + //包名,图片名 public Dictionary> packagesImages = new(); + //包名,图片名 public Dictionary> sprites = new(); - + //包名,文件路径,身体部件名 + public Dictionary>>> bodyTexture = new(); + public void Init() { if (packagesImages.Count > 0) return; defaultSprite = Resources.Load("Default/DefaultImage"); - if(defaultSprite) - Debug.Log("加载成功"); + InitImageDef(); + InitDrawOrder(); + packagesImages = null; + } + + public void InitImageDef() + { var imageDef = Managers.DefineManager.Instance.QueryDefinesByType(); foreach (var ima in imageDef) { @@ -38,6 +48,44 @@ namespace Managers SplitTextureIntoSprites(packId, ima.name, texture, ima.hCount, ima.wCount, ima.pixelsPerUnit); } + + } + + public void InitDrawOrder() + { + var drawOrderDef = Managers.DefineManager.Instance.QueryDefinesByType(); + if (drawOrderDef == null || drawOrderDef.Length == 0) + { + return; + } + Dictionary packRootSite = new(); + foreach (var drawOrder in drawOrderDef) + { + if (string.IsNullOrEmpty(drawOrder.texturePath) || string.IsNullOrEmpty(drawOrder.packID)) + continue; + if (!packRootSite.ContainsKey(drawOrder.packID)) + packRootSite[drawOrder.packID] = Managers.DefineManager.Instance.GetPackagePath(drawOrder.packID); + var rootPath= packRootSite[drawOrder.packID]; + var folderPath=Path.Combine(rootPath, drawOrder.texturePath); + var imagePath = Configs.ConfigProcessor.GetFilesByExtensions(folderPath, + new[] + { + "jpg", "jpeg", "png", "tga", "tif", "tiff", "psd", "bmp" + }); + foreach (var path in imagePath) + { + var image=Configs.ConfigProcessor.LoadTextureByIO(path); + if (image == null) + continue; + var spr=Sprite.Create( + image, + new Rect(0, 0, image.width, image.height), + new Vector2(0.5f, 0.5f) // 中心点 + ); + var name=Path.GetFileNameWithoutExtension(path); + InsertBodySprite(drawOrder.packID, drawOrder.texturePath, name, spr); + } + } } private void SplitTextureIntoSprites( @@ -131,5 +179,35 @@ namespace Managers var fullName = $"{name}_{index}"; return GetSprite(packID, fullName); } + /// + /// 插入 Sprite 到指定的嵌套字典中。 + /// + /// 包名。 + /// 文件路径。 + /// 身体部件名。 + /// 要插入的 Sprite 对象。 + public void InsertBodySprite(string packageName, string filePath, string bodyPartName, Sprite sprite) + { + // 确保第一层字典(包名)存在 + if (!bodyTexture.ContainsKey(packageName)) + { + bodyTexture[packageName] = new Dictionary>>(); + } + + // 确保第二层字典(文件路径)存在 + if (!bodyTexture[packageName].ContainsKey(filePath)) + { + bodyTexture[packageName][filePath] = new Dictionary>(); + } + + // 确保第三层字典(身体部件名)存在 + if (!bodyTexture[packageName][filePath].ContainsKey(bodyPartName)) + { + bodyTexture[packageName][filePath][bodyPartName] = new List(); + } + + // 将 Sprite 添加到列表中 + bodyTexture[packageName][filePath][bodyPartName].Add(sprite); + } } } \ No newline at end of file diff --git a/Client/Assets/Scripts/Prefab/ImagePrefab.cs b/Client/Assets/Scripts/Prefab/ImagePrefab.cs index 07ab9b7..b7c4ebf 100644 --- a/Client/Assets/Scripts/Prefab/ImagePrefab.cs +++ b/Client/Assets/Scripts/Prefab/ImagePrefab.cs @@ -3,142 +3,42 @@ using UnityEngine; namespace Prefab { - [RequireComponent(typeof(SpriteRenderer))] + + [RequireComponent(typeof(SpriteRenderer))] public class ImagePrefab : MonoBehaviour { - [Header("Display Settings")] [SerializeField] - private Sprite _defaultSprite; + public Sprite defaultSprite; - [SerializeField] private Color _tintColor = Color.white; - [SerializeField, Range(0, 1)] private float _alpha = 1f; - [SerializeField] private bool _preserveAspect = true; - - private SpriteRenderer _renderer; - private Vector2 _originalSize; - private bool _isInitialized; - - public Sprite DisplayedSprite => _renderer.sprite; - public Color CurrentColor => _renderer.color; + private SpriteRenderer spriteRenderer; private void Awake() { - InitializeRenderer(); - } - - private void InitializeRenderer() - { - if (_isInitialized) return; - - _renderer = GetComponent(); - - // 初始尺寸记录 - if (_defaultSprite != null) + spriteRenderer = GetComponent(); + if (spriteRenderer == null) { - _originalSize = new Vector2( - _defaultSprite.rect.width / _defaultSprite.pixelsPerUnit, - _defaultSprite.rect.height / _defaultSprite.pixelsPerUnit - ); + Debug.LogError("SpriteRenderer组件未找到,请确保预制体包含该组件!"); + return; } - - // 设置初始状态 - ApplyVisualSettings(); - _isInitialized = true; - } - - private void ApplyVisualSettings() - { - if (!_isInitialized) InitializeRenderer(); - - // 设置精灵和颜色 - _renderer.sprite = _defaultSprite; - _renderer.color = new Color(_tintColor.r, _tintColor.g, _tintColor.b, _alpha); - - // 保持原始纵横比 - if (_preserveAspect && _defaultSprite != null) + if (defaultSprite != null) { - MaintainAspectRatio(); + spriteRenderer.sprite = defaultSprite; } } - private void MaintainAspectRatio() - { - Vector2 currentSize = transform.lossyScale; - float aspectRatio = _originalSize.x / _originalSize.y; - - if (currentSize.x == 0 || currentSize.y == 0) return; - - float currentAspect = currentSize.x / currentSize.y; - - if (Mathf.Abs(currentAspect - aspectRatio) > 0.01f) - { - Vector2 newScale = currentSize; - if (currentAspect > aspectRatio) - { - newScale.x = currentSize.y * aspectRatio; - } - else - { - newScale.y = currentSize.x / aspectRatio; - } - - transform.localScale = newScale; - } - } - - // 公共控制方法 public void SetSprite(Sprite newSprite) { - _defaultSprite = newSprite; - if (_defaultSprite != null) + if (spriteRenderer != null && newSprite != null) { - _originalSize = new Vector2( - _defaultSprite.rect.width / _defaultSprite.pixelsPerUnit, - _defaultSprite.rect.height / _defaultSprite.pixelsPerUnit - ); + spriteRenderer.sprite = newSprite; } - - ApplyVisualSettings(); } public void SetColor(Color newColor) { - _tintColor = newColor; - ApplyVisualSettings(); - } - - public void SetAlpha(float newAlpha) - { - _alpha = Mathf.Clamp01(newAlpha); - ApplyVisualSettings(); - } - - public void ToggleVisibility(bool isVisible) - { - if (!_isInitialized) InitializeRenderer(); - _renderer.enabled = isVisible; - } - - public void SetSortingLayer(string layerName, int order) - { - if (!_isInitialized) InitializeRenderer(); - _renderer.sortingLayerName = layerName; - _renderer.sortingOrder = order; - } - -#if UNITY_EDITOR - private void OnValidate() - { - // 编辑器模式下实时预览变化 - if (UnityEditor.EditorApplication.isPlaying) + if (spriteRenderer != null) { - ApplyVisualSettings(); - } - else if (GetComponent() != null) - { - GetComponent().sprite = _defaultSprite; - GetComponent().color = new Color(_tintColor.r, _tintColor.g, _tintColor.b, _alpha); + spriteRenderer.color = newColor; } } -#endif } } \ No newline at end of file diff --git a/Client/Assets/Scripts/Test/TestDefine.cs b/Client/Assets/Scripts/Test/TestDefine.cs index 673746a..55333bb 100644 --- a/Client/Assets/Scripts/Test/TestDefine.cs +++ b/Client/Assets/Scripts/Test/TestDefine.cs @@ -13,12 +13,14 @@ namespace Test void Awake() { Managers.DefineManager.Instance.Init(); + } private void Start() { var chicken = Managers.DefineManager.Instance.FindDefine("testPawn"); entityManager.GenerateEntity(chicken,Vector3.zero); + entityManager.GenerateDefaultEntity(Vector3.down); Debug.Log(chicken); } diff --git a/Client/Data/Core/Define/Map/Map.xml b/Client/Data/Core/Define/Map/Map.xml index cccc224..48aa780 100644 --- a/Client/Data/Core/Define/Map/Map.xml +++ b/Client/Data/Core/Define/Map/Map.xml @@ -22,7 +22,7 @@ - + diff --git a/Client/Data/Core/Resources/Character/Test/Body/ab3cf10a9bf5bf22b4a28da98a2ecd3b.png b/Client/Data/Core/Resources/Character/Test/Body/ab3cf10a9bf5bf22b4a28da98a2ecd3b.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1d5ceba5a0c5881756108126d1dd7aa4a83528 GIT binary patch literal 6518 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 literal 0 HcmV?d00001