From 8916440e7ebde67f0a42b9cf2b7d91c50b14f44c Mon Sep 17 00:00:00 2001 From: m0_75251201 Date: Fri, 22 Aug 2025 20:43:55 +0800 Subject: [PATCH] =?UTF-8?q?(client)=20chore:=E4=BF=AE=E6=94=B9=E4=BA=86?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E7=9A=84=E8=BA=AB=E4=BD=93=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E7=9A=84=E5=AE=9A=E4=B9=89=E6=96=B9=E5=BC=8F=EF=BC=8C=E7=8E=B0?= =?UTF-8?q?=E5=9C=A8=E5=9B=BE=E7=89=87=E8=B5=84=E6=BA=90=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E4=BD=BF=E7=94=A8ImageDef=E5=8A=A0=E8=BD=BD=EF=BC=8C=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E4=BA=86=E6=9B=B4=E8=8A=82=E7=9C=81=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E7=9A=84=E5=88=9D=E5=A7=8B=E5=8C=96=E6=96=B9=E5=BC=8F=EF=BC=9B?= =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E4=BA=86=E5=AE=9A=E4=B9=89=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E6=95=B0=E7=BB=84=E6=97=B6=E5=8F=AA=E8=83=BD=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E6=95=B0=E7=BB=84=E8=80=8C=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=88=97=E8=A1=A8=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Character/Test/Body/Body_Down_0.png | Bin 1766 -> 0 bytes .../Character/Test/Body/Body_Down_0.png.meta | 117 ---- .../Character/Test/Body/Body_Down_1.png | Bin 1744 -> 0 bytes .../Character/Test/Body/Body_Down_1.png.meta | 117 ---- .../Character/Test/Body/Body_Down_2.png | Bin 1712 -> 0 bytes .../Character/Test/Body/Body_Down_3.png | Bin 1727 -> 0 bytes .../Character/Test/Body/Body_Down_3.png.meta | 117 ---- .../Character/Test/Body/Body_Down_4.png | Bin 1766 -> 0 bytes .../Character/Test/Body/Body_Down_4.png.meta | 117 ---- .../Character/Test/Body/idle_down.png | Bin 0 -> 3646 bytes ...ody_Down_2.png.meta => idle_down.png.meta} | 8 +- .../Assets/Resources/Prefab/UI/DevMenu.prefab | 10 +- Client/Assets/Scenes/Game.unity | 443 ++++++++++++++ Client/Assets/Scenes/Initiate.unity | 48 ++ Client/Assets/Scripts/Base/UIInputControl.cs | 2 +- .../Scripts/CameraControl/CameraControl.cs | 34 +- Client/Assets/Scripts/Data/DefinePack.cs | 52 +- Client/Assets/Scripts/Data/DrawingOrderDef.cs | 284 ++++++--- .../Data/{ResourcesDef.cs => ImageDef.cs} | 0 ...{ResourcesDef.cs.meta => ImageDef.cs.meta} | 0 Client/Assets/Scripts/Entity/Entity.cs | 308 +++++++--- .../Scripts/Managers/AffiliationManager.cs | 1 + .../Assets/Scripts/Managers/EntityManage.cs | 16 +- .../Scripts/Managers/PackagesImageManager.cs | 555 ++++++++++-------- Client/Assets/Scripts/Map/DoubleMap.cs | 81 ++- Client/Assets/Scripts/Map/MapGenerator.cs | 16 +- Client/Assets/Scripts/Prefab/EntityPrefab.cs | 17 +- Client/Data/Core/Define/Pawn/Character.xml | 22 +- 28 files changed, 1411 insertions(+), 954 deletions(-) delete mode 100644 Client/Assets/Resources/Character/Test/Body/Body_Down_0.png delete mode 100644 Client/Assets/Resources/Character/Test/Body/Body_Down_0.png.meta delete mode 100644 Client/Assets/Resources/Character/Test/Body/Body_Down_1.png delete mode 100644 Client/Assets/Resources/Character/Test/Body/Body_Down_1.png.meta delete mode 100644 Client/Assets/Resources/Character/Test/Body/Body_Down_2.png delete mode 100644 Client/Assets/Resources/Character/Test/Body/Body_Down_3.png delete mode 100644 Client/Assets/Resources/Character/Test/Body/Body_Down_3.png.meta delete mode 100644 Client/Assets/Resources/Character/Test/Body/Body_Down_4.png delete mode 100644 Client/Assets/Resources/Character/Test/Body/Body_Down_4.png.meta create mode 100644 Client/Assets/Resources/Character/Test/Body/idle_down.png rename Client/Assets/Resources/Character/Test/Body/{Body_Down_2.png.meta => idle_down.png.meta} (96%) rename Client/Assets/Scripts/Data/{ResourcesDef.cs => ImageDef.cs} (100%) rename Client/Assets/Scripts/Data/{ResourcesDef.cs.meta => ImageDef.cs.meta} (100%) diff --git a/Client/Assets/Resources/Character/Test/Body/Body_Down_0.png b/Client/Assets/Resources/Character/Test/Body/Body_Down_0.png deleted file mode 100644 index 501c69e37b262581dbf0cb52621b120557875a50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1766 zcmVPx*ph-kQRCr$PnSV@HRT#$~hnmn2GcA>bED=RBGb$-#%atO5Da$#-TuF{rOiXgo zPaQUGw1x_^7E8^g&N&;II7QcVGYeN_YKkJ7`2(>u!wSqFqkRuN*Yn;V?|a{S&-->6 zoPXfG=Q-z|@8|iR=Nw)-Q9Ey)+PQuT3xK5Ll;+Bv6^`EJW~`m$I$D&Si8%%W3Q9_8 z-pp(Y7J{3xcGnnE04#tP6AT15W9^DZTvz}k#>Y}s&558~zyO?#^#lM}02TxQXm(s6 zXCDA~yq&SZh!3d)+BE>Zc+QIK0)Lr8(M03y%j4%wA5WEg_9@%C$|jNpSpi5-87IP6 zpcMpI9j&}#i%*ECBVGq!Cf=@aJrFYxsv#(MfF1zE2g-P$!iB7t@7jC47%Fr@NC2>P zRfyN_5E6v+QNxwh0i^)s?91ZskB_CFT93g%**5Fv@$3YZ+aM$Wuy;39Z1E8tEChYL z4547fMrFlNDF9?ozQo8Pst?uBvrj)66cnrRDo+BX0QC2F0AUe-UWuSHN2}@As+}}$ z>WiAw^_kwXdYRS_XwxEA(hma{&?A>N(emR1#pkqz`@CHPVHI=5)cvw$9r!Jm}MWU=FE4AP7vbJ?n+D++W}Bm zWZwY^q7MMXR+^kG`jC0FD<{9DE-{aa-@ogY*0um}=8NX$3ITcZivx7T7NHNao?_2PN)dI++3Ip&>*k7+dk;vYQnw)l*uq8Nr0K<&i{ zVSCQ1TpMHncm4@eoMkJZWre$Pm zrvk*Ic?y6ywvtntXBREg1aR^DrRp1DeX}M*uo90gb9drn8UR=yO-1%GkCGa|0H!Ty z0f3{80o)rOBc3fPEYujx&d;Z;DH#SP%h#3};t=$6%}I(IpRLX7SpZK=oJ7$NrTPFU z`k+7v&CkrF!ZmBOpY->6qbY9cX^g|Y;q`ew0P4QqOkb}maeV?PcK`#>Dm5R0QQc`< z$x<3KYZh%=vV_LGoK1AO(FmYx6m9#s^m^RP9HPbsadCnJxV0GoSZHJYNh->Ff&M-7 z8{N?N4x(!2`vw=649lLT6|v7XB5>ZMmP%%bE0|90bB>*0yHdG1MpU^5EW27 zb7_Tu_`HS18UWSem2Lq&06E9P1+9Mv_{qJY3)V;W^-Wdwl>)#qI3;I}_)&q>K{dS-Yc0DarqwujB8zQ zq@s^nE>1lX9?-;NEDPsBo(G@@QM323kKp%TonQd)=Hd-L&*FyKXD&0@x6&9K}yDqNuCCTIn~N<1s-d3$#u9uUs| z-e4*epsXNx0)Ux#2p>8mfn)&Nx9+CVV@Dc90)m-%jt79~q)}oV=F~U05L`RJZuXr5 zfMABeP-PJRD}baC_cae2Kf@<8$T~N9?^^+|+Te1$KNsMA`!{~-_(*i@02Xg0KwtRW z0FYf^^**N%90R~Y7y@1nC&(=v0QkL5#bdp$05Al6H4PXH;E%r=#Wz0b&*W%FTUzQw z>eaKi<&mcEICuUmZQA^$c#JJj{>4(lmnOH}9HoWwd)<6B?izrZqWHMD=Jmz%#nl%O z&>$%K&fXLm8A(k|O#y$_oj$7pgLqtxC*{tin%Y{WYgRfL!(ae>-OYM$H4TXCZ%eog z=xFV6TK?`-F)gmiZ3X}q38O1wg~ z^?BVP*#defBNHFj3Z(5S*c!OIYDY-d7}Ck*nqc*R0Avp00cwJX{=d> zuhyTUp{bL^-bVj{&FiUipME~Cz_}l)y&u*Z5Xjh1d@;iHSpG7UFE{d~DU`Q9vqXjs07K9(f{UQpbGOd3 zGd`>U>?|nUF&zNHP26km>u`YAG7|3fbT}Z~#J%>ucJF}y0N~HHeIX<)ssI2007*qo IM6N<$f;$#9e*gdg diff --git a/Client/Assets/Resources/Character/Test/Body/Body_Down_0.png.meta b/Client/Assets/Resources/Character/Test/Body/Body_Down_0.png.meta deleted file mode 100644 index 78ce33e..0000000 --- a/Client/Assets/Resources/Character/Test/Body/Body_Down_0.png.meta +++ /dev/null @@ -1,117 +0,0 @@ -fileFormatVersion: 2 -guid: 4c104c5bdad21f64280d4ff6f61729a8 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - 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: 0 - wrapV: 0 - wrapW: 0 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - 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: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spriteCustomMetadata: - entries: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Client/Assets/Resources/Character/Test/Body/Body_Down_1.png b/Client/Assets/Resources/Character/Test/Body/Body_Down_1.png deleted file mode 100644 index 862aef064d0854620a497608db2d27a462dddb5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1744 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 VK7E`+=W_r6002ovPDHLkV1gnQKmh;% diff --git a/Client/Assets/Resources/Character/Test/Body/Body_Down_3.png.meta b/Client/Assets/Resources/Character/Test/Body/Body_Down_3.png.meta deleted file mode 100644 index fe35aa4..0000000 --- a/Client/Assets/Resources/Character/Test/Body/Body_Down_3.png.meta +++ /dev/null @@ -1,117 +0,0 @@ -fileFormatVersion: 2 -guid: 0a4e42651d5472f429a1a7616d901b54 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - 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: 0 - wrapV: 0 - wrapW: 0 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - 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: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spriteCustomMetadata: - entries: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Client/Assets/Resources/Character/Test/Body/Body_Down_4.png b/Client/Assets/Resources/Character/Test/Body/Body_Down_4.png deleted file mode 100644 index acfe4a797b6bcdc126bf74b8ea9ced2f9fe4ea2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1766 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 + + // 遍历 XML 元素中的子元素 foreach (var liElement in element.Elements()) { if (elementType.IsSubclassOf(typeof(Define))) { + // 如果是 Define 类型或其子类 var nestedDefine = (Define)Activator.CreateInstance(elementType); DefaultInitDefine(nestedDefine, liElement, elementType); arrayElements.Add(nestedDefine); } - else if (elementType.IsArray) // 嵌套数组处理 + else if (elementType.IsArray || typeof(IList).IsAssignableFrom(elementType)) { - // 递归处理嵌套数组 + // 嵌套数组处理(递归调用) + var pseudoField = new { FieldType = elementType }; var nestedArray = ProcessArrayField( - new { FieldType = elementType }.GetType().GetField("FieldType"), + pseudoField.GetType().GetField("FieldType"), liElement ); arrayElements.Add(nestedArray); } + else if (elementType.IsEnum) + { + // 枚举类型处理 + arrayElements.Add(Enum.Parse(elementType, liElement.Value)); + } else { // 基本类型处理 @@ -331,14 +344,35 @@ namespace Data } } - // 构建结果数组 - var resultArray = Array.CreateInstance(elementType, arrayElements.Count); - for (var i = 0; i < arrayElements.Count; i++) + // 根据目标字段的类型构建结果 + if (field.FieldType.IsArray) { - resultArray.SetValue(arrayElements[i], i); + // 如果目标字段是数组类型 + var resultArray = Array.CreateInstance(elementType, arrayElements.Count); + for (var i = 0; i < arrayElements.Count; i++) + { + resultArray.SetValue(arrayElements[i], i); + } + + return resultArray; } - return resultArray; + else if (typeof(IList).IsAssignableFrom(field.FieldType)) + { + // 如果目标字段是泛型集合类型(如 List) + var listType = typeof(List<>).MakeGenericType(elementType); + var resultList = (IList)Activator.CreateInstance(listType); + foreach (var item in arrayElements) + { + resultList.Add(item); + } + + return resultList; + } + + return null; } + + /// /// 从 ListXDocument 中查找指定根元素名称的文档。 /// diff --git a/Client/Assets/Scripts/Data/DrawingOrderDef.cs b/Client/Assets/Scripts/Data/DrawingOrderDef.cs index 1ccea9b..daafb2f 100644 --- a/Client/Assets/Scripts/Data/DrawingOrderDef.cs +++ b/Client/Assets/Scripts/Data/DrawingOrderDef.cs @@ -14,84 +14,221 @@ namespace Data Up } - public enum DrawNodeType + public enum EntityState { - Image, - Animation + Idle, + Walking, + MeleeAttack, + RangedAttack, } + public class DrawingOrderDef : Define { - public DrawNodeDef drawingOrder_down; - public DrawNodeDef drawingOrder_up; - public DrawNodeDef drawingOrder_left; - public DrawNodeDef drawingOrder_right; - public string texturePath; - public float pixelsPerUnit = 16; - - public DrawNodeDef GetDrawingOrder(Orientation orientation, out Orientation sourceOrientation) + public DrawNodeDef idle_down; + public DrawNodeDef idle_up; + public DrawNodeDef idle_left; + public DrawNodeDef idle_right; + + public DrawNodeDef walk_down; + public DrawNodeDef walk_up; + public DrawNodeDef walk_left; + public DrawNodeDef walk_right; + + public DrawNodeDef meleeAttack_down; + public DrawNodeDef meleeAttack_up; + public DrawNodeDef meleeAttack_left; + public DrawNodeDef meleeAttack_right; + + public DrawNodeDef rangedAttack_down; + public DrawNodeDef rangedAttack_up; + public DrawNodeDef rangedAttack_left; + public DrawNodeDef rangedAttack_right; + + public DrawNodeDef GetDrawNodeDef(EntityState state, Orientation orientation, + out Orientation? fallbackOrientation) { - // 定义一个临时变量用于存储结果 - DrawNodeDef result = null; + fallbackOrientation = null; - // 初始化 sourceOrientation 为默认值 - sourceOrientation = Orientation.Down; + // 根据状态和方向获取对应的DrawNodeDef + var result = GetDrawNodeDefInternal(state, orientation); - // 根据传入的 Orientation 获取对应的 DrawingOrderDef + if (result != null) + { + return result; + } + + // 如果找不到,按照规则查找替补 switch (orientation) { - case Orientation.Down: - result = drawingOrder_down; - sourceOrientation = Orientation.Down; - break; case Orientation.Up: - result = drawingOrder_up; - sourceOrientation = Orientation.Up; + // 上方向优先找下方向 + result = GetDrawNodeDefInternal(state, Orientation.Down); + if (result != null) + { + fallbackOrientation = Orientation.Down; + return result; + } + + // 其次找左右方向 + result = GetDrawNodeDefInternal(state, Orientation.Left); + if (result != null) + { + fallbackOrientation = Orientation.Left; + return result; + } + + result = GetDrawNodeDefInternal(state, Orientation.Right); + if (result != null) + { + fallbackOrientation = Orientation.Right; + return result; + } + break; + + case Orientation.Down: + // 下方向优先找上方向 + result = GetDrawNodeDefInternal(state, Orientation.Up); + if (result != null) + { + fallbackOrientation = Orientation.Up; + return result; + } + + // 其次找左右方向 + result = GetDrawNodeDefInternal(state, Orientation.Left); + if (result != null) + { + fallbackOrientation = Orientation.Left; + return result; + } + + result = GetDrawNodeDefInternal(state, Orientation.Right); + if (result != null) + { + fallbackOrientation = Orientation.Right; + return result; + } + + break; + case Orientation.Left: - result = drawingOrder_left; - sourceOrientation = Orientation.Left; + // 左方向优先找右方向 + result = GetDrawNodeDefInternal(state, Orientation.Right); + if (result != null) + { + fallbackOrientation = Orientation.Right; + return result; + } + + // 其次找上下方向 + result = GetDrawNodeDefInternal(state, Orientation.Up); + if (result != null) + { + fallbackOrientation = Orientation.Up; + return result; + } + + result = GetDrawNodeDefInternal(state, Orientation.Down); + if (result != null) + { + fallbackOrientation = Orientation.Down; + return result; + } + break; + case Orientation.Right: - result = drawingOrder_right; - sourceOrientation = Orientation.Right; + // 右方向优先找左方向 + result = GetDrawNodeDefInternal(state, Orientation.Left); + if (result != null) + { + fallbackOrientation = Orientation.Left; + return result; + } + + // 其次找上下方向 + result = GetDrawNodeDefInternal(state, Orientation.Up); + if (result != null) + { + fallbackOrientation = Orientation.Up; + return result; + } + + result = GetDrawNodeDefInternal(state, Orientation.Down); + if (result != null) + { + fallbackOrientation = Orientation.Down; + return result; + } + break; default: - throw new ArgumentException("Invalid orientation value."); + throw new ArgumentOutOfRangeException(nameof(orientation), orientation, null); } - // 如果当前方向的结果为空,则尝试用 drawingOrder_down 填充 - if (result == null) + // 如果所有替补都找不到,返回null + return null; + } + + private DrawNodeDef GetDrawNodeDefInternal(EntityState state, Orientation orientation) + { + // 根据状态和方向获取对应的DrawNodeDef + switch (state) { - result = drawingOrder_down; - sourceOrientation = Orientation.Down; // 更新 sourceOrientation + case EntityState.Idle: + switch (orientation) + { + case Orientation.Down: return idle_down; + case Orientation.Up: return idle_up; + case Orientation.Left: return idle_left; + case Orientation.Right: return idle_right; + } + + break; + + case EntityState.Walking: + switch (orientation) + { + case Orientation.Down: return walk_down; + case Orientation.Up: return walk_up; + case Orientation.Left: return walk_left; + case Orientation.Right: return walk_right; + } + + break; + + case EntityState.MeleeAttack: + switch (orientation) + { + case Orientation.Down: return meleeAttack_down; + case Orientation.Up: return meleeAttack_up; + case Orientation.Left: return meleeAttack_left; + case Orientation.Right: return meleeAttack_right; + } + + break; + + case EntityState.RangedAttack: + switch (orientation) + { + case Orientation.Down: return rangedAttack_down; + case Orientation.Up: return rangedAttack_up; + case Orientation.Left: return rangedAttack_left; + case Orientation.Right: return rangedAttack_right; + } + + break; } - // 如果 drawingOrder_down 仍然为空,则尝试用其他非空方向填充 - if (result != null) return result; - if (drawingOrder_up != null) - { - result = drawingOrder_up; - sourceOrientation = Orientation.Up; // 更新 sourceOrientation - } - else if (drawingOrder_left != null) - { - result = drawingOrder_left; - sourceOrientation = Orientation.Left; // 更新 sourceOrientation - } - else if (drawingOrder_right != null) - { - result = drawingOrder_right; - sourceOrientation = Orientation.Right; // 更新 sourceOrientation - } - - return result; + return null; } } public class DrawNodeDef : Define { - public List children = new(); - public DrawNodeType drawNodeType = DrawNodeType.Image; + public List animationTextures = new(); + public List nodes = new(); public string nodeName; public Vector2 position = new(0, 0); public float FPS = 0.5f; @@ -101,19 +238,9 @@ namespace Data base.Init(xmlDef); nodeName = xmlDef.Attribute("name")?.Value??"noName"; - drawNodeType = Enum.TryParse(xmlDef.Attribute("type")?.Value, true, out DrawNodeType typeResult) - ? typeResult - : DrawNodeType.Image; - position = StringToVector(xmlDef.Attribute("position")?.Value ?? "(0 0)"); - FPS = float.TryParse(xmlDef.Attribute("FPS")?.Value, out float result) ? result : 1.0f; - foreach (var childNode in xmlDef.Elements()) - { - var child = new DrawNodeDef(); - child.Init(childNode); - children.Add(child); - } - return true; + FPS = float.TryParse(xmlDef.Attribute("FPS")?.Value, out var result) ? result : 1.0f; + return false; } public Vector2 StringToVector(string vectorDef) { @@ -132,35 +259,10 @@ namespace Data // 返回 Vector2 对象 return new Vector2(x, y); } - else - { - return Vector2.zero; - } + + return Vector2.zero; } - // 判断两个 DrawNodeDef 是否相等 - public static bool AreEqual(DrawNodeDef a, DrawNodeDef b) - { - if (ReferenceEquals(a, b)) return true; // 如果是同一个对象,直接返回 true - if (ReferenceEquals(a, null) || ReferenceEquals(b, null)) return false; // 如果其中一个为 null,返回 false - // 比较基本属性 - if (a.drawNodeType != b.drawNodeType || - a.nodeName != b.nodeName || - a.position != b.position || - Math.Abs(a.FPS - b.FPS) > 0.001f) // 浮点数比较需要考虑精度 - return false; - // 比较 children 的数量 - if (a.children.Count != b.children.Count) - return false; - // 递归比较每个子节点 - for (var i = 0; i < a.children.Count; i++) - { - if (!AreEqual(a.children[i], b.children[i])) - return false; - } - - return true; - } } } \ No newline at end of file diff --git a/Client/Assets/Scripts/Data/ResourcesDef.cs b/Client/Assets/Scripts/Data/ImageDef.cs similarity index 100% rename from Client/Assets/Scripts/Data/ResourcesDef.cs rename to Client/Assets/Scripts/Data/ImageDef.cs diff --git a/Client/Assets/Scripts/Data/ResourcesDef.cs.meta b/Client/Assets/Scripts/Data/ImageDef.cs.meta similarity index 100% rename from Client/Assets/Scripts/Data/ResourcesDef.cs.meta rename to Client/Assets/Scripts/Data/ImageDef.cs.meta diff --git a/Client/Assets/Scripts/Entity/Entity.cs b/Client/Assets/Scripts/Entity/Entity.cs index 8af119b..8efa864 100644 --- a/Client/Assets/Scripts/Entity/Entity.cs +++ b/Client/Assets/Scripts/Entity/Entity.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using AI; using Base; using Data; @@ -98,7 +99,7 @@ namespace Entity /// 表示实体是否已经死亡(生命值小于等于零)。 /// public bool IsDead => attributes.health <= 0; - public bool IsShowingOfHitBarUI=>hitBarUIShowTimer > 0; + public bool IsShowingHealthBarUI=>hitBarUIShowTimer > 0; public bool IsAttacking => attackCoroutine != null; @@ -108,18 +109,21 @@ namespace Entity /// /// 存储不同朝向下的动画节点集合。 /// - public Dictionary> bodyAnimationNode = new(); - + public Dictionary>> bodyAnimationNode = new(); + private List currentAnimatorCache=new (); /// /// 存储不同朝向下的身体节点对象。 /// - private Dictionary bodyNodes = new(); + private Dictionary> bodyNodes = new(); /// /// 当前实体的朝向。 /// private Orientation currentOrientation = Orientation.Down; - + /// + /// 当前实体的状态 + /// + private EntityState currentState = EntityState.Idle; /// @@ -162,83 +166,218 @@ namespace Entity /// 绘制顺序定义。 public virtual void InitBody(DrawingOrderDef drawingOrder) { - // 定义方向枚举和对应的 GetDrawingOrder 调用 - Orientation[] orientations = { Orientation.Down, Orientation.Up, Orientation.Left, Orientation.Right }; + // 预缓存枚举值(避免每次循环重复调用 Enum.GetValues) + var states = Enum.GetValues(typeof(EntityState)).Cast().ToArray(); + var orientations = Enum.GetValues(typeof(Orientation)).Cast().ToArray(); - foreach (var orientation in orientations) + // 预初始化字典结构(减少内层循环的字典检查) + foreach (var state in states) { - currentOrientation = orientation; - bodyAnimationNode[orientation] = new(); - // 获取当前方向的绘图节点 - var drawNode = drawingOrder.GetDrawingOrder(orientation, out var realOrientation); - - if (drawNode == null) continue; - var directionRoot = new GameObject(orientation.ToString()); - directionRoot.transform.SetParent(body.transform, false); - InitBodyPart(drawNode, directionRoot, drawingOrder.texturePath,realOrientation); - bodyNodes[orientation] = directionRoot; + bodyNodes.TryAdd(state, new Dictionary()); + bodyAnimationNode.TryAdd(state, new Dictionary>()); } - currentOrientation = Orientation.Down; - foreach (var bodyNode in bodyNodes) + // 主初始化逻辑 + foreach (var state in states) { - bodyNode.Value.SetActive(false); + var stateBodyNodes = bodyNodes[state]; + var stateAnimNodes = bodyAnimationNode[state]; + + foreach (var orientation in orientations) + { + // 获取节点定义(避免重复调用) + var nodeDef = drawingOrder.GetDrawNodeDef(state, orientation, out var original); + + // 处理空节点定义(直接创建空对象) + if (nodeDef == null) + { + var obj = new GameObject { name = $"{state}_Empty" }; + obj.transform.SetParent(body.transform, false); + stateBodyNodes[orientation] = obj; + continue; // 跳过后续动画处理 + } + + // 处理有效节点定义 + GameObject targetObj; + if (original.HasValue && stateBodyNodes.TryGetValue(original.Value, out var reusedObj)) + { + targetObj = reusedObj; // 复用已有对象 + } + else + { + targetObj = InitBodyPart(nodeDef, body); // 创建新对象 + } + + stateBodyNodes[orientation] = targetObj; + + // 提取动画组件(安全处理空组件情况) + var animators = targetObj.GetComponentsInChildren(); + if (animators.Length > 0) + { + stateAnimNodes[orientation] = animators.Cast().ToList(); + } + // 无动画组件时保持 stateAnimNodes[orientation] 为 null(符合原始逻辑) + } } - SetOrientation(Orientation.Down); + + // 批量隐藏所有节点(使用字典值集合直接操作) + foreach (var nodeDict in bodyNodes.Values) + { + foreach (var obj in nodeDict.Values) + { + obj.SetActive(false); + } + } + + SetBodyTexture(EntityState.Idle,Orientation.Down); // 激活默认朝向 } + /// - /// 递归初始化单个绘图节点及其子节点。 + /// 递归初始化单个绘图节点及其子节点,具有更强的健壮性和错误处理。 /// /// 绘图节点定义。 /// 父节点对象。 - /// 纹理资源路径。 - public virtual void InitBodyPart(DrawNodeDef drawNode, GameObject parent, string folderPath,Orientation realOrientation) + /// 创建的GameObject,如果失败则返回null + public virtual GameObject InitBodyPart(DrawNodeDef drawNode, GameObject parent) { - if (drawNode == null) return; - - GameObject nodeObject; - if (drawNode.nodeName == "noName") + try { - nodeObject = new(); - nodeObject.transform.SetParent(parent.transform); - } - else - { - switch (drawNode.drawNodeType) + // 参数验证 + if (drawNode == null) { - case DrawNodeType.Image: + Debug.LogWarning("InitBodyPart: drawNode参数为null"); + return null; + } + + if (parent == null) + { + Debug.LogWarning($"InitBodyPart: 父节点为null (节点名: {drawNode.nodeName})"); + return null; + } + + GameObject nodeObject = null; + // 根据纹理数量创建不同类型的节点 + switch (drawNode.animationTextures?.Count ?? 0) + { + case 0: + // 无纹理节点 + nodeObject = new GameObject(drawNode.nodeName); + nodeObject.transform.SetParent(parent.transform, false); + break; + + case 1: + // 单纹理节点 + if (imagePrefab == null) + { + Debug.LogError($"InitBodyPart: imagePrefab未设置 (节点名: {drawNode.nodeName})"); + return null; + } + nodeObject = Instantiate(imagePrefab.gameObject, parent.transform); var texture = - Managers.PackagesImageManager.Instance.FindBodyTextures(drawNode.packID, folderPath, - $"{drawNode.nodeName}_{realOrientation}"); - var image = nodeObject.GetComponent(); - image.SetSprite(texture.Length > 0 - ? texture[0] - : Managers.PackagesImageManager.Instance.defaultSprite); + Managers.PackagesImageManager.Instance?.GetSprite(drawNode.packID, + drawNode.animationTextures[0]); + + if (!texture) + { + Debug.LogWarning( + $"InitBodyPart: 无法获取纹理 (节点名: {drawNode.nodeName}, 纹理ID: {drawNode.animationTextures[0]})"); + } + + var imagePrefabCom = nodeObject.GetComponent(); + if (imagePrefabCom != null) + { + imagePrefabCom.SetSprite(texture); + } + else + { + Debug.LogWarning($"InitBodyPart: 无法获取ImagePrefab组件 (节点名: {drawNode.nodeName})"); + } + break; - case DrawNodeType.Animation: - nodeObject = Instantiate(animatorPrefab.gameObject, parent.transform); - ITick tick = nodeObject.GetComponent(); - if (tick != null) - bodyAnimationNode[currentOrientation].Add(tick); - var textures = Managers.PackagesImageManager.Instance.FindBodyTextures(drawNode.packID, - folderPath, - $"{drawNode.nodeName}_{realOrientation}"); - var animator = nodeObject.GetComponent(); - animator.SetSprites(textures); - break; default: - throw new ArgumentOutOfRangeException(); + // 多纹理动画节点 + if (!animatorPrefab) + { + Debug.LogError($"InitBodyPart: animatorPrefab未设置 (节点名: {drawNode.nodeName})"); + return null; + } + + nodeObject = Instantiate(animatorPrefab.gameObject, parent.transform); + var animator = nodeObject.GetComponent(); + + if (animator == null) + { + Debug.LogWarning($"InitBodyPart: 无法获取SpriteAnimator组件 (节点名: {drawNode.nodeName})"); + break; + } + + animator.SetFPS(drawNode.FPS); + var animatedSprites = new List(); + foreach (var textureId in drawNode.animationTextures) + { + try + { + var sprite = + Managers.PackagesImageManager.Instance?.GetSprite(drawNode.packID, textureId); + if (sprite != null) + { + animatedSprites.Add(sprite); + } + else + { + Debug.LogWarning( + $"InitBodyPart: 无法获取动画纹理 (节点名: {drawNode.nodeName}, 纹理ID: {textureId})"); + } + } + catch (Exception ex) + { + Debug.LogError( + $"InitBodyPart: 加载动画纹理时出错 (节点名: {drawNode.nodeName}, 纹理ID: {textureId}): {ex.Message}"); + } + } + + if (animatedSprites.Count > 0) + { + animator.SetSprites(animatedSprites.ToArray()); + } + else + { + Debug.LogWarning($"InitBodyPart: 没有有效的动画纹理 (节点名: {drawNode.nodeName})"); + } + + break; } + + // 设置节点属性 + if (!nodeObject) return nodeObject; + + nodeObject.transform.localPosition = drawNode.position; + nodeObject.name = drawNode.nodeName ?? "UnnamedNode"; + + // 递归初始化子节点 + if (drawNode.nodes == null) return nodeObject; + foreach (var child in drawNode.nodes) + { + try + { + InitBodyPart(child, nodeObject); + } + catch (Exception ex) + { + Debug.LogError($"InitBodyPart: 初始化子节点失败 (父节点: {drawNode.nodeName}): {ex.Message}"); + } + } + + + return nodeObject; } - nodeObject.transform.localPosition = drawNode.position; - nodeObject.name = drawNode.nodeName; - // 递归初始化子节点 - foreach (var child in drawNode.children) + catch (Exception ex) { - InitBodyPart(child, nodeObject, folderPath,realOrientation); + Debug.LogError($"InitBodyPart: 初始化节点时发生未处理的异常 (节点名: {drawNode?.nodeName}): {ex}"); + return null; } } @@ -255,15 +394,17 @@ namespace Entity { AutoBehave(); } - if (bodyAnimationNode.TryGetValue(currentOrientation, out var ticks)) + + if (currentAnimatorCache!=null) { - foreach (var tick in ticks) + foreach (var animator in currentAnimatorCache) { - tick.Tick(); + animator.Tick(); } } - if (IsShowingOfHitBarUI) + + if (IsShowingHealthBarUI) { hitBarUIShowTimer -= Time.deltaTime; if (hitBarUIShowTimer <= 0) @@ -281,24 +422,34 @@ namespace Entity if(!IsAttacking) attackCoroutine = StartCoroutine(AttackFlow()); } - - /// - /// 设置实体的朝向。 - /// - /// 新的朝向。 - public virtual void SetOrientation(Orientation orientation) + + public virtual void SetBodyTexture(EntityState state, Orientation orientation) { - // 禁用当前朝向的节点 - if (bodyNodes.TryGetValue(currentOrientation, out var currentNode)) + if (bodyNodes.TryGetValue(currentState, out var stateNode)) { - currentNode.SetActive(false); + if (stateNode.TryGetValue(currentOrientation, out var node)) + { + node.SetActive(false); + } } - // 设置新的朝向 - currentOrientation = orientation; - // 激活新朝向的节点 - if (bodyNodes.TryGetValue(orientation, out var newNode)) + + if (bodyNodes.TryGetValue(state, out var showStateNode)) { - newNode.SetActive(true); + if (showStateNode.TryGetValue(orientation, out var showNode)) + { + showNode.SetActive(true); + } + } + + currentState = state; + currentOrientation = orientation; + + if (bodyAnimationNode.TryGetValue(currentState, out var animationNode)) + { + if (animationNode.TryGetValue(currentOrientation, out var value)) + { + currentAnimatorCache=value; + } } } @@ -369,7 +520,8 @@ namespace Entity // 水平方向优先 ori = direction.x > 0 ? Orientation.Right : Orientation.Left; } - SetOrientation(ori); + + SetBodyTexture(currentState, ori); } /// diff --git a/Client/Assets/Scripts/Managers/AffiliationManager.cs b/Client/Assets/Scripts/Managers/AffiliationManager.cs index 3b7d108..4a34801 100644 --- a/Client/Assets/Scripts/Managers/AffiliationManager.cs +++ b/Client/Assets/Scripts/Managers/AffiliationManager.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using Data; +using UnityEngine; namespace Managers { diff --git a/Client/Assets/Scripts/Managers/EntityManage.cs b/Client/Assets/Scripts/Managers/EntityManage.cs index cec1588..9b6e6a0 100644 --- a/Client/Assets/Scripts/Managers/EntityManage.cs +++ b/Client/Assets/Scripts/Managers/EntityManage.cs @@ -5,6 +5,7 @@ using Base; using Entity; using Prefab; using UnityEngine; +using UnityEngine.SceneManagement; using UnityEngine.Serialization; namespace Managers @@ -145,7 +146,6 @@ namespace Managers // 如果层不存在,动态创建 var layerObject = new GameObject(layerName); layerTransform = layerObject.transform; - layerTransform.SetParent(transform, false); // 将层附加到当前管理器下 } // 将新创建的层加入缓存 @@ -280,11 +280,23 @@ namespace Managers entityComponent.DefaultInit(); } + + private void OnDestroy() + { + SceneManager.sceneLoaded -= OnSceneLoaded; + } protected override void OnStart() { - factionEntities.Clear(); + SceneManager.sceneLoaded += OnSceneLoaded; + + } + private void OnSceneLoaded(Scene scene, LoadSceneMode mode) + { + factionEntities.Clear(); + layerCache.Clear(); + pendingAdditions.Clear(); } private void Start() diff --git a/Client/Assets/Scripts/Managers/PackagesImageManager.cs b/Client/Assets/Scripts/Managers/PackagesImageManager.cs index 2c234cc..4496a47 100644 --- a/Client/Assets/Scripts/Managers/PackagesImageManager.cs +++ b/Client/Assets/Scripts/Managers/PackagesImageManager.cs @@ -15,192 +15,265 @@ namespace Managers 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"); InitImageDef(); - InitDrawOrder(); } + public void InitImageDef() { + var textureCache = new Dictionary(); var imageDef = Managers.DefineManager.Instance.QueryDefinesByType(); foreach (var ima in imageDef) { - if (ima.path == null || ima.packID == null) - continue; - var pack = Managers.DefineManager.Instance.GetDefinePackage(ima); - var path = Path.Combine(pack.packRootPath, ima.path); - var texture = Configs.ConfigProcessor.LoadTextureByIO(path); - if (!texture) + if (string.IsNullOrEmpty(ima.path) || string.IsNullOrEmpty(ima.packID)) continue; - var packId = ima.packID; + // 解析路径前缀 - if (!packagesImages.ContainsKey(packId)) - packagesImages[packId] = new Dictionary(); - packagesImages[packId].Add(ima.name, texture); - - SplitTextureIntoSprites(packId, ima.name, texture, ima.hCount, ima.wCount, ima.pixelsPerUnit); - } - - } - - public void InitDrawOrder() - { - try - { - // 查询绘制顺序定义 - var drawOrderDef = Managers.DefineManager.Instance.QueryDefinesByType(); - if (drawOrderDef == null || drawOrderDef.Length == 0) + try { - Debug.LogWarning("No DrawingOrderDef found."); - return; - } - - // 初始化包路径字典 - Dictionary packRootSite = new(); - - foreach (var drawOrder in drawOrderDef) - { - // 检查必要字段是否为空 - if (string.IsNullOrEmpty(drawOrder.texturePath) || string.IsNullOrEmpty(drawOrder.packID)) + string cacheKey; + Texture2D texture; + if (ima.path.StartsWith("res:")) { - Debug.LogWarning( - $"Skipping invalid drawOrder: texturePath or packID is null or empty. PackID: {drawOrder.packID}"); - continue; - } + // 处理Resources路径 + var resPath = ima.path.Substring(4).Replace('\\', '/').TrimStart('/'); + + cacheKey = "res://" + resPath.ToLower(); - // 获取包路径 - if (!packRootSite.ContainsKey(drawOrder.packID)) - { - var packagePath = Managers.DefineManager.Instance.GetPackagePath(drawOrder.packID); - if (string.IsNullOrEmpty(packagePath)) + // 检查缓存 + if (!textureCache.TryGetValue(cacheKey, out texture)) { - Debug.LogError($"Package path not found for packID: {drawOrder.packID}"); - continue; + // 去掉扩展名 + var cleanPath = Path.ChangeExtension(resPath, null); + texture = Resources.Load(cleanPath); + if (texture) + textureCache[cacheKey] = texture; } - - packRootSite[drawOrder.packID] = packagePath; } - - // 判断是否为 Unity 资源路径 - var isUnityResource = drawOrder.texturePath.StartsWith("res:", StringComparison.OrdinalIgnoreCase); - var rootPath = packRootSite[drawOrder.packID]; - - if (isUnityResource) + else if (ima.path.Contains(':')) { - // 移除 "res:" 前缀并适配 Unity 资源路径规则 - var resourceFolder = drawOrder.texturePath.Substring(4).TrimStart('/').Replace('\\', '/'); + // 处理其他包ID前缀(如 "PackageID:Path") + var splitIndex = ima.path.IndexOf(':'); + var packageID = ima.path.Substring(0, splitIndex); + var relativePath = ima.path.Substring(splitIndex + 1); - // 加载文件夹下的所有纹理资源 - var textures = Resources.LoadAll(resourceFolder); - if (textures == null || textures.Length == 0) - { - Debug.LogWarning($"No textures found in Unity resource folder: {resourceFolder}"); + // 获取包根路径 + var packageRoot = Managers.DefineManager.Instance.GetPackagePath(packageID); + if (string.IsNullOrEmpty(packageRoot)) continue; - } - foreach (var image in textures) + var fullPath = Path.Combine(packageRoot, relativePath).Replace('\\', '/'); + cacheKey = "file://" + fullPath.ToLower(); + + // 检查缓存 + if (!textureCache.TryGetValue(cacheKey, out texture)) { - if (image == null) - { - Debug.LogWarning( - $"Texture loaded from Unity resource folder: {resourceFolder} is null."); - continue; - } - - // 创建精灵 - try - { - var spr = Sprite.Create( - image, - new Rect(0, 0, image.width, image.height), - new Vector2(0.5f, 0.5f), // 中心点 - drawOrder.pixelsPerUnit - ); - var name = image.name; - - // 插入纹理 - InsertBodyTexture(drawOrder.packID, drawOrder.texturePath, name, spr); - } - catch (Exception ex) - { - Debug.LogError( - $"Failed to create sprite from Unity resource: {image.name}. Error: {ex.Message}"); - } + texture = Configs.ConfigProcessor.LoadTextureByIO(fullPath); + if (texture) + textureCache[cacheKey] = texture; } } else { - // 文件系统路径处理 - var folderPath = Path.Combine(rootPath, drawOrder.texturePath); + // 无前缀:使用当前定义所在包的路径 + var pack = Managers.DefineManager.Instance.GetDefinePackage(ima); + var fullPath = Path.Combine(pack.packRootPath, ima.path).Replace('\\', '/'); + cacheKey = "file://" + fullPath.ToLower(); - // 获取图像文件列表 - try + // 检查缓存 + if (!textureCache.TryGetValue(cacheKey, out texture)) { - var imagePath = Configs.ConfigProcessor.GetFilesByExtensions(folderPath, - new[] { "jpg", "jpeg", "png", "tga", "tif", "tiff", "psd", "bmp" }); - - foreach (var path in imagePath) - { - // 加载纹理 - Texture2D image = null; - try - { - image = Configs.ConfigProcessor.LoadTextureByIO(path); - } - catch (Exception ex) - { - Debug.LogError($"Failed to load texture from path: {path}. Error: {ex.Message}"); - continue; - } - - if (image == null) - { - Debug.LogWarning($"Texture loaded from path: {path} is null."); - continue; - } - - // 创建精灵 - try - { - var spr = Sprite.Create( - image, - new Rect(0, 0, image.width, image.height), - new Vector2(0.5f, 0.5f), // 中心点 - drawOrder.pixelsPerUnit - ); - - var name = Path.GetFileNameWithoutExtension(path); - - // 插入纹理 - InsertBodyTexture(drawOrder.packID, drawOrder.texturePath, name, spr); - } - catch (Exception ex) - { - Debug.LogError( - $"Failed to create sprite from texture: {path}. Error: {ex.Message}"); - } - } - } - catch (Exception ex) - { - Debug.LogError($"Failed to retrieve files from folder: {folderPath}. Error: {ex.Message}"); + texture = Configs.ConfigProcessor.LoadTextureByIO(fullPath); + if (texture) + textureCache[cacheKey] = texture; } } + + // 资源加载失败 + if (!texture) + { + Debug.LogError($"Failed to load texture: {ima.path} (PackID: {ima.packID}, Name: {ima.name})"); + continue; + } + + // 存储到包资源字典(使用原始packID,非路径中的包ID) + var packId = ima.packID; + if (!packagesImages.ContainsKey(packId)) + packagesImages[packId] = new Dictionary(); + + // 避免同一包内重复添加(查重) + if (!packagesImages[packId].ContainsKey(ima.name)) + packagesImages[packId].Add(ima.name, texture); + else + packagesImages[packId][ima.name] = texture; // 覆盖已存在的引用 + + // 切分精灵 + SplitTextureIntoSprites(packId, ima.name, texture, ima.hCount, ima.wCount, ima.pixelsPerUnit); + } + catch (Exception ex) + { + // 捕获异常并打印详细错误信息 + Debug.LogError( + $"Error processing image definition: {ima.name} (Path: {ima.path}, PackID: {ima.packID}). Exception: {ex.Message}"); } } - catch (Exception ex) - { - Debug.LogError($"An unexpected error occurred in InitDrawOrder: {ex.Message}"); - } } + // public void InitDrawOrder() + // { + // try + // { + // // 查询绘制顺序定义 + // var drawOrderDef = Managers.DefineManager.Instance.QueryDefinesByType(); + // if (drawOrderDef == null || drawOrderDef.Length == 0) + // { + // Debug.LogWarning("No DrawingOrderDef found."); + // return; + // } + // + // // 初始化包路径字典 + // Dictionary packRootSite = new(); + // + // foreach (var drawOrder in drawOrderDef) + // { + // // 检查必要字段是否为空 + // if (string.IsNullOrEmpty(drawOrder.texturePath) || string.IsNullOrEmpty(drawOrder.packID)) + // { + // Debug.LogWarning( + // $"Skipping invalid drawOrder: texturePath or packID is null or empty. PackID: {drawOrder.packID}"); + // continue; + // } + // + // // 获取包路径 + // if (!packRootSite.ContainsKey(drawOrder.packID)) + // { + // var packagePath = Managers.DefineManager.Instance.GetPackagePath(drawOrder.packID); + // if (string.IsNullOrEmpty(packagePath)) + // { + // Debug.LogError($"Package path not found for packID: {drawOrder.packID}"); + // continue; + // } + // + // packRootSite[drawOrder.packID] = packagePath; + // } + // + // // 判断是否为 Unity 资源路径 + // var isUnityResource = drawOrder.texturePath.StartsWith("res:", StringComparison.OrdinalIgnoreCase); + // var rootPath = packRootSite[drawOrder.packID]; + // + // if (isUnityResource) + // { + // // 移除 "res:" 前缀并适配 Unity 资源路径规则 + // var resourceFolder = drawOrder.texturePath.Substring(4).TrimStart('/').Replace('\\', '/'); + // + // // 加载文件夹下的所有纹理资源 + // var textures = Resources.LoadAll(resourceFolder); + // if (textures == null || textures.Length == 0) + // { + // Debug.LogWarning($"No textures found in Unity resource folder: {resourceFolder}"); + // continue; + // } + // + // foreach (var image in textures) + // { + // if (image == null) + // { + // Debug.LogWarning( + // $"Texture loaded from Unity resource folder: {resourceFolder} is null."); + // continue; + // } + // + // // 创建精灵 + // try + // { + // var spr = Sprite.Create( + // image, + // new Rect(0, 0, image.width, image.height), + // new Vector2(0.5f, 0.5f), // 中心点 + // drawOrder.pixelsPerUnit + // ); + // var name = image.name; + // + // // 插入纹理 + // InsertBodyTexture(drawOrder.packID, drawOrder.texturePath, name, spr); + // } + // catch (Exception ex) + // { + // Debug.LogError( + // $"Failed to create sprite from Unity resource: {image.name}. Error: {ex.Message}"); + // } + // } + // } + // else + // { + // // 文件系统路径处理 + // var folderPath = Path.Combine(rootPath, drawOrder.texturePath); + // + // // 获取图像文件列表 + // try + // { + // var imagePath = Configs.ConfigProcessor.GetFilesByExtensions(folderPath, + // new[] { "jpg", "jpeg", "png", "tga", "tif", "tiff", "psd", "bmp" }); + // + // foreach (var path in imagePath) + // { + // // 加载纹理 + // Texture2D image = null; + // try + // { + // image = Configs.ConfigProcessor.LoadTextureByIO(path); + // } + // catch (Exception ex) + // { + // Debug.LogError($"Failed to load texture from path: {path}. Error: {ex.Message}"); + // continue; + // } + // + // if (image == null) + // { + // Debug.LogWarning($"Texture loaded from path: {path} is null."); + // continue; + // } + // + // // 创建精灵 + // try + // { + // var spr = Sprite.Create( + // image, + // new Rect(0, 0, image.width, image.height), + // new Vector2(0.5f, 0.5f), // 中心点 + // drawOrder.pixelsPerUnit + // ); + // + // var name = Path.GetFileNameWithoutExtension(path); + // + // // 插入纹理 + // InsertBodyTexture(drawOrder.packID, drawOrder.texturePath, name, spr); + // } + // catch (Exception ex) + // { + // Debug.LogError( + // $"Failed to create sprite from texture: {path}. Error: {ex.Message}"); + // } + // } + // } + // catch (Exception ex) + // { + // Debug.LogError($"Failed to retrieve files from folder: {folderPath}. Error: {ex.Message}"); + // } + // } + // } + // } + // catch (Exception ex) + // { + // Debug.LogError($"An unexpected error occurred in InitDrawOrder: {ex.Message}"); + // } + // } private void SplitTextureIntoSprites( string packId, @@ -210,7 +283,7 @@ namespace Managers int cols, int pixelsPerUnit) { - if (texture == null) + if (!texture) { Debug.LogError("Texture is null."); return; @@ -256,7 +329,7 @@ namespace Managers var index = (rows - row - 1) * cols + col; var spriteName = $"{baseName}_{index}"; - + sprite.name = spriteName; sprites[packId][spriteName] = sprite; } } @@ -297,96 +370,96 @@ namespace Managers var fullName = $"{name}_{index}"; return GetSprite(packID, fullName); } - /// - /// 向 bodyTexture 插入一张 Sprite。 - /// 如果包名、路径或部件名原本不存在,会自动建立对应的 Dictionary。 - /// - /// 包名 - /// 文件路径 - /// 身体部件名 - /// 要插入的 Sprite - public void InsertBodyTexture(string packageName, - string filePath, - string bodyPartName, - Sprite sprite) - { - if (sprite == null) - { - Debug.LogWarning("InsertBodyTexture: sprite 为 null,已忽略。"); - return; - } - - // 1) 处理包名层级 - if (!bodyTexture.TryGetValue(packageName, out var pathDict)) - { - pathDict = new Dictionary>(); - bodyTexture[packageName] = pathDict; - } - - // 2) 处理文件路径层级 - if (!pathDict.TryGetValue(filePath, out var partDict)) - { - partDict = new Dictionary(); - pathDict[filePath] = partDict; - } - - // 3) 插入或覆盖部件名 - partDict[bodyPartName] = sprite; - } - /// - /// 查找身体部件的所有Sprite变体(支持带编号的图片) - /// - /// 包名 - /// 文件路径 - /// 身体部件名 - /// 按编号排序的Sprite数组,未找到时返回空数组 - public Sprite[] FindBodyTextures(string packageName, string filePath, string bodyPartName) - { - // 检查包名是否存在 - if (!bodyTexture.TryGetValue(packageName, out var packageDict)) - { - Debug.LogWarning($"Package '{packageName}' not found."); - return new[] { defaultSprite }; - } - - // 检查文件路径是否存在 - if (!packageDict.TryGetValue(filePath, out var pathDict)) - { - Debug.LogWarning($"File path '{filePath}' not found in package '{packageName}'."); - return new[] { defaultSprite }; - } - - // 收集所有匹配的Sprite - var sprites = new List<(int order, Sprite sprite)>(); - - // 查找完全匹配的项(无编号) - if (pathDict.TryGetValue(bodyPartName, out var baseSprite)) - { - sprites.Add((0, baseSprite)); - } - - // 查找带编号的变体 - var prefix = bodyPartName + "_"; - foreach (var (key, value) in pathDict) - { - // 检查是否以部件名+下划线开头 - if (key.StartsWith(prefix) && key.Length > prefix.Length) - { - var suffix = key.Substring(prefix.Length); - - // 尝试解析编号 - if (int.TryParse(suffix, out var number)) - { - sprites.Add((number, value)); - } - } - } - - // 按编号排序(无编号视为0) - return sprites - .OrderBy(x => x.order) - .Select(x => x.sprite) - .ToArray(); - } + // /// + // /// 向 bodyTexture 插入一张 Sprite。 + // /// 如果包名、路径或部件名原本不存在,会自动建立对应的 Dictionary。 + // /// + // /// 包名 + // /// 文件路径 + // /// 身体部件名 + // /// 要插入的 Sprite + // public void InsertBodyTexture(string packageName, + // string filePath, + // string bodyPartName, + // Sprite sprite) + // { + // if (sprite == null) + // { + // Debug.LogWarning("InsertBodyTexture: sprite 为 null,已忽略。"); + // return; + // } + // + // // 1) 处理包名层级 + // if (!bodyTexture.TryGetValue(packageName, out var pathDict)) + // { + // pathDict = new Dictionary>(); + // bodyTexture[packageName] = pathDict; + // } + // + // // 2) 处理文件路径层级 + // if (!pathDict.TryGetValue(filePath, out var partDict)) + // { + // partDict = new Dictionary(); + // pathDict[filePath] = partDict; + // } + // + // // 3) 插入或覆盖部件名 + // partDict[bodyPartName] = sprite; + // } + // /// + // /// 查找身体部件的所有Sprite变体(支持带编号的图片) + // /// + // /// 包名 + // /// 文件路径 + // /// 身体部件名 + // /// 按编号排序的Sprite数组,未找到时返回空数组 + // public Sprite[] FindBodyTextures(string packageName, string filePath, string bodyPartName) + // { + // // 检查包名是否存在 + // if (!bodyTexture.TryGetValue(packageName, out var packageDict)) + // { + // Debug.LogWarning($"Package '{packageName}' not found."); + // return new[] { defaultSprite }; + // } + // + // // 检查文件路径是否存在 + // if (!packageDict.TryGetValue(filePath, out var pathDict)) + // { + // Debug.LogWarning($"File path '{filePath}' not found in package '{packageName}'."); + // return new[] { defaultSprite }; + // } + // + // // 收集所有匹配的Sprite + // var sprites = new List<(int order, Sprite sprite)>(); + // + // // 查找完全匹配的项(无编号) + // if (pathDict.TryGetValue(bodyPartName, out var baseSprite)) + // { + // sprites.Add((0, baseSprite)); + // } + // + // // 查找带编号的变体 + // var prefix = bodyPartName + "_"; + // foreach (var (key, value) in pathDict) + // { + // // 检查是否以部件名+下划线开头 + // if (key.StartsWith(prefix) && key.Length > prefix.Length) + // { + // var suffix = key.Substring(prefix.Length); + // + // // 尝试解析编号 + // if (int.TryParse(suffix, out var number)) + // { + // sprites.Add((number, value)); + // } + // } + // } + // + // // 按编号排序(无编号视为0) + // return sprites + // .OrderBy(x => x.order) + // .Select(x => x.sprite) + // .ToArray(); + // } } } \ No newline at end of file diff --git a/Client/Assets/Scripts/Map/DoubleMap.cs b/Client/Assets/Scripts/Map/DoubleMap.cs index 763e3a3..466842e 100644 --- a/Client/Assets/Scripts/Map/DoubleMap.cs +++ b/Client/Assets/Scripts/Map/DoubleMap.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using Data; @@ -9,17 +10,37 @@ namespace Map { public class DoubleMap : MonoBehaviour { - public List> mapData = new List>(); + public List> mapData = new(); public Tilemap textureLevel; public Vector2Int dataOffset = Vector2Int.zero; // 数据起始点偏移变量 + + + private void Start() + { + var size = 100; + InitializeData(size, size); + for (var i = 0; i < size; i++) + { + for (var j = 0; j < size; j++) + { + var dx = i - size / 2; + var dy = j - size / 2; + mapData[i][j] = (int)(Math.Sqrt(dx * dx + dy * dy) / 5) & 1; + } + } + + RefreshAllTiles(); + CameraControl.CameraControl.Instance.SetPosition(new Vector3(size * 0.5f, size * 0.5f, -10)); + } + // 初始化地图数据大小 public void InitializeData(int width, int height, int defaultValue = 0) { mapData.Clear(); - for (int x = 0; x < width; x++) + for (var x = 0; x < width; x++) { - List column = new List(); - for (int y = 0; y < height; y++) + var column = new List(); + for (var y = 0; y < height; y++) { column.Add(defaultValue); } @@ -59,7 +80,7 @@ namespace Map public void RefreshTile(int dataX, int dataY) { // 计算该数据点影响的四个瓦片位置(该点作为四个角) - Vector2Int[] affectedTiles = new Vector2Int[] + var affectedTiles = new Vector2Int[] { new Vector2Int(dataX - 1, dataY - 1), // 作为右下角 new Vector2Int(dataX - 1, dataY), // 作为右上角 @@ -79,15 +100,15 @@ namespace Map if (mapData.Count == 0 || mapData[0].Count == 0) return; // 计算瓦片地图的有效范围(考虑偏移) - int startX = dataOffset.x; - int startY = dataOffset.y; - int endX = startX + mapData.Count - 1; - int endY = startY + mapData[0].Count - 1; + var startX = dataOffset.x; + var startY = dataOffset.y; + var endX = startX + mapData.Count - 1; + var endY = startY + mapData[0].Count - 1; // 遍历所有瓦片位置 - for (int x = startX; x <= endX; x++) + for (var x = startX; x <= endX; x++) { - for (int y = startY; y <= endY; y++) + for (var y = startY; y <= endY; y++) { UpdateTileAtTilemapPosition(x, y); } @@ -98,30 +119,30 @@ namespace Map private void UpdateTileAtTilemapPosition(int tileX, int tileY) { // 计算对应的数据坐标(考虑偏移) - int dataX = tileX - dataOffset.x; - int dataY = tileY - dataOffset.y; + var dataX = tileX - dataOffset.x; + var dataY = tileY - dataOffset.y; // 获取四个角的数据坐标 - int topLeftX = dataX; - int topLeftY = dataY; - int topRightX = dataX + 1; - int topRightY = dataY; - int bottomLeftX = dataX; - int bottomLeftY = dataY + 1; - int bottomRightX = dataX + 1; - int bottomRightY = dataY + 1; + var topLeftX = dataX; + var topLeftY = dataY + 1; + var topRightX = dataX + 1; + var topRightY = dataY + 1; + var bottomLeftX = dataX; + var bottomLeftY = dataY; + var bottomRightX = dataX + 1; + var bottomRightY = dataY; // 检查边界并获取值 - int topLeft = GetDataValue(topLeftX, topLeftY); - int topRight = GetDataValue(topRightX, topRightY); - int bottomLeft = GetDataValue(bottomLeftX, bottomLeftY); - int bottomRight = GetDataValue(bottomRightX, bottomRightY); + var topLeft = GetDataValue(topLeftX, topLeftY); + var topRight = GetDataValue(topRightX, topRightY); + var bottomLeft = GetDataValue(bottomLeftX, bottomLeftY); + var bottomRight = GetDataValue(bottomRightX, bottomRightY); // 获取对应的瓦片 - TileBase tile = GetTileFromManager(topLeft, topRight, bottomLeft, bottomRight); + var tile = GetTileFromManager(topLeft, topRight, bottomLeft, bottomRight); // 设置到瓦片地图 - Vector3Int position = new Vector3Int(tileX, tileY, 0); + var position = new Vector3Int(tileX, tileY, 0); textureLevel.SetTile(position, tile); } @@ -136,7 +157,7 @@ namespace Map // 从TileManager获取对应瓦片 private TileBase GetTileFromManager(int topLeft, int topRight, int bottomLeft, int bottomRight) { - TileManager manager = TileManager.Instance; + var manager = TileManager.Instance; if (manager == null) { Debug.LogError("TileManager实例未找到"); @@ -145,13 +166,13 @@ namespace Map // 尝试获取组合键对应的瓦片 var key = (topLeft, topRight, bottomLeft, bottomRight); - if (manager.tileToTileBaseMapping.TryGetValue(key, out TileBase tile)) + if (manager.tileToTileBaseMapping.TryGetValue(key, out var tile)) { return tile; } // 备用方案:尝试获取默认瓦片 - if (manager.tileBaseMapping.TryGetValue("Default", out TileBase defaultTile)) + if (manager.tileBaseMapping.TryGetValue("Default", out var defaultTile)) { return defaultTile; } diff --git a/Client/Assets/Scripts/Map/MapGenerator.cs b/Client/Assets/Scripts/Map/MapGenerator.cs index d961500..9314fce 100644 --- a/Client/Assets/Scripts/Map/MapGenerator.cs +++ b/Client/Assets/Scripts/Map/MapGenerator.cs @@ -10,21 +10,7 @@ namespace Map public Tilemap buildLevel; public Tilemap plantLevel; - public void Start() - { - var perline= Utils.PerlinNoise.Instance; - var size = 100; - baseLevel.InitializeData(size, size); - for (var i = 0; i < size; i++) { - for (var j = 0; j < size; j++) { - var dx = i - size/2; - var dy = j - size/2; - baseLevel.mapData[i][j] = (int)(Math.Sqrt(dx*dx + dy*dy) / 5) & 1; - } - } - baseLevel.RefreshAllTiles(); - } - + public bool CanPassThrough(int x, int y) { return GetTilePassCost(x, y) < 1; diff --git a/Client/Assets/Scripts/Prefab/EntityPrefab.cs b/Client/Assets/Scripts/Prefab/EntityPrefab.cs index 2a73146..ff66191 100644 --- a/Client/Assets/Scripts/Prefab/EntityPrefab.cs +++ b/Client/Assets/Scripts/Prefab/EntityPrefab.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using AI; using Base; @@ -37,11 +38,17 @@ namespace Prefab public void DefaultInit() { var animator = GetComponentsInChildren(); - ITick[] inf = animator; - entity.bodyAnimationNode.Add(Orientation.Down,inf.ToList()); - entity.bodyAnimationNode.Add(Orientation.Up,inf.ToList()); - entity.bodyAnimationNode.Add(Orientation.Left,inf.ToList()); - entity.bodyAnimationNode.Add(Orientation.Right,inf.ToList()); + var inf = animator.Cast().ToList(); + foreach (EntityState state in Enum.GetValues(typeof(EntityState))) + { + var orientationDict = new Dictionary>(); + foreach (Orientation orientation in Enum.GetValues(typeof(Orientation))) + { + orientationDict[orientation] = inf; // 所有值都指向同一个列表 + } + entity.bodyAnimationNode[state] = orientationDict; + } + outline.Init(); outline.Hide(); } diff --git a/Client/Data/Core/Define/Pawn/Character.xml b/Client/Data/Core/Define/Pawn/Character.xml index 6685f25..c5638dc 100644 --- a/Client/Data/Core/Define/Pawn/Character.xml +++ b/Client/Data/Core/Define/Pawn/Character.xml @@ -1,5 +1,14 @@ + + + testPawn + res:Character/Test/Body/idle_down + 5 + 1 + + + testPawn @@ -10,10 +19,15 @@ player - res:Character\Test - - - + + +
  • testPawn_0
  • +
  • testPawn_1
  • +
  • testPawn_2
  • +
  • testPawn_3
  • +
  • testPawn_4
  • +
    +