diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset b/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset
index 569725002..073779056 100644
--- a/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset
+++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset
@@ -14,7 +14,7 @@ MonoBehaviour:
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: ec57fb26f5bb61544b2831e9485b32fe, type: 2}
m_InternalBundleIdMode: 1
- m_Compression: 1
+ m_Compression: 2
m_IncludeAddressInCatalog: 1
m_IncludeGUIDInCatalog: 1
m_IncludeLabelsInCatalog: 1
diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/HomeUIRes_BundledAssetGroupSchema.asset b/Assets/AddressableAssetsData/AssetGroups/Schemas/HomeUIRes_BundledAssetGroupSchema.asset
index e15c877c3..a54e9d5d8 100644
--- a/Assets/AddressableAssetsData/AssetGroups/Schemas/HomeUIRes_BundledAssetGroupSchema.asset
+++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/HomeUIRes_BundledAssetGroupSchema.asset
@@ -14,7 +14,7 @@ MonoBehaviour:
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: 9971f2f92adebd44faa29cc332720d65, type: 2}
m_InternalBundleIdMode: 1
- m_Compression: 1
+ m_Compression: 2
m_IncludeAddressInCatalog: 1
m_IncludeGUIDInCatalog: 1
m_IncludeLabelsInCatalog: 1
diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/LoginUIRes_BundledAssetGroupSchema.asset b/Assets/AddressableAssetsData/AssetGroups/Schemas/LoginUIRes_BundledAssetGroupSchema.asset
index 3b6473170..bce3c10a0 100644
--- a/Assets/AddressableAssetsData/AssetGroups/Schemas/LoginUIRes_BundledAssetGroupSchema.asset
+++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/LoginUIRes_BundledAssetGroupSchema.asset
@@ -14,7 +14,7 @@ MonoBehaviour:
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: 59a1dc2550990aa4091c8db201571a43, type: 2}
m_InternalBundleIdMode: 1
- m_Compression: 1
+ m_Compression: 2
m_IncludeAddressInCatalog: 1
m_IncludeGUIDInCatalog: 1
m_IncludeLabelsInCatalog: 1
diff --git a/Assets/AddressableAssetsData/AssetGroups/Schemas/ZGXQ_BundledAssetGroupSchema.asset b/Assets/AddressableAssetsData/AssetGroups/Schemas/ZGXQ_BundledAssetGroupSchema.asset
index eedc49b43..6f224959e 100644
--- a/Assets/AddressableAssetsData/AssetGroups/Schemas/ZGXQ_BundledAssetGroupSchema.asset
+++ b/Assets/AddressableAssetsData/AssetGroups/Schemas/ZGXQ_BundledAssetGroupSchema.asset
@@ -14,7 +14,7 @@ MonoBehaviour:
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: aa56712de737c4b4ea481409576c9b09, type: 2}
m_InternalBundleIdMode: 1
- m_Compression: 1
+ m_Compression: 2
m_IncludeAddressInCatalog: 1
m_IncludeGUIDInCatalog: 1
m_IncludeLabelsInCatalog: 1
diff --git a/Assets/AddressableAssetsData/Windows/addressables_content_state.bin b/Assets/AddressableAssetsData/Windows/addressables_content_state.bin
index 2acc3fd29..7b2c07eb0 100644
Binary files a/Assets/AddressableAssetsData/Windows/addressables_content_state.bin and b/Assets/AddressableAssetsData/Windows/addressables_content_state.bin differ
diff --git a/Assets/Art/XJMH/pw/pw_effect/materials/FJH_yanhuo_02.mat b/Assets/Art/XJMH/pw/pw_effect/materials/FJH_yanhuo_02.mat
index 581240f90..d22f1328a 100644
--- a/Assets/Art/XJMH/pw/pw_effect/materials/FJH_yanhuo_02.mat
+++ b/Assets/Art/XJMH/pw/pw_effect/materials/FJH_yanhuo_02.mat
@@ -2,34 +2,28 @@
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
- serializedVersion: 8
+ serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: FJH_yanhuo_02
m_Shader: {fileID: 200, guid: 0000000000000000f000000000000000, type: 0}
- m_Parent: {fileID: 0}
- m_ModifiedSerializedProperties: 0
- m_ValidKeywords: []
- m_InvalidKeywords: []
+ m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
- m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- - _MainTex:
+ _MainTex:
m_Texture: {fileID: 2800000, guid: c5d4efd524ef05b479430819e44412d2, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- m_Ints: []
m_Floats:
- - _InvFade: 1
+ _InvFade: 1
m_Colors:
- - _TintColor: {r: 0.8, g: 0.8, b: 0.8, a: 0.5}
- m_BuildTextureStacks: []
+ _TintColor: {r: 0.5, g: 0.5, b: 0.5, a: 0.5}
diff --git a/Assets/Art/XJMH/pw/pw_effect/materials/FJH_yanhuo_03.mat b/Assets/Art/XJMH/pw/pw_effect/materials/FJH_yanhuo_03.mat
index 84925136f..0564bcec8 100644
--- a/Assets/Art/XJMH/pw/pw_effect/materials/FJH_yanhuo_03.mat
+++ b/Assets/Art/XJMH/pw/pw_effect/materials/FJH_yanhuo_03.mat
@@ -2,34 +2,28 @@
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
- serializedVersion: 8
+ serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: FJH_yanhuo_03
m_Shader: {fileID: 200, guid: 0000000000000000f000000000000000, type: 0}
- m_Parent: {fileID: 0}
- m_ModifiedSerializedProperties: 0
- m_ValidKeywords: []
- m_InvalidKeywords: []
+ m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
- m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- - _MainTex:
+ _MainTex:
m_Texture: {fileID: 2800000, guid: bfa85d8c83b5e2e41bfd646da11ea2d9, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- m_Ints: []
m_Floats:
- - _InvFade: 1
+ _InvFade: 1
m_Colors:
- - _TintColor: {r: 0.8, g: 0.8, b: 0.8, a: 0.5}
- m_BuildTextureStacks: []
+ _TintColor: {r: 0.5, g: 0.5, b: 0.5, a: 0.5}
diff --git a/Assets/Art/XJMH/pw/pw_effect/materials/FJ_lizi_01.mat b/Assets/Art/XJMH/pw/pw_effect/materials/FJ_lizi_01.mat
index 332b1124a..7a2aaad01 100644
--- a/Assets/Art/XJMH/pw/pw_effect/materials/FJ_lizi_01.mat
+++ b/Assets/Art/XJMH/pw/pw_effect/materials/FJ_lizi_01.mat
@@ -2,34 +2,28 @@
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
- serializedVersion: 8
+ serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: FJ_lizi_01
m_Shader: {fileID: 200, guid: 0000000000000000f000000000000000, type: 0}
- m_Parent: {fileID: 0}
- m_ModifiedSerializedProperties: 0
- m_ValidKeywords: []
- m_InvalidKeywords: []
+ m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
- m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- - _MainTex:
+ _MainTex:
m_Texture: {fileID: 2800000, guid: b75023ac4ff165a4f8105dc332dd228c, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- m_Ints: []
m_Floats:
- - _InvFade: 1
+ _InvFade: 1
m_Colors:
- - _TintColor: {r: 1, g: 1, b: 1, a: 0.59607846}
- m_BuildTextureStacks: []
+ _TintColor: {r: 0.5, g: 0.5, b: 0.5, a: 0.5}
diff --git a/Assets/Art/XJMH/pw/pw_effect/materials/FJ_lizi_01_a.mat b/Assets/Art/XJMH/pw/pw_effect/materials/FJ_lizi_01_a.mat
index 7a8ae39d0..170e0e5c0 100644
--- a/Assets/Art/XJMH/pw/pw_effect/materials/FJ_lizi_01_a.mat
+++ b/Assets/Art/XJMH/pw/pw_effect/materials/FJ_lizi_01_a.mat
@@ -2,34 +2,28 @@
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
- serializedVersion: 8
+ serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: FJ_lizi_01_a
m_Shader: {fileID: 200, guid: 0000000000000000f000000000000000, type: 0}
- m_Parent: {fileID: 0}
- m_ModifiedSerializedProperties: 0
- m_ValidKeywords: []
- m_InvalidKeywords: []
+ m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
- m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- - _MainTex:
+ _MainTex:
m_Texture: {fileID: 2800000, guid: b75023ac4ff165a4f8105dc332dd228c, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- m_Ints: []
m_Floats:
- - _InvFade: 1
+ _InvFade: 1
m_Colors:
- - _TintColor: {r: 0.8, g: 0.8, b: 0.8, a: 1}
- m_BuildTextureStacks: []
+ _TintColor: {r: 0.5019608, g: 0.5019608, b: 0.5019608, a: 1}
diff --git a/Assets/Art/XJMH/pw/pw_effect/materials/FJ_xulie_23.mat b/Assets/Art/XJMH/pw/pw_effect/materials/FJ_xulie_23.mat
index d30748eb0..5c38ea463 100644
--- a/Assets/Art/XJMH/pw/pw_effect/materials/FJ_xulie_23.mat
+++ b/Assets/Art/XJMH/pw/pw_effect/materials/FJ_xulie_23.mat
@@ -2,34 +2,28 @@
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
- serializedVersion: 8
+ serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: FJ_xulie_23
m_Shader: {fileID: 200, guid: 0000000000000000f000000000000000, type: 0}
- m_Parent: {fileID: 0}
- m_ModifiedSerializedProperties: 0
- m_ValidKeywords: []
- m_InvalidKeywords: []
+ m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
- m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- - _MainTex:
+ _MainTex:
m_Texture: {fileID: 2800000, guid: 7868e9e5d8d07ea4790ad0ffeebb1765, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- m_Ints: []
m_Floats:
- - _InvFade: 1
+ _InvFade: 1
m_Colors:
- - _TintColor: {r: 0.8, g: 0.8, b: 0.8, a: 0.5}
- m_BuildTextureStacks: []
+ _TintColor: {r: 0.5, g: 0.5, b: 0.5, a: 0.5}
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_02.png b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_02.png
index bc911ccf0..0132abaab 100644
Binary files a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_02.png and b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_02.png differ
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_02.png.meta b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_02.png.meta
index 5d65d8c38..c86358951 100644
--- a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_02.png.meta
+++ b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_02.png.meta
@@ -93,7 +93,7 @@ TextureImporter:
uncompressedFormat: 0
desiredFormat: 0
usageMode: 0
- colorSpace: 1
+ colorSpace: 0
androidETC2FallbackFormat: 0
width: 0
height: 0
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_03.png b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_03.png
index dc59d419a..9a3543589 100644
Binary files a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_03.png and b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_03.png differ
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_03.png.meta b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_03.png.meta
index 038664dad..902263c6f 100644
--- a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_03.png.meta
+++ b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_03.png.meta
@@ -93,7 +93,7 @@ TextureImporter:
uncompressedFormat: 0
desiredFormat: 0
usageMode: 0
- colorSpace: 1
+ colorSpace: 0
androidETC2FallbackFormat: 0
width: 0
height: 0
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_04.png b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_04.png
index 79ca2e729..60a75bcc7 100644
Binary files a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_04.png and b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_04.png differ
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_04.png.meta b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_04.png.meta
index a533136f2..5c2e9dec1 100644
--- a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_04.png.meta
+++ b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_wenli_04.png.meta
@@ -93,7 +93,7 @@ TextureImporter:
uncompressedFormat: 0
desiredFormat: 0
usageMode: 0
- colorSpace: 1
+ colorSpace: 0
androidETC2FallbackFormat: 0
width: 0
height: 0
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_01.png b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_01.png
index e6fc1aa0a..3125cd0e5 100644
Binary files a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_01.png and b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_01.png differ
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_01.png.meta b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_01.png.meta
index 348a4353c..3bd47ae2c 100644
--- a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_01.png.meta
+++ b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_01.png.meta
@@ -93,7 +93,7 @@ TextureImporter:
uncompressedFormat: 0
desiredFormat: 0
usageMode: 0
- colorSpace: 1
+ colorSpace: 0
androidETC2FallbackFormat: 0
width: 0
height: 0
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_02.png b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_02.png
index e0c0a6eda..7b6fbfb6b 100644
Binary files a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_02.png and b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_02.png differ
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_02.png.meta b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_02.png.meta
index c67abd99c..b6ab04941 100644
--- a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_02.png.meta
+++ b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_02.png.meta
@@ -93,7 +93,7 @@ TextureImporter:
uncompressedFormat: 0
desiredFormat: 0
usageMode: 0
- colorSpace: 1
+ colorSpace: 0
androidETC2FallbackFormat: 0
width: 0
height: 0
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_03.png b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_03.png
index 052202502..38c7e905f 100644
Binary files a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_03.png and b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_03.png differ
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_03.png.meta b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_03.png.meta
index b9cdffc1f..c63a8dbd1 100644
--- a/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_03.png.meta
+++ b/Assets/Art/XJMH/pw/pw_effect/texture/FJH_yanhuo_03.png.meta
@@ -93,7 +93,7 @@ TextureImporter:
uncompressedFormat: 0
desiredFormat: 0
usageMode: 0
- colorSpace: 1
+ colorSpace: 0
androidETC2FallbackFormat: 0
width: 0
height: 0
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_lizi_01.png b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_lizi_01.png
index 44ab1874b..a37e29b49 100644
Binary files a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_lizi_01.png and b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_lizi_01.png differ
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_lizi_01.png.meta b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_lizi_01.png.meta
index c52f00040..b43326ce5 100644
--- a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_lizi_01.png.meta
+++ b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_lizi_01.png.meta
@@ -93,7 +93,7 @@ TextureImporter:
uncompressedFormat: 0
desiredFormat: 0
usageMode: 0
- colorSpace: 1
+ colorSpace: 0
androidETC2FallbackFormat: 0
width: 0
height: 0
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_01.png b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_01.png
index 22ec659af..d7f31556a 100644
Binary files a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_01.png and b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_01.png differ
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_01.png.meta b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_01.png.meta
index 36230dc51..aab4ac43a 100644
--- a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_01.png.meta
+++ b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_01.png.meta
@@ -93,7 +93,7 @@ TextureImporter:
uncompressedFormat: 0
desiredFormat: 0
usageMode: 0
- colorSpace: 1
+ colorSpace: 0
androidETC2FallbackFormat: 0
width: 0
height: 0
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_02.png b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_02.png
index 77e36259c..3d02f982f 100644
Binary files a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_02.png and b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_02.png differ
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_02.png.meta b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_02.png.meta
index 2734cba82..4b8556d99 100644
--- a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_02.png.meta
+++ b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_02.png.meta
@@ -93,7 +93,7 @@ TextureImporter:
uncompressedFormat: 0
desiredFormat: 0
usageMode: 0
- colorSpace: 1
+ colorSpace: 0
androidETC2FallbackFormat: 0
width: 0
height: 0
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_03.png b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_03.png
index 9ea84cd3e..3987c640d 100644
Binary files a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_03.png and b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_03.png differ
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_03.png.meta b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_03.png.meta
index 420cff5a6..47b6ee421 100644
--- a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_03.png.meta
+++ b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_03.png.meta
@@ -93,7 +93,7 @@ TextureImporter:
uncompressedFormat: 0
desiredFormat: 0
usageMode: 0
- colorSpace: 1
+ colorSpace: 0
androidETC2FallbackFormat: 0
width: 0
height: 0
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_04.png b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_04.png
index 2f4b4e85c..4e3a8baea 100644
Binary files a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_04.png and b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_04.png differ
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_04.png.meta b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_04.png.meta
index cd06e8526..e8127464c 100644
--- a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_04.png.meta
+++ b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_water_04.png.meta
@@ -93,7 +93,7 @@ TextureImporter:
uncompressedFormat: 0
desiredFormat: 0
usageMode: 0
- colorSpace: 1
+ colorSpace: 0
androidETC2FallbackFormat: 0
width: 0
height: 0
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_xulie_23.png b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_xulie_23.png
index 4e99eb5a7..5bbaea8ee 100644
Binary files a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_xulie_23.png and b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_xulie_23.png differ
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_xulie_23.png.meta b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_xulie_23.png.meta
index e498e21b7..2d2869796 100644
--- a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_xulie_23.png.meta
+++ b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_xulie_23.png.meta
@@ -93,7 +93,7 @@ TextureImporter:
uncompressedFormat: 0
desiredFormat: 0
usageMode: 0
- colorSpace: 1
+ colorSpace: 0
androidETC2FallbackFormat: 0
width: 0
height: 0
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_07.png b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_07.png
index a36e4a0c3..4b8735d8f 100644
Binary files a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_07.png and b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_07.png differ
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_07.png.meta b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_07.png.meta
index 4887ce86f..d546d35f9 100644
--- a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_07.png.meta
+++ b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_07.png.meta
@@ -93,7 +93,7 @@ TextureImporter:
uncompressedFormat: 0
desiredFormat: 0
usageMode: 0
- colorSpace: 1
+ colorSpace: 0
androidETC2FallbackFormat: 0
width: 0
height: 0
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_08.png b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_08.png
index c34324fe6..7480faf4b 100644
Binary files a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_08.png and b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_08.png differ
diff --git a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_08.png.meta b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_08.png.meta
index b73173bdc..2d2ae7096 100644
--- a/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_08.png.meta
+++ b/Assets/Art/XJMH/pw/pw_effect/texture/FJ_yanhuo_08.png.meta
@@ -93,7 +93,7 @@ TextureImporter:
uncompressedFormat: 0
desiredFormat: 0
usageMode: 0
- colorSpace: 1
+ colorSpace: 0
androidETC2FallbackFormat: 0
width: 0
height: 0
diff --git a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_0_1.prefab b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_0_1.prefab
index 80464e4d7..534dba9b0 100644
--- a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_0_1.prefab
+++ b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_0_1.prefab
@@ -446,7 +446,7 @@ MonoBehaviour:
m_GameObject: {fileID: 1908357602512059}
m_Enabled: 1
m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 3cf5a44414476512e00c3e7a2569a919, type: 3}
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
diff --git a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_0_2.prefab b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_0_2.prefab
index 3860248d5..4d7ec4c97 100644
--- a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_0_2.prefab
+++ b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_0_2.prefab
@@ -662,7 +662,7 @@ MonoBehaviour:
m_GameObject: {fileID: 1713733470841517}
m_Enabled: 1
m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 3cf5a44414476512e00c3e7a2569a919, type: 3}
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
diff --git a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_0_3.prefab b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_0_3.prefab
index 9e3c99fb5..a4f2c39ad 100644
--- a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_0_3.prefab
+++ b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_0_3.prefab
@@ -537,7 +537,7 @@ MonoBehaviour:
m_GameObject: {fileID: 1657386649342399}
m_Enabled: 1
m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 3cf5a44414476512e00c3e7a2569a919, type: 3}
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
diff --git a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_1_1.prefab b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_1_1.prefab
index ad1f60964..2e70b8b2b 100644
--- a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_1_1.prefab
+++ b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_1_1.prefab
@@ -658,7 +658,7 @@ MonoBehaviour:
m_GameObject: {fileID: 1705568770173308}
m_Enabled: 1
m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 3cf5a44414476512e00c3e7a2569a919, type: 3}
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
diff --git a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_1_2.prefab b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_1_2.prefab
index 1b5402cb0..1d2dfa348 100644
--- a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_1_2.prefab
+++ b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_1_2.prefab
@@ -389,7 +389,7 @@ MonoBehaviour:
m_GameObject: {fileID: 1068391174607537}
m_Enabled: 1
m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 3cf5a44414476512e00c3e7a2569a919, type: 3}
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
diff --git a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_1_3.prefab b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_1_3.prefab
index ed4458888..4f9143501 100644
--- a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_1_3.prefab
+++ b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Background_1_3.prefab
@@ -318,7 +318,7 @@ MonoBehaviour:
m_GameObject: {fileID: 1105481484750792}
m_Enabled: 1
m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 3cf5a44414476512e00c3e7a2569a919, type: 3}
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
diff --git a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_BgCloud.prefab b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_BgCloud.prefab
index 5f363290f..c637344c2 100644
--- a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_BgCloud.prefab
+++ b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_BgCloud.prefab
@@ -54,7 +54,7 @@ MonoBehaviour:
m_GameObject: {fileID: 1120841903074299}
m_Enabled: 1
m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 3cf5a44414476512e00c3e7a2569a919, type: 3}
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
diff --git a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Shadow.prefab b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Shadow.prefab
index 73014a293..56314ffdd 100644
--- a/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Shadow.prefab
+++ b/Assets/Art/XJMH/pw/pw_prefab/game/background/PW_Shadow.prefab
@@ -54,7 +54,7 @@ MonoBehaviour:
m_GameObject: {fileID: 1299482983134209}
m_Enabled: 1
m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 8b6b0933debec03db3ed40115224c1a8, type: 3}
+ m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 2100000, guid: b1d7ed7dd8acb9c45aef67b022b87c28, type: 2}
diff --git a/Assets/Art/XJMH/pw/pw_prefab/game/bullet/PW_Bullet_FlameRound.prefab b/Assets/Art/XJMH/pw/pw_prefab/game/bullet/PW_Bullet_FlameRound.prefab
index e11e7231d..dbd4f6611 100644
--- a/Assets/Art/XJMH/pw/pw_prefab/game/bullet/PW_Bullet_FlameRound.prefab
+++ b/Assets/Art/XJMH/pw/pw_prefab/game/bullet/PW_Bullet_FlameRound.prefab
@@ -8,6 +8,21 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
+ - target: {fileID: 2627120296159640219, guid: 9ed49cd2acc114b4d839b06e3766ccaf,
+ type: 3}
+ propertyPath: m_LocalScale.x
+ value: 2
+ objectReference: {fileID: 0}
+ - target: {fileID: 2627120296159640219, guid: 9ed49cd2acc114b4d839b06e3766ccaf,
+ type: 3}
+ propertyPath: m_LocalScale.y
+ value: 2
+ objectReference: {fileID: 0}
+ - target: {fileID: 2627120296159640219, guid: 9ed49cd2acc114b4d839b06e3766ccaf,
+ type: 3}
+ propertyPath: m_LocalScale.z
+ value: 2
+ objectReference: {fileID: 0}
- target: {fileID: 2627120296159640219, guid: 9ed49cd2acc114b4d839b06e3766ccaf,
type: 3}
propertyPath: m_LocalPosition.x
@@ -58,6 +73,11 @@ PrefabInstance:
propertyPath: m_LocalEulerAnglesHint.z
value: -0
objectReference: {fileID: 0}
+ - target: {fileID: 2627120296159640219, guid: 9ed49cd2acc114b4d839b06e3766ccaf,
+ type: 3}
+ propertyPath: m_ConstrainProportionsScale
+ value: 1
+ objectReference: {fileID: 0}
- target: {fileID: 2628375401523424628, guid: 9ed49cd2acc114b4d839b06e3766ccaf,
type: 3}
propertyPath: m_Name
diff --git a/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/FlameRoundBullet.cs b/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/FlameRoundBullet.cs
new file mode 100644
index 000000000..ce93d7b02
--- /dev/null
+++ b/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/FlameRoundBullet.cs
@@ -0,0 +1,724 @@
+using Assets.MyGame.Scripts.Net.APIResponses.Enum;
+using DG.Tweening;
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+///
+/// 烈焰风暴火球弹(PW_Bullet_FlameRound)的飞行 / 反弹 / 命中控制。
+///
+/// 「击杀 + 反弹」框架参考钻头子弹 MyGame/aa/Game/FLZY/TSY/ZuanTou/SpecialBulletMove.cs:
+/// · 撞墙走**法线反弹**(ClosestPoint 求法线 → Vector2.Reflect),反弹后沿法线推回墙外防穿模;
+/// · 反弹冷却 0.05s 防一帧内连触发 / 穿墙;反弹刷新兜底计时(还在弹就永不超时);
+/// · 碰鱼只处理「普通鱼」,同一条鱼只报一次,之后**穿透继续飞**(跟钻头一样,杀完继续打);
+/// · 反弹次数到上限 / 兜底超时 → 收尾爆发,回收。
+///
+/// 表现参数对齐 lua pw_bullet/PW_BulletFlameStrike.txt:
+/// · speed 30;sprite 自转 2400°/s(lua 用第一次算的 dt 缓存四元数,这里同样缓存);
+/// · 反弹时(自己视角)震屏 + 播 PW_FlameStrike_WheelFly(同 1 秒内只播一次);
+/// · 正下方(±90°)撞到上下墙 → 改成 ±30° 斜弹并按 lua 翻转 flag,防止贴着上下边来回弹;
+/// · 碰鱼:命中特效(lua PW_Effect_Hit_Prop6)+ 上报击杀(KillFish,只有击杀者客户端发)+ OnHurt,
+/// 子弹**不消失**(lua Collider() 也只上报、不销毁);
+/// · 收尾(lua Disappear()):PW_FlameStrike_WheelExplosion 音效 + sprite 隐藏 + 切 Explosion 特效
+/// + 0.6s 后回收。
+///
+/// 用法(不改预制体):由 在 BulletPool.Get 之后运行时 AddComponent,
+/// 并把预制体上原来的 BullitMove 关掉,避免两套移动逻辑打架。
+///
+public class FlameRoundBullet : MonoBehaviour
+{
+ // ================================================================ Inspector
+ [Header("移动")]
+ [Tooltip("飞行速度(lua speed=30)")]
+ public float moveSpeed = 30f;
+ [Tooltip("兜底存活时间(秒):到点还没被反弹上限收尾就强制爆炸。\n" +
+ "速度 30 → 8 秒飞约 240 单位(屏幕对角线约 25~28 单位),正常会先被 bounceLimit 收尾")]
+ public float lifeTime = 8f;
+ [Tooltip("sprite 自转速度(度/秒,lua spinSpeed=2400)")]
+ public float spriteSpinSpeed = 2400f;
+
+ [Header("反弹")]
+ [Tooltip("撞墙反弹次数上限,到达后进入收尾爆炸回收(<=0 表示不限次数,只靠 lifeTime 兜底)。\n" +
+ "⭐ 每撞一次墙算 1 次 → 4 次大约 2~3.5 秒收尾(钻头蟹 7+5=12 次是三段式,火球弹是单一阶段)")]
+ public int bounceLimit = 4;
+ [Tooltip("反弹冷却(秒):防同一帧/连续多帧重复触发导致穿墙")]
+ public float bounceCooldown = 0.05f;
+ [Tooltip("同一面墙的再次反弹冷却(秒):防止卡在墙角里被连续计次,几下就打满反弹上限")]
+ public float sameWallCooldown = 0.25f;
+ [Tooltip("撞墙反弹是否刷新兜底计时(钻头做法)。关掉=严格按 lifeTime 超时,行为更可预测")]
+ public bool refreshLifeOnBounce = false;
+ [Tooltip("垂直(正上/正下)撞到上下墙时改成的斜角(lua ±30°),防止贴着上下边来回弹")]
+ public float verticalDeflectAngle = 30f;
+ [Tooltip("反弹时震屏 + 播 WheelFly 音效(仅自己视角)")]
+ public bool bounceFeedback = true;
+ [Tooltip("反弹震屏强度(ShortShake2D 的 positionStrength/rotationStrength)")]
+ public float bounceShakeStrength = 0.5f;
+ [Tooltip("反弹音效最小间隔(秒,lua 用时间戳做的 1 秒节流)")]
+ public float bounceSoundInterval = 1f;
+
+ [Header("命中鱼")]
+ [Tooltip("命中特效预制体(lua: PW_Effect_Hit_Prop6)")]
+ public GameObject hitEffectPrefab;
+ [Tooltip("⭐ 兜底上报开关:仅当创建方没给 onHitFish 回调时才用(走 WebSocketSendList.KillFish)。\n" +
+ "对齐钻头蟹时由创建方给回调走本地帧同步杀鱼(Id_DieFish_FX),此时保持 false 避免重复结算")]
+ public bool reportKill = false;
+ [Tooltip("打详细日志(排查用:每次 Trigger、每次碰鱼、被动回收都会打)")]
+ public bool debugLog = true;
+ [Tooltip("自动检测鱼(每帧 OverlapCircle 主动扫,不依赖 OnTrigger 事件):\n" +
+ "即使触发器因层/标签/帧率(速度30每帧0.6单位)漏触发,也一定能命中并穿透")]
+ public bool detectFishByOverlap = true;
+ [Tooltip("主动检测的额外半径(在碰撞体半径 + 每帧步长 之上再加的安全余量)")]
+ public float overlapExtraRadius = 0.35f;
+ [Tooltip("回收时不用 BulletPool、直接 Destroy:\n" +
+ "⭐ 关键保险 —— 本项目换炮台/BulletPool.ClearActive() 会销毁所有\"活跃子弹\",\n" +
+ "火球弹不属于任何座位,混在池里会被误清;自管理后外部清理一律带不走它")]
+ public bool selfManaged = true;
+ [Tooltip("墙层(留空自动取 Wall 层,另兼容 Wall 标签)")]
+ public LayerMask wallLayer;
+ [Tooltip("鱼层(留空自动取 Fish 层,另兼容 Fish 标签)")]
+ public LayerMask fishLayer;
+
+ [Header("节点名 / 收尾")]
+ [Tooltip("弹体 sprite 节点名(自转用)")]
+ public string spriteNodeName = "sprite";
+ [Tooltip("飞行中显示的特效节点名(lua ShowEffect(1)=Glow)")]
+ public string glowNodeName = "Glow";
+ [Tooltip("收尾时显示的特效节点名(lua ShowEffect(2)=Explosion)")]
+ public string explosionNodeName = "Explosion";
+ [Tooltip("收尾爆炸后停留多久回池(lua 0.6s)")]
+ public float explosionHoldTime = 0.6f;
+
+ [Header("收尾爆炸炸鱼(对齐钻头蟹 SpecialBulletMove.Explode)")]
+ [Tooltip("收尾爆炸的杀鱼半径(世界单位):炸一圈小鱼。<=0 表示不炸鱼")]
+ public float explosionRadius = 3f;
+ [Tooltip("收尾爆炸是否炸死范围小鱼(对齐钻头蟹 killFishOnFinal)")]
+ public bool killFishOnFinal = true;
+ [Tooltip("范围炸鱼时是否也各播一次命中特效(钻头蟹不播,靠爆炸特效;默认关,避免同点叠一堆)")]
+ public bool explosionSpawnHitEffect = false;
+
+ [Header("收尾爆奖(BJEndUI)")]
+ [Tooltip("⭐ 是否由本发子弹自己出爆奖面板。\n" +
+ "默认 **关** —— 4 发子弹各出一份 = 屏幕上叠 4 个面板。\n" +
+ "正确做法(对齐钻头蟹):由创建方 Boss 统计所有子弹都收尾后,统一出**一次**面板(走 onFinished 回调)")]
+ public bool spawnJackpotOnFinish = false;
+ [Tooltip("爆奖结算面板预制体(BJEndUI)。仅 spawnJackpotOnFinish=true 时用")]
+ public GameObject bjEndUIPrefab;
+ [Tooltip("爆奖倍率(beishu)。<=0 时自动用炮倍 paoBei")]
+ public int jackpotBeishu = 0;
+ [Tooltip("⭐ 爆奖总分:<0 表示自动累计本发击杀鱼的分值(die_Score) 作兜底;>=0 表示用该注入值(建议由 Boss 从后端 gold 注入)")]
+ public long jackpotScore = -1;
+ [Tooltip("爆奖面板相对击杀者座位的 Y 偏移(世界单位,座位上方;与其它爆奖一致)")]
+ public float bjEndUIOffsetY = 150f;
+
+ // ================================================================ 创建方注入
+ /// Boss 击杀者 userId(决定谁上报击杀;只有等于本机用户时才发请求)
+ [NonSerialized] public string killerUserId;
+ /// 子弹标识(上报用)
+ [NonSerialized] public string bulletId;
+ /// 炮倍(上报用,取击杀者座位 consumeGoldNum)
+ [NonSerialized] public int paoBei = 1;
+ /// sourceUID(lua 用它决定 180° 斜弹往左还是往右)
+ [NonSerialized] public int sourceUID;
+ /// 是否本机击杀者(震屏/音效门限)
+ [NonSerialized] public bool isSelf;
+ /// 碰鱼回调(创建方可追加:加分等),子弹不会因为回调而停止
+ [NonSerialized] public Action onHitFish;
+ /// 收尾完成回调(回收前触发)
+ [NonSerialized] public Action onFinished;
+
+ // ================================================================ 内部状态
+ private Transform _sprite;
+ private GameObject _glow;
+ private GameObject _explosion;
+ private Rigidbody2D _rb;
+ /// 同一个物体上的通用子弹脚本:本脚本接管后它必须保持关闭(开着就会"碰鱼即回池")
+ private BullitMove _bullit;
+
+ private Vector2 _heading = Vector2.up; // 前进方向(2D 平面),与模型旋转解耦
+ private Quaternion _baseRot = Quaternion.identity; // 预制体姿态(去掉 Z 分量后的基准)
+
+ private float _time; // 兜底计时
+ private float _bounceCd; // 反弹冷却
+ private float _lastBounceSoundTime = -99f; // 反弹音效节流
+ private int _bounceCount;
+ private int _flag = 1; // lua 的 flag:180° 斜弹时来回翻
+ private bool _finished;
+ private Tween _releaseTween;
+
+ // 主动检测鱼 / 同墙冷却
+ private float _baseRadius = 0.5f; // 自身碰撞体半径(Init 里取一次)
+ private Collider2D _lastWall; // 上一次反弹的墙
+ private float _lastWallTime = -99f;
+ private static readonly Collider2D[] _overlapBuf = new Collider2D[32];
+
+ private readonly HashSet _hitFish = new HashSet();
+ private long _accumScore; // 累计击杀分值(收尾爆奖兜底显示用)
+
+ // ================================================================ 生命周期
+ ///
+ /// 初始化并设置前进方向。
+ /// heading 语义与钻头 SpecialBulletMove 一致:世界方向;模型只转 Z 轴(保留预制体基准姿态)。
+ ///
+ public void Init(Vector2 heading)
+ {
+ KillReleaseTween();
+
+ _time = 0f;
+ _bounceCd = 0f;
+ _bounceCount = 0;
+ _flag = 1;
+ _finished = false;
+ _lastBounceSoundTime = -99f;
+ _lastWall = null;
+ _lastWallTime = -99f;
+ _hitFish.Clear();
+ _accumScore = 0;
+
+ if (wallLayer.value == 0) wallLayer = LayerMask.GetMask("Wall");
+ if (fishLayer.value == 0) fishLayer = LayerMask.GetMask("Fish");
+
+ // ⭐ 铁律:通用子弹脚本开着就"碰鱼即回池",本脚本接管期间必须保证它是关的。
+ // 再补一道保险:把 isTriggerFirst 置 false —— 即使它被重新启用,碰撞分支也整段跳过。
+ _bullit = GetComponent();
+ if (_bullit != null)
+ {
+ if (_bullit.enabled)
+ Debug.LogWarning("[烈焰风暴火球弹] 检测到 BullitMove 处于开启状态 → 已强制关闭(否则会一碰鱼就回池)");
+ _bullit.enabled = false;
+ _bullit.isTriggerFirst = false;
+ }
+
+ _rb = GetComponent();
+ if (_rb != null)
+ {
+ // 位置由脚本每帧直接写,物理只用来收 trigger
+ _rb.gravityScale = 0f;
+ _rb.velocity = Vector2.zero;
+ _rb.angularVelocity = 0f;
+ }
+
+ // 自身碰撞体半径(主动检测鱼时用:半径 + 本帧位移 + 余量)
+ var col = GetComponent();
+ _baseRadius = col != null ? Mathf.Max(col.bounds.extents.x, col.bounds.extents.y) : 0.5f;
+
+ if (_sprite == null) ResolveNodes(); // 池化复用不必每次重找(结构不会变)
+ // 视觉复位:上次收尾把 sprite 关掉了,池化复用必须打开(否则第二发看不到弹体)
+ if (_sprite != null) _sprite.gameObject.SetActive(true);
+ ShowExplosion(false); // 飞行中:Glow 亮、Explosion 灭
+
+ // 基准姿态 = 当前旋转去掉 Z 分量(本预制体旋转纯 Z,所以实际就是 identity)
+ float z0 = transform.eulerAngles.z;
+ _baseRot = Quaternion.Inverse(Quaternion.Euler(0f, 0f, z0)) * transform.rotation;
+
+ // 出膛方向:预制体已被创建方按朝向摆好 → 直接用 transform.up 取方向
+ SetHeading(transform.up);
+
+ Debug.Log($"[烈焰风暴火球弹 v3] 生命周期开始:接管={(_bullit != null ? "已接管(PW_Bullet_FlameRound)" : "⚠ 预制体上没有 BullitMove")} " +
+ $"pos={transform.position} dir={_heading} 速度={moveSpeed} 兜底={lifeTime}s " +
+ $"反弹上限={bounceLimit} 主动检测={detectFishByOverlap} 自管理={selfManaged} " +
+ $"sourceUID={sourceUID} 上报者={killerUserId}");
+
+ if (_bullit != null && _bullit.enabled)
+ Debug.LogWarning("[烈焰风暴火球弹] ⚠ BullitMove 处于开启状态 —— 它一碰鱼就会把子弹回池(表现为\"碰到鱼就消失\")");
+
+ // ⭐ 兜底时长提醒:屏幕对角线约 25~28 单位,速度 30 时 1 秒 ≈ 一屏多一点。
+ // 太短会看起来像"刚打出去就没了",所以只对"短到不合理"的配置告警(默认 8s 不触发)。
+ if (lifeTime > 0f && lifeTime < 3f)
+ {
+ Debug.LogWarning($"[烈焰风暴火球弹] ⚠ lifeTime={lifeTime}s 很短:速度 {moveSpeed} 时只飞约 " +
+ $"{lifeTime * moveSpeed:0} 单位(屏幕对角线约 25~28)就会被兜底回收");
+ }
+ }
+
+ private void OnDisable()
+ {
+ KillReleaseTween();
+ // ⭐ 诊断:正常收尾会先把 _finished 置 true 再回收;没置就走到这里 = **有别的东西**把子弹回收/隐藏了
+ if (!_finished && debugLog)
+ {
+ Debug.LogWarning($"[烈焰风暴火球弹] ⚠ 未收尾就被回收/隐藏 —— 不是本脚本回收的(很可能是 BullitMove 仍开着," +
+ $"或外部调了 BulletPool.ClearActive/ClearAll)。已飞 {_time:0.00}s、反弹 {_bounceCount} 次、" +
+ $"位置={transform.position}\n调用栈:{new System.Diagnostics.StackTrace(true)}");
+ }
+ }
+
+ /// 被真正销毁时的最后一道证据:打印调用栈,一眼看出是谁 Destroy 的
+ private void OnDestroy()
+ {
+ if (!_finished && debugLog)
+ {
+ Debug.LogWarning($"[烈焰风暴火球弹] ⚠ 子弹在未收尾状态下被 Destroy(已飞 {_time:0.00}s、反弹 {_bounceCount} 次)\n" +
+ $"调用栈:{new System.Diagnostics.StackTrace(true)}");
+ }
+ }
+
+ // ================================================================ 每帧
+ private void Update()
+ {
+ if (_finished) return;
+
+ // 自愈:万一 BullitMove 被别处重新打开 → 立刻关掉(它一碰鱼就会 BulletPool.Return)
+ if (_bullit != null && (_bullit.enabled || _bullit.isTriggerFirst))
+ {
+ _bullit.enabled = false;
+ _bullit.isTriggerFirst = false;
+ Debug.LogWarning("[烈焰风暴火球弹] BullitMove 被重新打开 → 已强制关闭并封掉它的碰撞分支");
+ }
+
+ _time += Time.deltaTime;
+ if (_bounceCd > 0f) _bounceCd -= Time.deltaTime;
+
+ // 兜底:按 lifeTime 严格超时(refreshLifeOnBounce=true 时撞墙会重置,跟钻头一致)
+ if (lifeTime > 0f && _time >= lifeTime)
+ {
+ Debug.LogWarning($"[烈焰风暴火球弹] 兜底收尾:{lifeTime}s(已反弹 {_bounceCount}/{bounceLimit})pos={transform.position}");
+ Finish();
+ return;
+ }
+
+ SpriteSpin();
+
+ // ⭐ 主动命中检测:不依赖 OnTrigger 事件(速度 30 每帧走 0.6 单位,触发器在
+ // 层/标签/帧率异常时可能漏触发)→ 每帧扫一次自身周围的鱼,保证"穿透"一定生效
+ if (detectFishByOverlap) DetectFishByOverlap();
+
+ transform.position += (Vector3)(_heading * (moveSpeed * Time.deltaTime));
+ }
+
+ ///
+ /// 每帧主动扫周围的鱼(OverlapCircle)→ 命中走与 Trigger 完全相同的处理(同一条只报一次)。
+ /// 半径 = 自身碰撞体半径 + 本帧位移 + 额外余量,避免高速穿模漏检。
+ ///
+ private void DetectFishByOverlap()
+ {
+ float radius = _baseRadius + moveSpeed * Time.deltaTime + Mathf.Max(0f, overlapExtraRadius);
+ int n = Physics2D.OverlapCircleNonAlloc(transform.position, radius, _overlapBuf);
+ for (int i = 0; i < n; i++)
+ {
+ var c = _overlapBuf[i];
+ if (c == null) continue;
+ var fish = c.GetComponentInParent();
+ if (fish == null) continue;
+ ProcessFishHit(fish);
+ }
+ }
+
+ /// lua SpriteSpin:弹体 sprite 持续自转(2400°/s)
+ private void SpriteSpin()
+ {
+ if (_sprite == null || Mathf.Approximately(spriteSpinSpeed, 0f)) return;
+ _sprite.localRotation = Quaternion.AngleAxis(spriteSpinSpeed * Time.deltaTime, Vector3.forward)
+ * _sprite.localRotation;
+ }
+
+ // ================================================================ 碰撞
+ private void OnTriggerEnter2D(Collider2D other)
+ {
+ if (_finished) return;
+
+ if (debugLog && other != null)
+ {
+ Debug.Log($"[烈焰风暴火球弹] 收到 Trigger: {other.name} tag={other.tag} " +
+ $"layer={LayerMask.LayerToName(other.gameObject.layer)} 已反弹={_bounceCount}");
+ }
+
+ // —— 1. 撞墙:法线反弹 ——
+ if (IsWall(other))
+ {
+ if (_bounceCd > 0f) return; // 冷却中,忽略同一次碰撞的后续帧
+ // ⭐ 同一面墙的再次反弹冷却:子弹卡在墙角时会被连续计次,几下就打满反弹上限 → 子弹"无故消失"
+ if (_lastWall == other && Time.time - _lastWallTime < sameWallCooldown) return;
+
+ Bounce(other);
+ _bounceCd = bounceCooldown;
+ _lastWall = other;
+ _lastWallTime = Time.time;
+ if (refreshLifeOnBounce) _time = 0f; // 默认关:严格按 lifeTime 超时,行为可预测
+ _bounceCount++;
+ PlayBounceFeedback();
+
+ if (debugLog)
+ Debug.Log($"[烈焰风暴火球弹] 撞墙反弹 第{_bounceCount}/{bounceLimit} 次 → 新方向 {_heading}");
+
+ if (bounceLimit > 0 && _bounceCount >= bounceLimit)
+ {
+ Debug.Log($"[烈焰风暴火球弹] 反弹 {_bounceCount} 次达到上限 → 收尾爆炸");
+ Finish();
+ }
+ return;
+ }
+
+ // —— 2. 碰鱼:上报 + 穿透继续飞(同一条鱼只报一次)——
+ if (!IsFish(other)) return;
+ ProcessFishHit(other.GetComponentInParent());
+ }
+
+ ///
+ /// 命中一条鱼(Trigger、主动 Overlap、收尾爆炸范围杀鱼 共用):
+ /// 只处理「普通鱼」→ 同一条只报一次 → 命中特效 + 上报击杀 + OnHurt → **不回池、不销毁**(穿透继续飞)。
+ ///
+ /// 是否播命中特效(收尾爆炸时传 false,避免同点叠一堆)
+ private void ProcessFishHit(MonsterContral fish, bool spawnHitEffect = true)
+ {
+ // ⚠ 注意:收尾爆炸范围杀鱼是在 Finish() 里、且必须在 _finished 置 true **之前** 调用
+ if (_finished) return;
+ if (fish == null || fish.isDead) return;
+ if (fish.fishenum != FishTypeEnum.普通鱼) return; // ⭐ 只打小鱼(黄金鱼/特殊鱼/Boss 穿过)
+ if (!_hitFish.Add(fish.guid)) return; // ⭐ 同一条鱼只报一次
+
+ // 累计击杀分值(创建方没注入 jackpotScore 时的兜底显示值;口径与杀鱼一致:炮倍×鱼分)
+ if (fish.monsterData != null && fish.monsterData.fishTypeConfig != null)
+ _accumScore += (long)paoBei * fish.monsterData.fishTypeConfig.fishScore;
+
+ if (spawnHitEffect && hitEffectPrefab != null && EffectPool.Instance != null)
+ EffectPool.Instance.Get(hitEffectPrefab, transform.position, Quaternion.identity, transform.parent);
+
+ // ⭐ 杀鱼(对齐钻头蟹 SpecialBulletMove.ProcessHit → 创建方 KillSmallFish):
+ // 优先由创建方回调处理(本地帧同步 CreateFishManager.Id_DieFish_FX → 小鱼立刻死、全房间同步);
+ // 创建方没给回调时才退回内置 KillFish 上报(reportKill 默认 false,避免和服务端重复结算)
+ if (onHitFish != null)
+ {
+ onHitFish(fish);
+ }
+ else if (reportKill)
+ {
+ ReportKill(fish);
+ }
+
+ // 命中表现(lua:EnemyMgr.OnHit;只在这里调一次,ReportKill 里不再重复调)
+ fish.OnHurt();
+
+ // ⚠ 这里绝不能回池 / 不能销毁:lua 火球弹是穿透的(一发能连打多条鱼),
+ // 一旦这里消失 = 表现为"子弹碰到鱼就没了"
+ if (debugLog)
+ Debug.Log($"[烈焰风暴火球弹] 击杀 {fish.guid}(fishenum={fish.fishenum}) 命中特效={spawnHitEffect} " +
+ $"杀鱼={(onHitFish != null ? "创建方回调(帧同步)" : (reportKill ? "内置KillFish上报" : "⚠ 无任何杀鱼路径"))} " +
+ $"(本发已打第 {_hitFish.Count} 条,反弹 {_bounceCount}/{bounceLimit})");
+ }
+
+ private bool IsWall(Collider2D c)
+ {
+ if (c == null) return false;
+ if (c.CompareTag("Wall")) return true;
+ return wallLayer.value != 0 && ((1 << c.gameObject.layer) & wallLayer.value) != 0;
+ }
+
+ private bool IsFish(Collider2D c)
+ {
+ if (c == null) return false;
+ if (c.CompareTag("Fish")) return true;
+ return fishLayer.value != 0 && ((1 << c.gameObject.layer) & fishLayer.value) != 0;
+ }
+
+ ///
+ /// 法线反弹(照搬钻头 SpecialBulletMove.Bounce):
+ /// ClosestPoint 求近似法线 → Reflect;另处理 lua 的"正上/正下撞上下墙改斜角"特判;
+ /// 最后沿法线把弹体推回墙外,防止高速下一帧跨进墙内造成穿模/连触发。
+ ///
+ private void Bounce(Collider2D wall)
+ {
+ Vector3 worldPos = transform.position;
+ float keepZ = worldPos.z; // ⭐ 本项目子弹 z=-400(BullitMove.Init 设的),反弹后必须保留
+ Vector2 pos = worldPos;
+ Vector2 closest = wall.ClosestPoint(pos);
+ Vector2 normal = pos - closest;
+ if (normal.sqrMagnitude < 0.0001f)
+ normal = pos - (Vector2)wall.bounds.center;
+ if (normal.sqrMagnitude < 0.0001f) return;
+ normal.Normalize();
+
+ Vector2 reflected = Vector2.Reflect(_heading, normal);
+ if (reflected.sqrMagnitude < 0.0001f) return;
+ reflected.Normalize();
+
+ // lua 特判:撞的是上下墙(法线以 Y 为主)且当前是垂直飞行 → 改成 ±30° 斜弹
+ if (Mathf.Abs(normal.y) >= Mathf.Abs(normal.x))
+ {
+ float curAngle = Mathf.Atan2(_heading.y, _heading.x) * Mathf.Rad2Deg;
+ if (Mathf.Abs(Mathf.Abs(curAngle) - 90f) < 1f)
+ {
+ // lua:180 + (IsOuNumber(sourceUID) and 30 or -30) * flag,之后 flag 取反
+ // IsOuNumber = 偶数 → 偶数往 +30 偏,奇数往 -30 偏
+ float deflect = ((Mathf.Abs(sourceUID) % 2 == 0) ? verticalDeflectAngle : -verticalDeflectAngle) * _flag;
+ float target = curAngle + deflect;
+ reflected = new Vector2(Mathf.Cos(target * Mathf.Deg2Rad), Mathf.Sin(target * Mathf.Deg2Rad));
+ _flag = -_flag;
+ Debug.Log($"[烈焰风暴火球弹] 垂直撞上下墙 → 斜弹 {target:0.0}°(flag={_flag})");
+ }
+ }
+
+ SetHeading(reflected);
+
+ var selfCol = GetComponent();
+ float radius = selfCol != null
+ ? Mathf.Max(selfCol.bounds.extents.x, selfCol.bounds.extents.y)
+ : 0.5f;
+ float margin = moveSpeed * Time.deltaTime + 0.05f;
+ Vector2 pushed = closest + normal * (radius + margin);
+ transform.position = new Vector3(pushed.x, pushed.y, keepZ);
+ }
+
+ /// 设置前进方向:世界 Z 轴旋转叠在基准姿态上
+ private void SetHeading(Vector2 heading)
+ {
+ _heading = heading.sqrMagnitude < 0.0001f ? Vector2.up : heading.normalized;
+ float z = Mathf.Atan2(_heading.y, _heading.x) * Mathf.Rad2Deg - 90f;
+ transform.rotation = Quaternion.Euler(0f, 0f, z) * _baseRot;
+ }
+
+ /// lua:反弹时 isSelf → ShakeScreen(0.5) + 播 PW_FlameStrike_WheelFly(1 秒内只播一次)
+ private void PlayBounceFeedback()
+ {
+ if (!bounceFeedback || !isSelf) return;
+
+ if (GameManager.Instance != null && GameManager.Instance.cameraShake != null)
+ GameManager.Instance.cameraShake.ShakePresets.ShortShake2D(
+ bounceShakeStrength, bounceShakeStrength, 25f, 4);
+
+ if (Time.unscaledTime - _lastBounceSoundTime >= bounceSoundInterval)
+ {
+ AudioManager.Instance.PlayerFXByName("PW_FlameStrike_WheelFly");
+ _lastBounceSoundTime = Time.unscaledTime;
+ }
+ }
+
+ // ================================================================ 击杀上报
+ ///
+ /// 上报命中(与普通子弹 BullitMove.AttackFish 完全同一套协议):
+ /// 只有击杀者本机才发 KillFish;机器人由房主代发。
+ ///
+ private void ReportKill(MonsterContral fish)
+ {
+ if (!reportKill || fish == null || fish.isDead) return;
+
+ var gm = GameManager.Instance;
+ if (gm == null) return;
+
+ string selfId = gm.user != null ? gm.user.id : null;
+ int paoBeiInt = paoBei > 0 ? paoBei : 1;
+ string fishNumber = fish.monsterData != null && fish.monsterData.fishTypeConfig != null
+ ? fish.monsterData.fishTypeConfig.fishNumber
+ : null;
+
+ bool sent = false;
+ if (!string.IsNullOrEmpty(killerUserId) && killerUserId == selfId)
+ {
+ // 真人玩家击杀:击杀者本机上报(包括火球弹替击杀者继续收鱼)
+ var room = gm.gameData != null ? gm.gameData.currRoomData : null;
+ if (room != null)
+ {
+ WebSocketSendList.KillFish(room.roomId, killerUserId, fishNumber, fish.guid,
+ paoBeiInt, bulletId, "63215f0afa3f5b25");
+ sent = true;
+ }
+ }
+ else if (!string.IsNullOrEmpty(killerUserId) && killerUserId.StartsWith("bot_")
+ && SitPosData.roomOwnerSit != null && SitPosData.roomOwnerSit.user == selfId)
+ {
+ // 机器人击杀:只有房主客户端代发
+ var room = gm.gameData != null ? gm.gameData.currRoomData : null;
+ if (room != null)
+ {
+ WebSocketSendList.BotKillFish(room.roomId, killerUserId, fishNumber, fish.guid,
+ paoBeiInt, bulletId);
+ sent = true;
+ }
+ }
+
+ // 注意:命中表现 fish.OnHurt() 由 ProcessFishHit 统一调用,这里不再重复调
+ if (sent)
+ Debug.Log($"[烈焰风暴火球弹] 上报击杀 fish={fish.guid} fishNumber={fishNumber} 炮倍={paoBeiInt} 子弹={bulletId}");
+ }
+
+ // ================================================================ 收尾
+ ///
+ /// lua Disappear():先炸一圈小鱼 → PW_FlameStrike_WheelExplosion 音效 + sprite 隐藏 + 切 Explosion 特效
+ /// → 停留 explosionHoldTime → 回收(默认 Destroy)。
+ /// ⭐ 收尾触发点只有两处:反弹次数打满 / lifeTime 兜底超时 —— 日志里会带调用栈,方便排查
+ /// "子弹为什么消失"(碰鱼是**绝不**收尾的)。
+ ///
+ private void Finish()
+ {
+ if (_finished) return;
+
+ if (debugLog)
+ Debug.Log($"[烈焰风暴火球弹] 进入收尾:已飞 {_time:0.00}/{lifeTime}s、反弹 {_bounceCount}/{bounceLimit}、" +
+ $"已杀 {_hitFish.Count} 条、pos={transform.position}\n调用来源:{new System.Diagnostics.StackTrace(true)}");
+
+ // ⭐ ① 收尾爆炸先炸一圈小鱼(对齐钻头蟹 SpecialBulletMove.Explode):
+ // 必须在 _finished 置 true 之前调用 —— ProcessFishHit 开头会检查 _finished
+ KillFishInExplosionRange();
+
+ _finished = true;
+ _heading = Vector2.zero;
+
+ if (isSelf) AudioManager.Instance.PlayerFXByName("PW_FlameStrike_WheelExplosion");
+
+ if (_sprite != null) _sprite.gameObject.SetActive(false);
+ ShowExplosion(true);
+
+ // ② 爆炸特效播完后(Release)回收;Release 里会回调 onFinished 交给创建方(Boss 统计)
+ if (explosionHoldTime <= 0f)
+ {
+ Release();
+ return;
+ }
+ _releaseTween = DOVirtual.DelayedCall(explosionHoldTime, Release);
+ }
+
+ // ================================================================ 收尾爆炸范围杀鱼
+ ///
+ /// 收尾爆炸炸一圈小鱼(对齐钻头蟹 SpecialBulletMove.Explode):
+ /// 以爆炸点为中心 OverlapCircle 扫普通鱼 → 复用 ProcessFishHit(同一条鱼只算一次、累计分值、上报击杀)。
+ /// ⭐ 必须在 Finish() 里、_finished 置 true 之前调用。
+ ///
+ private void KillFishInExplosionRange()
+ {
+ if (!killFishOnFinal || explosionRadius <= 0f) return;
+
+ int n = Physics2D.OverlapCircleNonAlloc(transform.position, explosionRadius, _overlapBuf);
+ int killed = 0;
+ for (int i = 0; i < n; i++)
+ {
+ var c = _overlapBuf[i];
+ if (c == null) continue;
+ var fish = c.GetComponentInParent();
+ if (fish == null || fish.isDead) continue;
+ if (fish.fishenum != FishTypeEnum.普通鱼) continue;
+ if (_hitFish.Contains(fish.guid)) continue; // 已经打过的跳过(ProcessFishHit 也会拦,这里提前省一点)
+ ProcessFishHit(fish, explosionSpawnHitEffect);
+ killed++;
+ }
+
+ if (debugLog)
+ Debug.Log($"[烈焰风暴火球弹] 收尾爆炸范围杀鱼:半径={explosionRadius} 扫到={n} 新杀={killed}");
+ }
+
+ // ================================================================ 收尾爆奖
+ ///
+ /// 收尾爆奖:在击杀者座位上方生成 BJEndUI 结算面板。
+ /// score:jackpotScore >= 0 用注入值(建议 Boss 从后端 gold 注入);否则用本发累计击杀分值(die_Score) 兜底。
+ /// beishu:jackpotBeishu > 0 用之;否则用炮倍 paoBei。
+ /// isMine:直接用 isSelf(自己击杀=金币样式,他人=银币样式)。
+ /// ⭐ 面板是独立 GameObject(挂在座位/bjEffectRoot 下,自带 autoDestroyDelay),子弹回收(Destroy)不影响它。
+ ///
+ private void SpawnJackpot()
+ {
+ if (bjEndUIPrefab == null)
+ {
+ if (debugLog) Debug.Log("[烈焰风暴火球弹] 收尾爆奖跳过:bjEndUIPrefab 未赋值");
+ return;
+ }
+
+ long score = jackpotScore >= 0 ? jackpotScore : _accumScore;
+ int beishu = jackpotBeishu > 0 ? jackpotBeishu : (paoBei > 0 ? paoBei : 1);
+
+ // 定位:击杀者座位上方(与其它爆奖一致);找不到座位回退到子弹当前位置
+ Vector3 uiPos = GetKillerSeatPosition() + Vector3.up * bjEndUIOffsetY;
+
+ var endUI = Instantiate(bjEndUIPrefab, uiPos, Quaternion.identity, GetKillerSeatParent());
+ var bj = endUI.GetComponent();
+ if (bj != null)
+ {
+ bj.Init(beishu, score, isSelf);
+ if (debugLog)
+ Debug.Log($"[烈焰风暴火球弹] 收尾爆奖 BJEndUI:score={score} beishu={beishu} isSelf={isSelf} pos={uiPos}");
+ }
+ else
+ {
+ Debug.LogWarning("[烈焰风暴火球弹] bjEndUIPrefab 上找不到 BJEndUI 组件");
+ }
+ }
+
+ /// 击杀者座位世界坐标(找不到回退子弹当前位置)
+ private Vector3 GetKillerSeatPosition()
+ {
+ var seat = GetKillerSeat();
+ return seat != null ? seat.position : transform.position;
+ }
+
+ /// 击杀者座位的 Transform(作为 BJEndUI 父物体,与其它爆奖一致);
+ /// 找不到回退 bjEffectRoot;都没有则 null(挂世界根)
+ private Transform GetKillerSeatParent()
+ {
+ var seat = GetKillerSeat();
+ if (seat != null) return seat;
+ return CreateFishManager.Instance != null ? CreateFishManager.Instance.bjEffectRoot : null;
+ }
+
+ /// 按 killerUserId 在座位列表里找击杀者座位
+ private Transform GetKillerSeat()
+ {
+ if (string.IsNullOrEmpty(killerUserId)) return null;
+ var mgr = CreateFishManager.Instance;
+ if (mgr == null || mgr.currGameType == null || mgr.currGameType.list_Sits == null) return null;
+ var sit = mgr.currGameType.list_Sits.Find(s => s.user == killerUserId);
+ return sit != null ? sit.transform : null;
+ }
+
+ /// 回收:默认自管理(Destroy),不还给 BulletPool
+ private void Release()
+ {
+ _releaseTween = null;
+ if (this == null) return;
+
+ // ⭐ 先通知创建方(Boss 靠这个统计"所有火球弹是否都已收尾"→ 全部结束才统一出**一次**爆奖面板)
+ onFinished?.Invoke();
+ onFinished = null;
+
+ // 兜底:没接回调、且显式打开开关时,才由本发子弹自己出面板(默认关,避免 4 发叠 4 个面板)
+ if (spawnJackpotOnFinish) SpawnJackpot();
+
+ // ⭐ 默认直接销毁,不走 BulletPool:火球弹不属于任何座位(userid=null),
+ // 一旦进了池的"活跃子弹"表,换炮台时的 BulletPool.ClearActive() 会把正在飞的
+ // 火球弹一并 Destroy —— 那正是"子弹凭空消失"的经典来源。自管理后与池彻底解耦。
+ if (selfManaged || BulletPool.Instance == null)
+ Destroy(gameObject);
+ else
+ BulletPool.Instance.Return(gameObject);
+ }
+
+ private void KillReleaseTween()
+ {
+ if (_releaseTween != null && _releaseTween.IsActive()) _releaseTween.Kill();
+ _releaseTween = null;
+ }
+
+ // ================================================================ 节点
+ private void ResolveNodes()
+ {
+ _sprite = FindDeep(transform, spriteNodeName);
+ _glow = FindDeepGo(transform, glowNodeName);
+ _explosion = FindDeepGo(transform, explosionNodeName);
+
+ if (_sprite == null)
+ Debug.LogWarning($"[烈焰风暴火球弹] 找不到 sprite 节点「{spriteNodeName}」,自转跳过");
+ if (_glow == null && _explosion == null)
+ Debug.LogWarning("[烈焰风暴火球弹] 找不到 Glow/Explosion 节点,收尾特效切换跳过");
+ }
+
+ /// 飞行中:Glow 亮、Explosion 灭;收尾:反过来
+ private void ShowExplosion(bool exploded)
+ {
+ if (_glow != null) _glow.SetActive(!exploded);
+ if (_explosion != null) _explosion.SetActive(exploded);
+ }
+
+ private static Transform FindDeep(Transform root, string name)
+ {
+ if (root == null || string.IsNullOrEmpty(name)) return null;
+ if (string.Equals(root.name, name, StringComparison.OrdinalIgnoreCase)) return root;
+ for (int i = 0; i < root.childCount; i++)
+ {
+ var r = FindDeep(root.GetChild(i), name);
+ if (r != null) return r;
+ }
+ return null;
+ }
+
+ private static GameObject FindDeepGo(Transform root, string name)
+ {
+ var t = FindDeep(root, name);
+ return t != null ? t.gameObject : null;
+ }
+}
diff --git a/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/FlameRoundBullet.cs.meta b/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/FlameRoundBullet.cs.meta
new file mode 100644
index 000000000..cb3e66117
--- /dev/null
+++ b/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/FlameRoundBullet.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2c9eb962ba40af747b61e31a7adce76e
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/LieYanFengBaoEvent.cs b/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/LieYanFengBaoEvent.cs
index 15e26b0f3..6dcef6939 100644
--- a/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/LieYanFengBaoEvent.cs
+++ b/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/LieYanFengBaoEvent.cs
@@ -6,13 +6,18 @@ using UnityEngine;
/// 烈焰风暴 Boss 爆奖事件(精简版)。
///
/// 无死鱼、无红包、无滚分,流程只有:
-/// 炸一下(播放爆炸特效,不死任何鱼)→ 等特效播完 → 显示 bjEndUI + 回加金币 → 回收。
-/// 死亡/未死亡由 Boss 解析服务端 param 决定,Event 不关心。
+/// 炸一下(播放爆炸特效,不死任何鱼)→ [等火球弹打完] → 显示 bjEndUI + 回加金币 → 回收。
+///
+/// ⭐ 两种结算时机(deferSettle):
+/// · false(默认):爆炸播完**立刻** JiaFen + 出面板 —— 未死亡 / 被免费子弹打死(不发火球弹)走这条。
+/// · true:只播爆炸、不回池也不结算,等 Boss 侧所有火球弹都收尾爆炸完成后调
+/// —— 对齐钻头蟹 ZuanTouXie_DieEvent 的 "钻头跑完 → ShowEndUI"。
+/// 死亡 + 会发火球弹时由 打开。
///
public class LieYanFengBaoEvent : BJRedPacketEvent
{
[Header("爆炸配置")]
- [Tooltip("爆炸特效播放时长(播完后显示 bjEndUI)")]
+ [Tooltip("爆炸特效播放时长(非延迟结算时,播完后回池)")]
public float explosionDuration = 2f;
/// 爆炸中心(世界坐标,由 Boss 传入=死亡位置)
@@ -23,11 +28,21 @@ public class LieYanFengBaoEvent : BJRedPacketEvent
[System.NonSerialized]
public LieYanFengBao_BOSS bossCtrl;
+ ///
+ /// ⭐ 延迟结算开关:true 时不在爆炸后立刻结算,等 Boss 调 。
+ /// ⚠ 由 Boss 在 InitAwardEffect 里**显式**赋值(true/false 都赋),避免池化复用时残留上一轮的值。
+ ///
+ [System.NonSerialized]
+ public bool deferSettle = false;
+
+ private bool _settled; // 已结算(防重入)
+
public override void Init(long goldCount, int posID, long paobei, long fishScore, int beishu,
Action action, Action action1 = null)
{
// 不需要分数面板/滚分/红包,纯特效 + bjEndUI
useScorePanel = false;
+ _settled = false;
base.Init(goldCount, posID, paobei, fishScore, beishu, action, action1);
// ApplySeatOffset 已重写为空;恢复到死亡位置
transform.position = explosionCenter;
@@ -40,7 +55,7 @@ public class LieYanFengBaoEvent : BJRedPacketEvent
GetSeatPosition();
}
- /// 炸一下 + 立即显示 bjEndUI;爆炸特效后台自己播,播完后静默回池
+ /// 炸一下;延迟结算时停在"已爆炸、等通知",否则直接结算
private IEnumerator PlayExplosionThenEnd()
{
// 音效:爆炸(PW_Explosion)
@@ -49,11 +64,31 @@ public class LieYanFengBaoEvent : BJRedPacketEvent
// 重播粒子/动画(对象池复用后需手动重播)
ReplayExplosionEffect();
- // ===== 无延迟立即执行 =====
- // 回加金币
+ if (deferSettle)
+ {
+ // ⭐ 火球弹还在飞:不结算、不回池(回池会 SetActive(false),爆炸就看不到了),
+ // 由 Boss 在"所有火球弹收尾爆炸完成"后调 SettleNow()
+ Debug.Log("[LieYanFengBaoEvent] 爆炸已播放,等待火球弹全部收尾后再结算最终面板");
+ yield break;
+ }
+
+ // 未延迟(未死亡 / 免费子弹):爆炸即结算
+ SettleNow();
+ }
+
+ ///
+ /// 结算:回加金币 → 显示 bjEndUI(座位上方)→ 通知 Boss → 停留后回池。
+ /// 由 (立即)或 Boss(等火球弹打完)调用,内部防重入。
+ ///
+ public void SettleNow()
+ {
+ if (_settled) return;
+ _settled = true;
+
+ // ===== 回加金币 =====
JiaFen?.Invoke();
- // 显示 bjEndUI(座位上方)
+ // ===== 显示 bjEndUI(座位上方)=====
if (bjEndUI != null)
{
float y = bjEndUIOffsetY;
@@ -61,18 +96,29 @@ public class LieYanFengBaoEvent : BJRedPacketEvent
Vector3 uiPos = GetSeatPosition() + Vector3.up * y;
var endUI = Instantiate(bjEndUI, uiPos, Quaternion.identity, GetBJEndUIParent());
endUI.Init(bJbeishu, maxScore, isSelf);
+ Debug.Log($"[LieYanFengBaoEvent] 最终爆奖面板已显示:倍率={bJbeishu} 分数={maxScore} isSelf={isSelf} pos={uiPos}");
+ }
+ else
+ {
+ Debug.LogWarning("[LieYanFengBaoEvent] bjEndUI 未赋值,最终爆奖面板跳过");
}
- // 通知 Boss 爆奖结束(非死亡时恢复游动)
+ // ===== 通知 Boss 爆奖结束(非死亡时恢复游动;此时 Boss 通常已销毁,假 null 会被拦掉)=====
if (bossCtrl != null)
{
bossCtrl.OnAwardFinished();
bossCtrl = null;
}
- // 爆炸特效播完后才回池(Return 会 SetActive(false),立即回池爆炸就看不到了)
- yield return new WaitForSeconds(explosionDuration);
- EffectPool.Instance.Return(gameObject);
+ // 延迟结算时爆炸早就播完了,这里只留一小段给面板淡入,然后回池
+ StartCoroutine(ReturnAfterDelay(explosionDuration));
+ }
+
+ /// 停留 delay 秒后回池(Return 会 SetActive(false),所以必须等表现播完)
+ private IEnumerator ReturnAfterDelay(float delay)
+ {
+ if (delay > 0f) yield return new WaitForSeconds(delay);
+ if (EffectPool.Instance != null) EffectPool.Instance.Return(gameObject);
}
/// 重播爆炸特效(粒子 + Animator)
diff --git a/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/LieYanFengBao_BOSS.cs b/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/LieYanFengBao_BOSS.cs
index 1630a5677..bcb800f49 100644
--- a/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/LieYanFengBao_BOSS.cs
+++ b/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/LieYanFengBao_BOSS.cs
@@ -1,3 +1,4 @@
+using Assets.MyGame.Scripts.Net.APIResponses.Enum;
using Assets.MyGame.Scripts.Net.WebResponses;
using Newtonsoft.Json.Linq;
using Spine.Unity;
@@ -41,10 +42,47 @@ public class LieYanFengBao_BOSS : MonsterControl_BossBase
public GameObject flameRoundBulletPrefab;
[Tooltip("火球弹飞行速度(lua speed=30,按本项目世界比例可调)")]
public float flameRoundSpeed = 30f;
- [Tooltip("火球弹存活时长(秒,兜底回收,防飞出屏外不回收)")]
- public float flameRoundLifeTime = 4f;
+ [Tooltip("火球弹存活时长(秒):到点还没被反弹上限收尾就强制爆炸。\n" +
+ "⭐ 速度 30 → 8 秒 = 飞约 240 单位(屏幕对角线约 25~28 单位),正常会被下面的反弹次数先收尾。\n" +
+ " 想让子弹飞更久/更短就调这里(钻头蟹的兜底是 12s)。设 0 = 不限时,只靠反弹次数收尾")]
+ public float flameRoundLifeTime = 8f;
[Tooltip("param 里没有 flameInfo 时的默认发射数量(最多 = Wheel 子节点数)")]
public int flameRoundFallbackCount = 4;
+ [Tooltip("火球弹撞墙反弹次数上限,到达后原地爆炸回收(<=0 表示不限次数)。\n" +
+ "⭐ 每撞一次墙算 1 次,屏幕对角线约 25~28 单位、一屏横穿约 0.8s → 4 次大约 2~3.5 秒收尾。\n" +
+ " (钻头蟹是 7+5=12 次三段式;火球弹是单一阶段,建议 3~5)")]
+ public int flameRoundBounceLimit = 4;
+ [Tooltip("火球弹反弹时的震屏强度(仅自己击杀视角,lua ShakeScreen(0.5))")]
+ public float flameRoundBounceShake = 0.5f;
+ [Tooltip("火球弹命中特效(可拖 Art/XJMH/pw/pw_prefab/game/effect/PW_Effect_Hit_Prop6.prefab,留空则不出)")]
+ public GameObject flameRoundHitEffectPrefab;
+
+ [Header("火球弹收尾爆炸(炸一圈小鱼)")]
+ [Tooltip("火球弹收尾爆炸的杀鱼半径(世界单位,对齐钻头蟹 explosionRadius)")]
+ public float flameRoundExplosionRadius = 3f;
+ [Tooltip("火球弹收尾爆炸是否炸死范围小鱼(对齐钻头蟹 killFishOnFinal)")]
+ public bool flameRoundKillFishOnFinal = true;
+
+ [Header("火球弹爆奖(收尾 BJEndUI)")]
+ [Tooltip("BJEndUI 结算面板预制体(**兜底**用:爆奖事件取不到 bjEndUI 时,Boss 直接用它出最终面板)")]
+ public GameObject flameRoundBJEndUIPrefab;
+ [Tooltip("注入给火球弹的爆奖总分(<0 表示让子弹用累计击杀分值兜底)。建议从后端 gold 注入")]
+ public long flameRoundJackpotScore = -1;
+ [Tooltip("注入给火球弹的爆奖倍率(<=0 用子弹自身炮倍 paoBei)")]
+ public int flameRoundJackpotBeishu = 0;
+ [Tooltip("⭐ 等**所有**火球弹(含各自的收尾爆炸)都跑完,才显示最终爆奖面板。\n" +
+ "对齐钻头蟹:钻头跑完 → ShowEndUI(加分 + BJEndUI)。\n" +
+ "关掉 = 沿用旧行为(Boss 一死就把面板弹出来,火球弹还在飞)")]
+ public bool flameRoundDeferSettle = true;
+ [Tooltip("火球弹相关详细日志(发射/杀鱼/收尾/结算)")]
+ public bool flameRoundDebugLog = true;
+ [Tooltip("⭐ 火球弹杀鱼方式(默认开 = 钻头蟹 / 激光蟹 的既有做法):\n" +
+ "开(默认):本地帧同步 CreateFishManager.Id_DieFish_FX —— 小鱼**立刻**死 + 死亡特效 + 金币飞向击杀者炮台;\n" +
+ " 与 ZuanTouXie_DieEvent.KillSmallFish / JiGuangXie_DieEvent(SpecialLaserMove.onHitFish) 完全同款。\n" +
+ "关:改为只发 KillFish 服务端上报。\n" +
+ " ⚠ 火球弹不是服务端开火(FireCannon)产生的,bulletId 是客户端自造的 → 服务端大概率不认这条击杀,\n" +
+ " 表现就是\"碰到小鱼但鱼不炸\"。除非服务端专门支持 FlameRound,否则别关。")]
+ public bool flameRoundUseLocalInstantKill = true;
[Header("时序(对齐 lua 硬编码值)")]
[Tooltip("爆炸特效 → 播爆奖的延迟(lua 0.3s)")]
@@ -78,6 +116,17 @@ public class LieYanFengBao_BOSS : MonsterControl_BossBase
private SkeletonAnimation _spine; // 预制体 skeleton 字段为空 → 运行时自动解析
private readonly GameObject[] _effects = new GameObject[3];
private Transform _wheel; // 轮盘(火球弹发射点父节点)
+
+ // 火球弹的击杀归属(死亡时的 Boss 击杀者):谁打死 Boss,火球弹收的鱼就记在谁头上
+ private string _killerUserId;
+ private int _killerPaoBei = 1;
+ private bool _killerIsSelf;
+
+ // 火球弹收尾统计(对齐钻头蟹:所有子弹都炸完 → 才显示最终爆奖面板)
+ private int _flameRoundsAlive; // 还在飞的火球弹数量
+ private int _flameRoundRound; // 齐射轮次(子弹回调按轮次校验,防 Boss 回收复用后误触发)
+ private LieYanFengBaoEvent _deferSettleEvent; // 等"火球弹全部结束"再结算的爆奖事件
+ private bool _flameSettled; // 本次爆奖已结算(防重入)
private Coroutine _flowRoutine; // 表现流程协程(死亡/未死亡共用)
public override void OnEnable()
@@ -169,6 +218,11 @@ public class LieYanFengBao_BOSS : MonsterControl_BossBase
{
_deathCount++;
+ // 每次击杀重置火球弹/结算状态(对齐钻头蟹:一轮子弹一轮结算)
+ _flameRoundsAlive = 0;
+ _flameSettled = false;
+ _deferSettleEvent = null;
+
// ===== 解析服务端 param:animId 优先于 isKill =====
bool isKill;
int beishu;
@@ -208,6 +262,11 @@ public class LieYanFengBao_BOSS : MonsterControl_BossBase
bool isSelfKill = obj != null && GameManager.Instance != null && obj.userId == GameManager.Instance.user.id;
+ // ⭐ 火球弹的击杀归属:Boss 击杀者(谁打死的 Boss,之后火球弹收的鱼就记在谁头上)
+ _killerUserId = obj != null ? obj.userId : null;
+ _killerIsSelf = isSelfKill;
+ _killerPaoBei = ResolvePaoBei(_killerUserId);
+
if (isKill)
{
// ===== 死亡:死亡动画 + 死亡特效 + 音效 → 延迟生成火球弹 → 回收本体 =====
@@ -286,6 +345,14 @@ public class LieYanFengBao_BOSS : MonsterControl_BossBase
? dieToFlameRoundDelay - explosionToRewardDelay
: 0f);
SpawnFlameRounds(param);
+
+ // ⭐ 兜底:延迟结算已挂上、但一发火球弹都没发出去(预制体/节点缺失等异常)→ 立刻结算,
+ // 否则爆奖事件会一直等下去,既不结算也不回池(面板永远不出现)
+ if (_deferSettleEvent != null && _flameRoundsAlive <= 0)
+ {
+ Debug.LogWarning("[LieYanFengBao] 没有火球弹在飞 → 立即结算最终爆奖(避免面板不出)");
+ SettleFinalJackpot();
+ }
}
_flowRoutine = null;
@@ -325,6 +392,16 @@ public class LieYanFengBao_BOSS : MonsterControl_BossBase
? CreateFishManager.Instance.bjEffectRoot
: null;
+ // 本次齐射统计(全部收尾后才结算最终爆奖)
+ _flameRoundsAlive = 0;
+ _flameSettled = false;
+ _flameRoundRound++; // 轮次 +1:上一轮遗留的子弹回调会被轮次校验忽略
+ int round = _flameRoundRound;
+ // 归属快照:子弹可能活到 Boss 被回收/复用之后,闭包里用快照而不是实时字段
+ string killerId = _killerUserId;
+ int paoBeiSnap = _killerPaoBei;
+ bool isSelfKill = _killerIsSelf;
+
for (int i = 0; i < count; i++)
{
Transform point = _wheel.GetChild(i);
@@ -335,29 +412,192 @@ public class LieYanFengBao_BOSS : MonsterControl_BossBase
Vector3 dir = spawnPos - transform.position;
float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
- // BullitMove 的飞行方向是 transform.up → 角度要 -90° 才是 Z 旋转
- var bulletGo = BulletPool.Instance.Get(flameRoundBulletPrefab, spawnPos,
+ // ⭐ 用 Instantiate 而非 BulletPool:火球弹不属于任何座位(userid 为空),
+ // 一旦进了子弹池的"活跃子弹"表,换炮台时的 BulletPool.ClearActive() 会把正在飞的
+ // 火球弹一起 Destroy(表现为"子弹凭空消失")。自管理(FlameRoundBullet 里 Destroy)更稳。
+ var bulletGo = Instantiate(flameRoundBulletPrefab, spawnPos,
Quaternion.Euler(0f, 0f, angle - 90f), bulletParent);
if (bulletGo == null) continue;
bulletGo.name = $"FlameRound_{guid}_{i}";
- var bullet = bulletGo.GetComponent();
- if (bullet != null)
+ // ⭐ 关掉通用子弹脚本(它的反弹靠碰撞体名字匹配、碰鱼就回池),改用钻头那套 FlameRoundBullet:
+ // 法线反弹 + 碰鱼穿透继续飞 + 反弹次数到顶后原地爆炸回收
+ var bullit = bulletGo.GetComponent();
+ if (bullit != null)
{
- bullet.Init(); // ⭐ 池化复用必须重新对齐起点
- bullet.moveSpeed = flameRoundSpeed;
- bullet.desTime = flameRoundLifeTime;
- bullet.userid = null;
- bullet.playerID = null;
- bullet.bulletID = bulletGo.name;
- Debug.Log($"[LieYanFengBao] 火球弹[{i}] 发射 从{spawnPos} 角度={angle:0.0}(sourceUID={(uidList != null && i < uidList.Count ? uidList[i].ToString() : "-")})");
- }
- else
- {
- Debug.LogWarning($"[LieYanFengBao] 火球弹预制体上没有 BullitMove,无法控制飞行");
+ // 先借它自己那套初始化:对齐 z=-400 的渲染深度 + 重新应用 sortingOrder(池化复用必需)
+ bullit.moveSpeed = flameRoundSpeed;
+ bullit.desTime = flameRoundLifeTime;
+ bullit.bulletID = bulletGo.name;
+ bullit.Init();
+ // ⭐ 双保险:enabled=false 挡掉它的所有 Unity 回调;
+ // isTriggerFirst=false 再挡一层(BullitMove 的碰撞分支整段包在 if (isTriggerFirst) 里,
+ // 这样即使它被重新启用,也不会碰鱼就 BulletPool.Return)
+ bullit.enabled = false;
+ bullit.isTriggerFirst = false;
}
+
+ var flame = bulletGo.GetComponent();
+ if (flame == null) flame = bulletGo.AddComponent();
+ flame.enabled = true;
+ flame.moveSpeed = flameRoundSpeed;
+ flame.lifeTime = flameRoundLifeTime;
+ flame.bounceLimit = flameRoundBounceLimit;
+ flame.bounceShakeStrength = flameRoundBounceShake;
+ flame.hitEffectPrefab = flameRoundHitEffectPrefab;
+ flame.explosionRadius = flameRoundExplosionRadius;
+ flame.killFishOnFinal = flameRoundKillFishOnFinal;
+ flame.bjEndUIPrefab = flameRoundBJEndUIPrefab;
+ flame.jackpotScore = flameRoundJackpotScore;
+ flame.jackpotBeishu = flameRoundJackpotBeishu;
+ flame.killerUserId = _killerUserId;
+ flame.paoBei = _killerPaoBei;
+ flame.isSelf = _killerIsSelf;
+ flame.bulletId = bulletGo.name;
+ flame.sourceUID = (uidList != null && i < uidList.Count) ? uidList[i].Value() : (i + 1);
+
+ // ⭐ 火球弹杀鱼(默认 = 钻头蟹/激光蟹同款:本地帧同步 Id_DieFish_FX,碰到小鱼立刻炸)
+ // · flameRoundUseLocalInstantKill = true(默认):Id_DieFish_FX → 小鱼立刻死 + 金币飞。
+ // 与 ZuanTouXie_DieEvent.KillSmallFish、JiGuangXie_DieEvent 的注入方式完全一致
+ // (`if (isKiller) onHitFish = KillSmallFish` / `isKiller ? KillSmallFish : null`)。
+ // · = false:只发 KillFish 服务端上报。⚠ 火球弹不是服务端开火产生的子弹,
+ // bulletId 为客户端自造 → 服务端不认 → 表现就是"碰到小鱼但鱼不炸"(别再关)。
+ // ⚠ 用闭包快照(killerId/paoBei/isSelf/round):子弹寿命可能长于 Boss(Boss 被回收复用后
+ // 字段会被新击杀覆盖),快照保证归属正确;round 保证上一轮遗留回调不误触发结算。
+ flame.onHitFish = (flameRoundUseLocalInstantKill && isSelfKill)
+ ? (Action)(f => KillSmallFishByFlameRound(f, killerId, paoBeiSnap, isSelfKill, round))
+ : null;
+ // 两种方式互斥:本地已经杀掉鱼并移除字典,若再上报会让本端被服务端回包"跳过"(白白多一次无效请求)
+ flame.reportKill = !flameRoundUseLocalInstantKill;
+ // ⭐ 收尾回调:Boss 统计"所有火球弹都收尾了没",全部结束才统一出**一次**最终爆奖面板
+ flame.onFinished = () => OnOneFlameRoundFinished(round);
+ flame.spawnJackpotOnFinish = false;
+
+ _flameRoundsAlive++;
+
+ // 出膛方向 = 已摆好的朝向(transform.up 就是 (cos angle, sin angle))
+ flame.Init(bulletGo.transform.up);
+
+ Debug.Log($"[LieYanFengBao] 火球弹[{i}] 发射 从{spawnPos} 角度={angle:0.0} " +
+ $"sourceUID={flame.sourceUID} 击杀者={_killerUserId} 炮倍={_killerPaoBei} " +
+ $"杀鱼回调={(_killerIsSelf ? "本地帧同步(击杀者端)" : "无(非击杀者端)")} " +
+ $"|BullitMove={(bullit == null ? "无" : (bullit.enabled ? "仍开着!" : "已关"))} " +
+ $"FlameRoundBullet=已挂");
}
+
+ Debug.Log($"[LieYanFengBao] 火球弹齐射完成:{_flameRoundsAlive} 发在飞,全部收尾后才显示最终爆奖面板");
+
+ // 兜底:一发都没发出去(预制体/节点异常)→ 直接结算,避免爆奖卡住不出面板
+ if (_flameRoundsAlive == 0) SettleFinalJackpot();
+ }
+
+ ///
+ /// 火球弹本地帧同步杀小鱼(与钻头蟹 ZuanTouXie_DieEvent.KillSmallFish、
+ /// 激光蟹 JiGuangXie_DieEvent → SpecialLaserMove.onHitFish 完全同款):
+ /// 金币 = 击杀者炮倍 × 鱼分,走 CreateFishManager.Id_DieFish_FX → 小鱼**立刻**死 +
+ /// 死亡特效 + 金币飞向击杀者炮台。
+ ///
+ /// 为什么必须走本地(而不是 KillFish 服务端上报):
+ /// 火球弹不是服务端 FireCannon 产生的子弹、bulletId 是客户端自造的,服务端不认这条击杀 →
+ /// 上报路径表现为"碰到小鱼但鱼不炸"。钻头/激光在本项目里就是本地帧同步这条路。
+ /// ⭐ 只有击杀者端会注册成 onHitFish 回调(与钻头 `if (isKiller)`、激光 `isKiller ? KillSmallFish : null` 一致)。
+ /// ⚠ 归属参数由子弹创建时**快照**传入(子弹寿命 20s 可能长于 Boss 对象生命周期)。
+ ///
+ private void KillSmallFishByFlameRound(MonsterContral fish, string killerId, int paoBei, bool isSelfKill, int round)
+ {
+ if (round != _flameRoundRound) return; // 上一轮齐射的遗留回调,忽略
+ if (fish == null || fish.isDead) return;
+ if (fish.fishenum != FishTypeEnum.普通鱼) return; // 只杀小鱼(黄金鱼/特殊鱼/Boss 穿过)
+ if (CreateFishManager.Instance == null) return;
+
+ SitPosData sit = FindSitByUser(killerId);
+ if (sit == null)
+ {
+ Debug.LogWarning($"[LieYanFengBao] 火球弹杀鱼找不到击杀者座位({killerId}),跳过本次击杀");
+ return;
+ }
+
+ // 金币飞向点:炮台世界坐标(与普通杀鱼/钻头一致)
+ Vector3 flyTo = sit.currentTurret != null
+ ? (Vector3)sit.currentTurret.GetBulletStartWorldPos()
+ : sit.turretWorldPos;
+
+ long amount = (long)paoBei *
+ (fish.monsterData != null && fish.monsterData.fishTypeConfig != null
+ ? fish.monsterData.fishTypeConfig.fishScore
+ : 0);
+
+ CreateFishManager.Instance.Id_DieFish_FX(
+ fish.guid,
+ new RedPacketRecord { Amount = amount },
+ flyTo,
+ isSelfKill);
+
+ if (flameRoundDebugLog)
+ Debug.Log($"[LieYanFengBao] 火球弹杀小鱼 {fish.guid} 金币={amount}(炮倍{paoBei}×鱼分) 飞向={flyTo}");
+ }
+
+ /// 一发火球弹收尾完成(含它的收尾爆炸炸鱼);全部结束 → 统一结算最终爆奖
+ private void OnOneFlameRoundFinished(int round)
+ {
+ if (round != _flameRoundRound) return; // 过期轮次,忽略(防 Boss 回收复用后误触发结算)
+
+ _flameRoundsAlive--;
+ Debug.Log($"[LieYanFengBao] 一发火球弹收尾完成,剩余 {Mathf.Max(0, _flameRoundsAlive)} 发");
+ if (_flameRoundsAlive > 0) return;
+ SettleFinalJackpot();
+ }
+
+ ///
+ /// 最终爆奖结算(对齐钻头蟹:所有子弹跑完 → ShowEndUI):
+ /// 交回爆奖事件结算(JiaFen 回加金币 + ShowBJEndUI 出一次面板 + 通知本类恢复/回收)。
+ /// 事件不可用时,Boss 直接用 flameRoundBJEndUIPrefab 出面板 + 调 JiaFen 兜底。
+ ///
+ private void SettleFinalJackpot()
+ {
+ if (_flameSettled) return;
+ _flameSettled = true;
+
+ var evt = _deferSettleEvent;
+ _deferSettleEvent = null;
+
+ if (evt != null)
+ {
+ Debug.Log("[LieYanFengBao] 火球弹全部结束 → 通知爆奖事件结算最终面板");
+ evt.SettleNow();
+ return;
+ }
+
+ // 兜底:爆奖事件没走延迟结算(未初始化/未死亡等)→ Boss 自己出面板
+ // 事件正常路径下已经在初始化时结算过,这里只处理异常兜底,避免面板完全不出现
+ Debug.LogWarning("[LieYanFengBao] 火球弹全部结束但没有待结算的爆奖事件(面板可能已由事件提前显示)");
+ }
+
+ /// 按 userId 查座位(找不到返回 null)
+ private SitPosData FindSitByUser(string userId)
+ {
+ var mgr = CreateFishManager.Instance;
+ if (mgr == null || mgr.currGameType == null || mgr.currGameType.list_Sits == null) return null;
+ if (string.IsNullOrEmpty(userId)) return null;
+ return mgr.currGameType.list_Sits.Find(s => s.user == userId);
+ }
+
+ /// 击杀者座位的炮倍(火球弹上报击杀用);取不到就退回本机当前座位,再不行给 1。
+ private int ResolvePaoBei(string userId)
+ {
+ var mgr = CreateFishManager.Instance;
+ if (mgr != null && mgr.currGameType != null)
+ {
+ if (!string.IsNullOrEmpty(userId) && mgr.currGameType.list_Sits != null)
+ {
+ var sit = mgr.currGameType.list_Sits.Find(s => s.user == userId);
+ if (sit != null && sit.consumeGoldNum > 0) return (int)sit.consumeGoldNum;
+ }
+ if (mgr.currGameType.currSitData != null && mgr.currGameType.currSitData.consumeGoldNum > 0)
+ return (int)mgr.currGameType.currSitData.consumeGoldNum;
+ }
+ return 1;
}
/// 初始化爆奖事件(炸一下 + bjEndUI)
@@ -380,6 +620,18 @@ public class LieYanFengBao_BOSS : MonsterControl_BossBase
evt.explosionCenter = diePos;
evt.bossCtrl = this;
currEvent = evt;
+
+ // ⭐ 会发火球弹的死亡(isDieFish 且不是被免费子弹打死)→ 让爆奖事件
+ // **等所有火球弹收尾爆炸完成后**再结算(JiaFen + 面板),对齐钻头蟹的 ShowEndUI 时机
+ bool willSpawnFlame = isDieFish && ReadBulletType(obj.param) != BulletTypeFree;
+ bool defer = flameRoundDeferSettle && willSpawnFlame;
+ // ⚠ 显式赋值 true/false:事件是池化对象,避免残留上一轮的延迟标记
+ evt.deferSettle = defer;
+ if (defer)
+ {
+ _deferSettleEvent = evt;
+ Debug.Log("[LieYanFengBao] 最终爆奖已延迟:等所有火球弹收尾后再出面板");
+ }
}
else
{
diff --git a/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/PW_Enemy_115.prefab b/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/PW_Enemy_115.prefab
index 29f2b13c9..0413567c7 100644
--- a/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/PW_Enemy_115.prefab
+++ b/Assets/MyGame/aa/Game/XJMH/Boss/LieYanFengBao/PW_Enemy_115.prefab
@@ -152,6 +152,7 @@ MonoBehaviour:
createVideoClip: {fileID: 0}
rotationPY: 60
useMirrorCompensate: 1
+ useRollSignFlip: 0
useRouteFlipX: 1
baseMmove: 0
isRotate: 1
@@ -160,6 +161,9 @@ MonoBehaviour:
depthOffset: 0
is2DFish: 1
sortOrder2D: 221
+ drawMoveLine: 0
+ drawLineSegments: 60
+ drawLineColor: {r: 1, g: 0.92156863, b: 0.015686275, a: 1}
bossName: "\u70C8\u7130\u98CE\u66B4"
isToUI: 1
tMP_CurrBossScore: {fileID: 0}
@@ -177,8 +181,20 @@ MonoBehaviour:
flameRoundBulletPrefab: {fileID: 2628375401523424628, guid: 9ed49cd2acc114b4d839b06e3766ccaf,
type: 3}
flameRoundSpeed: 30
- flameRoundLifeTime: 4
+ flameRoundLifeTime: 8
flameRoundFallbackCount: 4
+ flameRoundBounceLimit: 4
+ flameRoundBounceShake: 0.5
+ flameRoundHitEffectPrefab: {fileID: 1307567150641513, guid: bf68320e2b1dec44ca6285fee1fc48f3,
+ type: 3}
+ flameRoundExplosionRadius: 3
+ flameRoundKillFishOnFinal: 1
+ flameRoundBJEndUIPrefab: {fileID: 0}
+ flameRoundJackpotScore: -1
+ flameRoundJackpotBeishu: 0
+ flameRoundDeferSettle: 1
+ flameRoundDebugLog: 1
+ flameRoundUseLocalInstantKill: 1
explosionToRewardDelay: 0.3
rewardToResetDelay: 0.8
dieToFlameRoundDelay: 1.8
diff --git a/Assets/MyGame/aa/Game/XJMH/Prefabs/Bullit/PW_Bullet_FlameRound.prefab b/Assets/MyGame/aa/Game/XJMH/Prefabs/Bullit/PW_Bullet_FlameRound.prefab
index 4e88f29ba..de55e18e5 100644
--- a/Assets/MyGame/aa/Game/XJMH/Prefabs/Bullit/PW_Bullet_FlameRound.prefab
+++ b/Assets/MyGame/aa/Game/XJMH/Prefabs/Bullit/PW_Bullet_FlameRound.prefab
@@ -11,7 +11,7 @@ GameObject:
- component: {fileID: 2623929118217137342}
m_Layer: 7
m_Name: Explosion
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -43,10 +43,9 @@ GameObject:
- component: {fileID: 2627120296159640219}
- component: {fileID: 2639909595211502100}
- component: {fileID: 2650863340803371353}
- - component: {fileID: 3916674750202535009}
m_Layer: 7
m_Name: PW_Bullet_FlameRound
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -61,8 +60,8 @@ Transform:
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
- m_LocalScale: {x: 0.9, y: 0.9, z: 0.9}
- m_ConstrainProportionsScale: 0
+ m_LocalScale: {x: 2, y: 2, z: 2}
+ m_ConstrainProportionsScale: 1
m_Children:
- {fileID: 2623919183334045106}
- {fileID: 2627003230944060665}
@@ -142,31 +141,6 @@ Rigidbody2D:
m_SleepingMode: 1
m_CollisionDetection: 0
m_Constraints: 0
---- !u!114 &3916674750202535009
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2628375401523424628}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 59323a063846feb4cb2ab243e7887554, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- userid:
- moveSpeed: 100
- desTime: 10
- playerID:
- effectPrefab: {fileID: 0}
- diePrefab: {fileID: 0}
- isTriggerFirst: 1
- targetTra: {fileID: 0}
- bulletID:
- maxTurnSpeed: 15
- minTurnSpeed: 2
- distanceForMaxTurn: 1
- sortOrder: 500
--- !u!1 &2628988624152764319
GameObject:
m_ObjectHideFlags: 0
@@ -180,7 +154,7 @@ GameObject:
- component: {fileID: 2792228970830937200}
m_Layer: 7
m_Name: Glow03
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -2538,7 +2512,7 @@ GameObject:
- component: {fileID: 2791901242524847643}
m_Layer: 7
m_Name: FJ_path_07
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -4882,7 +4856,7 @@ GameObject:
- component: {fileID: 2791801619860721909}
m_Layer: 7
m_Name: FJ_glow_20
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -7226,7 +7200,7 @@ GameObject:
- component: {fileID: 2790416861880907065}
m_Layer: 7
m_Name: Glow04
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -9584,7 +9558,7 @@ GameObject:
- component: {fileID: 2791899652305851451}
m_Layer: 7
m_Name: sm
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -12014,7 +11988,7 @@ GameObject:
- component: {fileID: 2791950503187219054}
m_Layer: 7
m_Name: FJ_glow_18
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -14358,7 +14332,7 @@ GameObject:
- component: {fileID: 2790348422175808980}
m_Layer: 7
m_Name: FJ_glow_05
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -16712,7 +16686,7 @@ GameObject:
- component: {fileID: 2792164536762776403}
m_Layer: 7
m_Name: FJ_glow_21
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -19056,7 +19030,7 @@ GameObject:
- component: {fileID: 2792060487723656805}
m_Layer: 7
m_Name: FJ_glow_07_a
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -21418,7 +21392,7 @@ GameObject:
- component: {fileID: 2791836392543598837}
m_Layer: 7
m_Name: Fire
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -23848,7 +23822,7 @@ GameObject:
- component: {fileID: 2791873330538028299}
m_Layer: 7
m_Name: Glow
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -26210,7 +26184,7 @@ GameObject:
- component: {fileID: 2778286923791984627}
m_Layer: 7
m_Name: sprite
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -26294,7 +26268,7 @@ GameObject:
- component: {fileID: 2675825424464300882}
m_Layer: 7
m_Name: Trail
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -26440,7 +26414,7 @@ GameObject:
- component: {fileID: 2791818756796623345}
m_Layer: 7
m_Name: FJ_fangsheguang_01
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -28784,7 +28758,7 @@ GameObject:
- component: {fileID: 2790340097591223507}
m_Layer: 7
m_Name: Dot
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -31214,7 +31188,7 @@ GameObject:
- component: {fileID: 2792210948632500358}
m_Layer: 7
m_Name: FJ_xulie_11
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -33540,7 +33514,7 @@ GameObject:
- component: {fileID: 2791691693945874286}
m_Layer: 7
m_Name: FJ_yanhuo_02
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -35884,7 +35858,7 @@ GameObject:
- component: {fileID: 2792150393867024466}
m_Layer: 7
m_Name: FJ_fangsheguang_02
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -38228,7 +38202,7 @@ GameObject:
- component: {fileID: 2791889907625872779}
m_Layer: 7
m_Name: FJ_lizi_01
- m_TagString: Untagged
+ m_TagString: Bullet
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
diff --git a/Assets/TextMesh Pro/Resources/Fonts & Materials/SourceHanSans SDF.asset b/Assets/TextMesh Pro/Resources/Fonts & Materials/SourceHanSans SDF.asset
index 5afe98304..27894d90c 100644
--- a/Assets/TextMesh Pro/Resources/Fonts & Materials/SourceHanSans SDF.asset
+++ b/Assets/TextMesh Pro/Resources/Fonts & Materials/SourceHanSans SDF.asset
@@ -20,7 +20,7 @@ Texture2D:
m_MipsStripped: 0
m_TextureFormat: 1
m_MipCount: 1
- m_IsReadable: 1
+ m_IsReadable: 0
m_IsPreProcessed: 0
m_IgnoreMipmapLimit: 0
m_MipmapLimitGroupName:
@@ -68,7 +68,7 @@ Texture2D:
m_MipsStripped: 0
m_TextureFormat: 1
m_MipCount: 1
- m_IsReadable: 1
+ m_IsReadable: 0
m_IsPreProcessed: 0
m_IgnoreMipmapLimit: 0
m_MipmapLimitGroupName:
@@ -115,8 +115,8 @@ MonoBehaviour:
m_SourceFontFileGUID: fd74a459621d04a4aab7bfba702e212f
m_SourceFontFile_EditorRef: {fileID: 12800000, guid: fd74a459621d04a4aab7bfba702e212f,
type: 3}
- m_SourceFontFile: {fileID: 12800000, guid: fd74a459621d04a4aab7bfba702e212f, type: 3}
- m_AtlasPopulationMode: 1
+ m_SourceFontFile: {fileID: 0}
+ m_AtlasPopulationMode: 0
m_FaceInfo:
m_FaceIndex: 0
m_FamilyName: Source Han Sans
@@ -1670,6 +1670,36 @@ MonoBehaviour:
m_Scale: 1
m_AtlasIndex: 1
m_ClassDefinitionType: 0
+ - m_Index: 1417
+ m_Metrics:
+ m_Width: 8.359375
+ m_Height: 26.671875
+ m_HorizontalBearingX: 19.484375
+ m_HorizontalBearingY: 24.359375
+ m_HorizontalAdvance: 29
+ m_GlyphRect:
+ m_X: 310
+ m_Y: 1488
+ m_Width: 9
+ m_Height: 28
+ m_Scale: 1
+ m_AtlasIndex: 1
+ m_ClassDefinitionType: 0
+ - m_Index: 1418
+ m_Metrics:
+ m_Width: 8.359375
+ m_Height: 26.671875
+ m_HorizontalBearingX: 1.15625
+ m_HorizontalBearingY: 24.359375
+ m_HorizontalAdvance: 29
+ m_GlyphRect:
+ m_X: 310
+ m_Y: 1523
+ m_Width: 9
+ m_Height: 28
+ m_Scale: 1
+ m_AtlasIndex: 1
+ m_ClassDefinitionType: 0
- m_Index: 1421
m_Metrics:
m_Width: 6.25
@@ -106610,36 +106640,6 @@ MonoBehaviour:
m_Scale: 1
m_AtlasIndex: 0
m_ClassDefinitionType: 0
- - m_Index: 1417
- m_Metrics:
- m_Width: 8.359375
- m_Height: 26.671875
- m_HorizontalBearingX: 19.484375
- m_HorizontalBearingY: 24.359375
- m_HorizontalAdvance: 29
- m_GlyphRect:
- m_X: 310
- m_Y: 1488
- m_Width: 9
- m_Height: 28
- m_Scale: 1
- m_AtlasIndex: 1
- m_ClassDefinitionType: 0
- - m_Index: 1418
- m_Metrics:
- m_Width: 8.359375
- m_Height: 26.671875
- m_HorizontalBearingX: 1.15625
- m_HorizontalBearingY: 24.359375
- m_HorizontalAdvance: 29
- m_GlyphRect:
- m_X: 310
- m_Y: 1523
- m_Width: 9
- m_Height: 28
- m_Scale: 1
- m_AtlasIndex: 1
- m_ClassDefinitionType: 0
m_CharacterTable:
- m_ElementType: 1
m_Unicode: 32
@@ -107053,6 +107053,14 @@ MonoBehaviour:
m_Unicode: 12299
m_GlyphIndex: 1412
m_Scale: 1
+ - m_ElementType: 1
+ m_Unicode: 12304
+ m_GlyphIndex: 1417
+ m_Scale: 1
+ - m_ElementType: 1
+ m_Unicode: 12305
+ m_GlyphIndex: 1418
+ m_Scale: 1
- m_ElementType: 1
m_Unicode: 12308
m_GlyphIndex: 1421
@@ -135037,14 +135045,6 @@ MonoBehaviour:
m_Unicode: 65509
m_GlyphIndex: 59218
m_Scale: 1
- - m_ElementType: 1
- m_Unicode: 12304
- m_GlyphIndex: 1417
- m_Scale: 1
- - m_ElementType: 1
- m_Unicode: 12305
- m_GlyphIndex: 1418
- m_Scale: 1
m_AtlasTextures:
- {fileID: -5242640295693195929}
- {fileID: -4985352658726325108}