diff --git a/Assets/Art/FengLei/UI/Anim_BaoJiang/UI_baojiang.controller b/Assets/Art/FengLei/UI/Anim_BaoJiang/UI_baojiang.controller index 5998ae5dd..a41912903 100644 --- a/Assets/Art/FengLei/UI/Anim_BaoJiang/UI_baojiang.controller +++ b/Assets/Art/FengLei/UI/Anim_BaoJiang/UI_baojiang.controller @@ -1,5 +1,53 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1101 &-7087220483249332510 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -1091054516175329715} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.39999998 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &-1091054516175329715 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: UI_baojiang_idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 5469d2a672cc5fd4287aebb88e24b5f4, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: --- !u!91 &9100000 AnimatorController: m_ObjectHideFlags: 0 @@ -8,7 +56,25 @@ AnimatorController: m_PrefabAsset: {fileID: 0} m_Name: UI_baojiang serializedVersion: 5 - m_AnimatorParameters: [] + m_AnimatorParameters: + - m_Name: Appear + m_Type: 9 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: Loop + m_Type: 9 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: Close + m_Type: 9 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} m_AnimatorLayers: - serializedVersion: 5 m_Name: Base Layer @@ -32,7 +98,8 @@ AnimatorState: m_Name: UI_baojiang m_Speed: 1 m_CycleOffset: 0 - m_Transitions: [] + m_Transitions: + - {fileID: -7087220483249332510} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -48,6 +115,79 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: +--- !u!1102 &3012551385725208710 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: UI_baojiang_leave + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 38734011404d5b84bb7dad182224992a, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &3151175118646390328 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 188125840054780768} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &5080916787463449845 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: Loop + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -1091054516175329715} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1107 &6641203575115228107 AnimatorStateMachine: serializedVersion: 6 @@ -59,14 +199,48 @@ AnimatorStateMachine: m_ChildStates: - serializedVersion: 1 m_State: {fileID: 188125840054780768} - m_Position: {x: 0, y: 370, z: 0} + m_Position: {x: 330, y: 130, z: 0} + - serializedVersion: 1 + m_State: {fileID: -1091054516175329715} + m_Position: {x: 260, y: 320, z: 0} + - serializedVersion: 1 + m_State: {fileID: 3012551385725208710} + m_Position: {x: 170, y: 520, z: 0} m_ChildStateMachines: [] - m_AnyStateTransitions: [] + m_AnyStateTransitions: + - {fileID: 5080916787463449845} + - {fileID: 7114718272761430631} + - {fileID: 3151175118646390328} m_EntryTransitions: [] m_StateMachineTransitions: {} m_StateMachineBehaviours: [] m_AnyStatePosition: {x: 50, y: 20, z: 0} - m_EntryPosition: {x: 50, y: 120, z: 0} + m_EntryPosition: {x: -40, y: 150, z: 0} m_ExitPosition: {x: 800, y: 120, z: 0} m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} m_DefaultState: {fileID: 188125840054780768} +--- !u!1101 &7114718272761430631 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: Close + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 3012551385725208710} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 diff --git a/Assets/Art/FengLei/UI/Anim_BaoJiang/UI_baojiang_idle.anim b/Assets/Art/FengLei/UI/Anim_BaoJiang/UI_baojiang_idle.anim index 97f0de53e..0b6eefa7b 100644 --- a/Assets/Art/FengLei/UI/Anim_BaoJiang/UI_baojiang_idle.anim +++ b/Assets/Art/FengLei/UI/Anim_BaoJiang/UI_baojiang_idle.anim @@ -18,63 +18,63 @@ AnimationClip: serializedVersion: 2 m_Curve: - serializedVersion: 3 - time: 0.23333333 + time: 0 value: {x: 0, y: 0, z: 0} inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 57.272724} + outSlope: {x: 0, y: 0, z: 114.54545} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.6 + time: 0.18333334 value: {x: 0, y: 0, z: 21} - inSlope: {x: 0, y: 0, z: 57.272724} + inSlope: {x: 0, y: 0, z: 114.54545} outSlope: {x: 0, y: 0, z: -57.272724} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.3333334 + time: 0.9166667 value: {x: 0, y: 0, z: -21} - inSlope: {x: -0, y: -0, z: -57.272724} - outSlope: {x: 0, y: 0, z: 60.000015} + inSlope: {x: 0, y: 0, z: -57.272724} + outSlope: {x: 0, y: 0, z: 60.000008} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.6833333 + time: 1.2666667 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 60.000015} + inSlope: {x: 0, y: 0, z: 60.000008} outSlope: {x: 0, y: 0, z: 84} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 1.9333333 + time: 1.5166667 value: {x: 0, y: 0, z: 21} inSlope: {x: 0, y: 0, z: 84} - outSlope: {x: 0, y: 0, z: -81.290306} + outSlope: {x: 0, y: 0, z: -81.29032} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 2.45 + time: 2.0333333 value: {x: 0, y: 0, z: -21} - inSlope: {x: -0, y: -0, z: -81.290306} - outSlope: {x: 0, y: 0, z: 57.272743} + inSlope: {x: -0, y: -0, z: -81.29032} + outSlope: {x: 0, y: 0, z: 66.3158} tangentMode: 0 weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 2.8166666 + time: 2.35 value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 57.272743} + inSlope: {x: 0, y: 0, z: 66.3158} outSlope: {x: 0, y: 0, z: 0} tangentMode: 0 weightedMode: 0 @@ -91,15 +91,6 @@ AnimationClip: m_Curve: - serializedVersion: 3 time: 0 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.41666666 value: {x: 1, y: 1, z: 1} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} @@ -108,7 +99,7 @@ AnimationClip: inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 2.6333334 + time: 2.35 value: {x: 1, y: 1, z: 1} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} @@ -116,15 +107,6 @@ AnimationClip: weightedMode: 0 inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 3 - value: {x: 0, y: 0, z: 0} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 @@ -162,7 +144,7 @@ AnimationClip: m_AdditiveReferencePoseClip: {fileID: 0} m_AdditiveReferencePoseTime: 0 m_StartTime: 0 - m_StopTime: 3 + m_StopTime: 2.35 m_OrientationOffsetY: 0 m_Level: 0 m_CycleOffset: 0 @@ -183,16 +165,7 @@ AnimationClip: serializedVersion: 2 m_Curve: - serializedVersion: 3 - time: 0.23333333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 69 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.3333334 + time: 0.9166667 value: 0 inSlope: -0 outSlope: 0 @@ -201,7 +174,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 2.45 + time: 2.0333333 value: 0 inSlope: -0 outSlope: 0 @@ -222,16 +195,7 @@ AnimationClip: serializedVersion: 2 m_Curve: - serializedVersion: 3 - time: 0.23333333 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 69 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1.3333334 + time: 0.9166667 value: 0 inSlope: -0 outSlope: 0 @@ -240,7 +204,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 2.45 + time: 2.0333333 value: 0 inSlope: -0 outSlope: 0 @@ -261,63 +225,63 @@ AnimationClip: serializedVersion: 2 m_Curve: - serializedVersion: 3 - time: 0.23333333 + time: 0 value: 0 inSlope: 0 - outSlope: 57.272724 + outSlope: 114.54545 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.6 + time: 0.18333334 value: 21 - inSlope: 57.272724 + inSlope: 114.54545 outSlope: -57.272724 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.3333334 + time: 0.9166667 value: -21 inSlope: -57.272724 - outSlope: 60.000015 + outSlope: 60.000008 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.6833333 + time: 1.2666667 value: 0 - inSlope: 60.000015 + inSlope: 60.000008 outSlope: 84 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 1.9333333 + time: 1.5166667 value: 21 inSlope: 84 - outSlope: -81.290306 + outSlope: -81.29032 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 2.45 + time: 2.0333333 value: -21 - inSlope: -81.290306 - outSlope: 57.272743 + inSlope: -81.29032 + outSlope: 66.3158 tangentMode: 69 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 2.8166666 + time: 2.35 value: 0 - inSlope: 57.272743 + inSlope: 66.3158 outSlope: 0 tangentMode: 69 weightedMode: 0 @@ -337,37 +301,19 @@ AnimationClip: m_Curve: - serializedVersion: 3 time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 value: 1 inSlope: 0 outSlope: 0 - tangentMode: 136 + tangentMode: 65 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 2.6333334 + time: 2.35 value: 1 inSlope: 0 outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 3 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + tangentMode: 65 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -385,37 +331,19 @@ AnimationClip: m_Curve: - serializedVersion: 3 time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 value: 1 inSlope: 0 outSlope: 0 - tangentMode: 136 + tangentMode: 65 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 2.6333334 + time: 2.35 value: 1 inSlope: 0 outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 3 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + tangentMode: 65 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 @@ -433,37 +361,19 @@ AnimationClip: m_Curve: - serializedVersion: 3 time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.41666666 value: 1 inSlope: 0 outSlope: 0 - tangentMode: 136 + tangentMode: 65 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 2.6333334 + time: 2.35 value: 1 inSlope: 0 outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 3 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 + tangentMode: 65 weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 diff --git a/Assets/Art/FengLei/UI/Anim_BaoJiang/UI_baojiang_leave.anim b/Assets/Art/FengLei/UI/Anim_BaoJiang/UI_baojiang_leave.anim index 3dfcab100..8d06d3460 100644 --- a/Assets/Art/FengLei/UI/Anim_BaoJiang/UI_baojiang_leave.anim +++ b/Assets/Art/FengLei/UI/Anim_BaoJiang/UI_baojiang_leave.anim @@ -18,7 +18,7 @@ AnimationClip: serializedVersion: 2 m_Curve: - serializedVersion: 3 - time: 0.16666667 + time: 0.25 value: {x: 0, y: 0, z: 0} inSlope: {x: 0, y: 0, z: 57.272743} outSlope: {x: 0, y: 0, z: 0} @@ -36,7 +36,7 @@ AnimationClip: serializedVersion: 2 m_Curve: - serializedVersion: 3 - time: 0 + time: 0.083333336 value: {x: 1, y: 1, z: 1} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} @@ -45,7 +45,7 @@ AnimationClip: inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - serializedVersion: 3 - time: 0.35 + time: 0.43333334 value: {x: 0, y: 0, z: 0} inSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0} @@ -90,7 +90,7 @@ AnimationClip: m_AdditiveReferencePoseClip: {fileID: 0} m_AdditiveReferencePoseTime: 0 m_StartTime: 0 - m_StopTime: 0.35 + m_StopTime: 0.43333334 m_OrientationOffsetY: 0 m_Level: 0 m_CycleOffset: 0 @@ -111,7 +111,7 @@ AnimationClip: serializedVersion: 2 m_Curve: - serializedVersion: 3 - time: 0.16666667 + time: 0.25 value: 0 inSlope: 57.272743 outSlope: 0 @@ -132,7 +132,7 @@ AnimationClip: serializedVersion: 2 m_Curve: - serializedVersion: 3 - time: 0 + time: 0.083333336 value: 1 inSlope: 0 outSlope: 0 @@ -141,7 +141,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.35 + time: 0.43333334 value: 0 inSlope: 0 outSlope: 0 @@ -162,7 +162,7 @@ AnimationClip: serializedVersion: 2 m_Curve: - serializedVersion: 3 - time: 0 + time: 0.083333336 value: 1 inSlope: 0 outSlope: 0 @@ -171,7 +171,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.35 + time: 0.43333334 value: 0 inSlope: 0 outSlope: 0 @@ -192,7 +192,7 @@ AnimationClip: serializedVersion: 2 m_Curve: - serializedVersion: 3 - time: 0 + time: 0.083333336 value: 1 inSlope: 0 outSlope: 0 @@ -201,7 +201,7 @@ AnimationClip: inWeight: 0.33333334 outWeight: 0.33333334 - serializedVersion: 3 - time: 0.35 + time: 0.43333334 value: 0 inSlope: 0 outSlope: 0 diff --git a/Assets/Art/FengLei/UI/Anim_BaoJiang/爆奖中_.png b/Assets/Art/FengLei/UI/Anim_BaoJiang/爆奖中_.png new file mode 100644 index 000000000..7139b0a0f Binary files /dev/null and b/Assets/Art/FengLei/UI/Anim_BaoJiang/爆奖中_.png differ diff --git a/Assets/Art/FengLei/UI/Anim_BaoJiang/爆奖中_.png.meta b/Assets/Art/FengLei/UI/Anim_BaoJiang/爆奖中_.png.meta new file mode 100644 index 000000000..4e4860cc2 --- /dev/null +++ b/Assets/Art/FengLei/UI/Anim_BaoJiang/爆奖中_.png.meta @@ -0,0 +1,153 @@ +fileFormatVersion: 2 +guid: 33d407ecd9f681c41a44162e3ad963e1 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + 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: 3 + 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 + - serializedVersion: 3 + buildTarget: iPhone + 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: 3 + buildTarget: WebGL + 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: 3 + buildTarget: Android + 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: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Framework/Event/ConstEventString.cs b/Assets/Framework/Event/ConstEventString.cs index 3cdcea560..7b2a654ae 100644 --- a/Assets/Framework/Event/ConstEventString.cs +++ b/Assets/Framework/Event/ConstEventString.cs @@ -13,6 +13,8 @@ public class ConstEventString public const string SyncGameData_ChangeWing = "SyncGameData_ChangeWing"; public const string SyncGameData_BotFireAngle = "SyncGameData_BotFireAngle"; // SyncGameData_RequestSyncFish 已废弃:鱼同步改由服务端 OnFishSpawn(type=sync) 下发 + /// 爆奖结束帧同步(baoJiangEnd):某玩家爆奖流程完成,其他客户端显示最终 BJEndUI 并加分 + public const string BaoJiangEnd = "BaoJiangEnd"; // ================================================================ // 服务端 → 客户端事件 (新协议) diff --git a/Assets/MyGame/Scenes/UIScene.unity b/Assets/MyGame/Scenes/UIScene.unity index 94838dee7..182aa0dae 100644 --- a/Assets/MyGame/Scenes/UIScene.unity +++ b/Assets/MyGame/Scenes/UIScene.unity @@ -908,7 +908,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 22400762, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} propertyPath: m_AnchoredPosition.y - value: -0.000015258789 + value: -0.0000038146973 objectReference: {fileID: 0} - target: {fileID: 22426080, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} propertyPath: m_AnchorMax.x @@ -6006,6 +6006,7 @@ MonoBehaviour: showWaitingAfterExit: 1 useRemoteBotConfig: 0 enableLogFile: 1 + useNotSelfBaoJiangMode: 1 gameConfig: id: isDelete: 0 diff --git a/Assets/MyGame/Scripts/Characters/Monster/MonsterControl_BossBase.cs b/Assets/MyGame/Scripts/Characters/Monster/MonsterControl_BossBase.cs index 08a0da4d7..4a1574d60 100644 --- a/Assets/MyGame/Scripts/Characters/Monster/MonsterControl_BossBase.cs +++ b/Assets/MyGame/Scripts/Characters/Monster/MonsterControl_BossBase.cs @@ -308,6 +308,11 @@ public class MonsterControl_BossBase : MonsterContral { yield return new WaitForSeconds(dieTime); + // not-self 爆奖模式下未实例化分数面板和 effect_DieAward,跳过飞分逻辑 + // (加分由 BaoJiangNotSelfHandler.OnBaoJiangEnd 处理) + if (tMP_CurrBossScore == null || tMP_CurrBossScore.transform.parent == null) + yield break; + tMP_CurrBossScore.transform.parent .DOMove(v3, 0.5f) .OnComplete(() => diff --git a/Assets/MyGame/Scripts/Manager/CreateFishManager.cs b/Assets/MyGame/Scripts/Manager/CreateFishManager.cs index 956503d53..7d2f6f1b6 100644 --- a/Assets/MyGame/Scripts/Manager/CreateFishManager.cs +++ b/Assets/MyGame/Scripts/Manager/CreateFishManager.cs @@ -1563,6 +1563,28 @@ public class CreateFishManager : MonoSingleton // Boss 鱼:显示浮动分数文本 var bossCtrl = (MonsterControl_BossBase)monster; + // ⭐ not-self 分流:非自己击杀(含机器人)且开启新模式 → 走 not-self 流程 + // 不克隆 effect_DieAward,在 killer 座位显示 img_BaoJiangZhong, + // 等待帧同步 baoJiangEnd(机器人由房主延迟 5~10 秒代发)后显示最终 BJEndUI + 加分 + bool isSelfKill_Boss = sitData.user == GameManager.Instance.user.id; + if (GameManager.Instance.useNotSelfBaoJiangMode + && !isSelfKill_Boss + && monster.effect_DieAward != null + && BaoJiangNotSelfHandler.ShowInProgress( + sitData, + monster.effect_DieAward, + killFish.fishId, + killFish.userId, + killFish.beishu, + gold: killFish.gold, + onScoreAdd: onScoreAdd)) + { + // Boss 死亡仍走 DieFish(处理死亡音效/震屏等),但不播爆奖特效 + monster.DieFish(killFish); + dieFishCalled = true; + break; + } + bossCtrl.v3 = sitData.transform.position; bossCtrl.JiaFen = onScoreAdd; // 先设置 JiaFen,DieFish 的 lambda 才能捕获到 bossCtrl.isLocalCoin = sitData.user == GameManager.Instance.user.id; // ⭐ 金/银区分 @@ -1621,6 +1643,40 @@ public class CreateFishManager : MonoSingleton break; case FishTypeEnum.特殊鱼: { + // ⭐ not-self + Boss爆奖模式分流:不克隆 effect_DieAward,只读取预制体上的 BJEndUI + // 在 killer 座位 obj_BaoJiangZhongPanelPosition 显示 img_BaoJiangZhong(关 tMP_beishu) + // 等待帧同步 baoJiangEnd 后再走最终 BJEndUI 效果 + 加分 + // 开关:GameManager.useNotSelfBaoJiangMode(false=旧模式,所有玩家走相同流程) + // ⚠️ 排除重写了 SetCoinCount 的子类(如炸弹蟹 HHWK_ZDX_DieEvent): + // 这些鱼有特殊爆炸/范围杀鱼玩法,必须走原流程,不能跳过 SetCoinCount + bool isSelfKill_TSY = sitData.user == GameManager.Instance.user.id; + if (GameManager.Instance.useNotSelfBaoJiangMode + && !isSelfKill_TSY + && monster.effect_DieAward != null) + { + var tsyPrefab = monster.effect_DieAward.GetComponent(); + if (tsyPrefab != null && tsyPrefab.baoJiangMode == TSYBaoJiangMode.Boss爆奖) + { + // 检查子类是否重写了 SetCoinCount(炸弹蟹等有特殊爆炸玩法的鱼不走 not-self 分流) + var setCoinMethod = tsyPrefab.GetType().GetMethod("SetCoinCount"); + bool hasCustomSetCoinCount = setCoinMethod != null + && setCoinMethod.DeclaringType != typeof(DieEffect_TSY); + + if (!hasCustomSetCoinCount + && BaoJiangNotSelfHandler.ShowInProgress( + sitData, + monster.effect_DieAward, + killFish.fishId, + killFish.userId, + killFish.beishu, + gold: killFish.gold, + onScoreAdd: onScoreAdd)) + { + break; + } + } + } + // 普通鱼:金币飞向炮台 var award = Instantiate( monster.effect_DieAward != null ? monster.effect_DieAward : dieFXPrefabAward); @@ -1660,6 +1716,9 @@ public class CreateFishManager : MonoSingleton tsy.isLocalCoin = sitData.user == GameManager.Instance.user.id; tsy.monster = monster; tsy.coinCount = killFish.gold; + // 统一注入击杀者座位信息(posID/paoBei 供 GetSeatPosition/范围杀鱼金币计算使用) + tsy.posID = sitData.posID; + tsy.paoBei = (int)sitData.consumeGoldNum; if (tsy.baoJiangMode == TSYBaoJiangMode.Boss爆奖) { @@ -1700,6 +1759,26 @@ public class CreateFishManager : MonoSingleton // Boss 鱼:显示浮动分数文本 var bossCtrl = (MonsterControl_BossBase)monster; + // ⭐ not-self 分流:非自己击杀(含机器人)且开启新模式 → 走 not-self 流程 + bool isSelfKill_TBoss = sitData.user == GameManager.Instance.user.id; + if (GameManager.Instance.useNotSelfBaoJiangMode + && !isSelfKill_TBoss + && monster.effect_DieAward != null + && BaoJiangNotSelfHandler.ShowInProgress( + sitData, + monster.effect_DieAward, + killFish.fishId, + killFish.userId, + killFish.beishu, + gold: killFish.gold, + onScoreAdd: onScoreAdd)) + { + // Boss 死亡仍走 DieFish(处理死亡音效/震屏等),但不播爆奖特效 + monster.DieFish(killFish); + dieFishCalled = true; + break; + } + bossCtrl.v3 = sitData.transform.position; bossCtrl.JiaFen = onScoreAdd; // 先设置 JiaFen bossCtrl.isLocalCoin = sitData.user == GameManager.Instance.user.id; // ⭐ 金/银区分 diff --git a/Assets/MyGame/Scripts/Manager/GameManager.cs b/Assets/MyGame/Scripts/Manager/GameManager.cs index 379ffb6af..9365b0101 100644 --- a/Assets/MyGame/Scripts/Manager/GameManager.cs +++ b/Assets/MyGame/Scripts/Manager/GameManager.cs @@ -27,6 +27,10 @@ public class GameManager : MonoSingleton [Tooltip("运行时开关:是否实际生成日志文件。需要同时启用 ENABLE_LOG_FILE 预编译指令才生效。\ntrue=生成日志文件;false=不生成(运行时关闭)")] public bool enableLogFile = true; + [Header("爆奖模式")] + [Tooltip("其他玩家爆奖处理方式。\ntrue=新模式(not-self 分流:座位显示 img_BaoJiangZhong,等待帧同步 baoJiangEnd 后再显示最终 BJEndUI 加分);\nfalse=旧模式(所有玩家走相同流程,直接克隆 effect_DieAward 播完整特效)")] + public bool useNotSelfBaoJiangMode = false; + public GameConfig gameConfig; public ActivityConfig activityConfig; public Dictionary dic_fishTypeConfigs = new Dictionary(); diff --git a/Assets/MyGame/Scripts/Net/APIManager.cs b/Assets/MyGame/Scripts/Net/APIManager.cs index 860551195..bb8965b6e 100644 --- a/Assets/MyGame/Scripts/Net/APIManager.cs +++ b/Assets/MyGame/Scripts/Net/APIManager.cs @@ -24,9 +24,9 @@ namespace Assets.MyGame.Scripts.Net public const string baseURL = "http://47.109.132.12"; #else - public const string baseURL = "http://47.109.132.12"; + //public const string baseURL = "http://47.109.132.12"; - //public const string baseURL = "http://47.109.34.50"; + public const string baseURL = "http://47.109.34.50"; #endif diff --git a/Assets/MyGame/Scripts/Net/WebResponses/SyncGameData.cs b/Assets/MyGame/Scripts/Net/WebResponses/SyncGameData.cs index a06a6743e..e4ee8e6c6 100644 --- a/Assets/MyGame/Scripts/Net/WebResponses/SyncGameData.cs +++ b/Assets/MyGame/Scripts/Net/WebResponses/SyncGameData.cs @@ -53,6 +53,8 @@ namespace Assets.MyGame.Scripts.Net.WebResponses changeCannonMultiple=9, changeWing=10, // requestSyncFish=11 已废弃:鱼同步改由服务端 OnFishSpawn(type=sync) 事件下发 + /// 爆奖结束:某玩家爆奖流程完成,广播给其他客户端显示最终 BJEndUI 并加分 + baoJiangEnd=12, } [Serializable] public class FireCannonSendData @@ -145,6 +147,25 @@ namespace Assets.MyGame.Scripts.Net.WebResponses public int cannonMultiple; } + /// + /// 爆奖结束帧数据(frameType=baoJiangEnd)。 + /// 服务端在玩家爆奖流程完成时广播,其他客户端据此显示最终 BJEndUI 并加分。 + /// + [Serializable] + public class FrameData_BaoJiangEnd : FrameData + { + /// 爆奖玩家 ID + public string userId; + /// 击杀者座位 ID + public int posID; + /// 死亡的鱼 ID(用于匹配 pending 的 not-self 爆奖) + public string fishId; + /// 最终倍数 + public int beishu; + /// 最终得分(金币) + public int score; + } + // ================================================================ // OnFishSpawn 事件数据结构 (服务端出鱼,破坏性替代 createFish 帧同步) // ================================================================ diff --git a/Assets/MyGame/Scripts/Net/WebSocketManager.cs b/Assets/MyGame/Scripts/Net/WebSocketManager.cs index 75f16149a..de26b0808 100644 --- a/Assets/MyGame/Scripts/Net/WebSocketManager.cs +++ b/Assets/MyGame/Scripts/Net/WebSocketManager.cs @@ -38,9 +38,9 @@ namespace Assets.MyGame.Scripts.Net private const string baseUrl = "ws://47.109.132.12"; #else - private const string baseUrl = "ws://47.109.132.12"; + //private const string baseUrl = "ws://47.109.132.12"; - //private const string baseUrl = "ws://47.109.34.50"; + private const string baseUrl = "ws://47.109.34.50"; #endif public bool isGame = false; diff --git a/Assets/MyGame/Scripts/Net/WebSocketReponseList.cs b/Assets/MyGame/Scripts/Net/WebSocketReponseList.cs index 66232da02..f03962fd9 100644 --- a/Assets/MyGame/Scripts/Net/WebSocketReponseList.cs +++ b/Assets/MyGame/Scripts/Net/WebSocketReponseList.cs @@ -302,6 +302,9 @@ namespace Assets.MyGame.Scripts.Net EventCenter.Instance.EventTrigger(ConstEventString.SyncGameData_ChangeWing, syncGameData); break; // requestSyncFish=11 已废弃:鱼同步改由服务端 OnFishSpawn(type=sync) 下发 + case FrameDataType.baoJiangEnd: + EventCenter.Instance.EventTrigger(ConstEventString.BaoJiangEnd, syncGameData); + break; default: break; } diff --git a/Assets/MyGame/Scripts/Turret/SitPosData.cs b/Assets/MyGame/Scripts/Turret/SitPosData.cs index 7590613e7..4cda75211 100644 --- a/Assets/MyGame/Scripts/Turret/SitPosData.cs +++ b/Assets/MyGame/Scripts/Turret/SitPosData.cs @@ -17,7 +17,7 @@ public enum TurretControlMode public class SitPosData : MonoBehaviour { public bool IsBaoJiangingActive; - public GameObject obj_BaoJiangZhongPanel; + public Transform obj_BaoJiangZhongPanelPosition; /// 本地玩家的座位引用(由游戏面板初始化时设置) public static SitPosData localPlayerSit; diff --git a/Assets/MyGame/aa/Game/FLZY/BOSS/BJEndUI.cs b/Assets/MyGame/aa/Game/FLZY/BOSS/BJEndUI.cs index df7907a48..cd687cd91 100644 --- a/Assets/MyGame/aa/Game/FLZY/BOSS/BJEndUI.cs +++ b/Assets/MyGame/aa/Game/FLZY/BOSS/BJEndUI.cs @@ -3,6 +3,7 @@ using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; +using UnityEngine.UI; public class BJEndUI : MonoBehaviour { @@ -10,12 +11,57 @@ public class BJEndUI : MonoBehaviour public TextMeshProUGUI tMP_score; public TMP_SpriteAsset goldSprite; public TMP_SpriteAsset SilverSprite; + public Image img_BaoJiangZhong; public bool useScoreAnim = false; // 是否启用分数递增动画 + /// 默认自动销毁延时(秒);not-self 在途状态会取消此计时,等 Finalize 后才重启 + public float autoDestroyDelay = 5f; + + [Header("Animator 状态机触发参数(not-self 流程)")] + [Tooltip("出现动画的 Trigger 参数名(ShowInProgress 入口触发)")] + public string animTrigger_Appear = "Appear"; + [Tooltip("持续动画的 Trigger 参数名(ShowInProgress 出现动画完成后触发)")] + public string animTrigger_Loop = "Loop"; + [Tooltip("关闭动画的 Trigger 参数名(Finalize 时触发,播完后销毁)")] + public string animTrigger_Close = "Close"; + + private Coroutine _destroyCo; + + /// 预制体自带的 Animator(出现/持续/关闭 三态由状态机控制) + private Animator _animator; + private void Awake() { - Destroy(gameObject, 5); + _animator = GetComponent(); + if (autoDestroyDelay > 0) + _destroyCo = StartCoroutine(DestroyAfter(autoDestroyDelay)); + } + + private IEnumerator DestroyAfter(float delay) + { + yield return new WaitForSeconds(delay); + Destroy(gameObject); + } + + /// 取消当前自动销毁计时(用于 not-self 流程切换状态前) + public void CancelAutoDestroy() + { + if (_destroyCo != null) + { + StopCoroutine(_destroyCo); + _destroyCo = null; + } + } + + /// + /// 重置销毁计时并启动新的延时销毁。 + /// + public void RestartAutoDestroy(float delay) + { + CancelAutoDestroy(); + if (delay > 0) + _destroyCo = StartCoroutine(DestroyAfter(delay)); } public void Init(int beishu, int score, bool isMine = false) @@ -32,6 +78,105 @@ public class BJEndUI : MonoBehaviour tMP_score.text = score.ToString(); } + /// + /// not-self 爆奖进入"爆奖中"状态: + /// 关闭 tMP_beishu,激活 img_BaoJiangZhong,取消自动销毁(一直保持,直到收到 baoJiangEnd)。 + /// 由 BaoJiangNotSelfHandler.ShowInProgress 调用。 + /// 注意:此状态下 BJEndUI 不会自动消失,必须等 Finalize 才会显示倍率并启动销毁计时。 + /// + public void ShowInProgress(bool isMine) + { + // 取消自动销毁:在途状态一直保持,直到收到 baoJiangEnd 帧同步走 Finalize + CancelAutoDestroy(); + + if (tMP_beishu != null) tMP_beishu.gameObject.SetActive(false); + if (tMP_score != null) tMP_score.gameObject.SetActive(false); + if (img_BaoJiangZhong != null) img_BaoJiangZhong.gameObject.SetActive(true); + + // 预先应用金/银 spriteAsset,Finalize 时不用再切换 + if (tMP_beishu != null) tMP_beishu.spriteAsset = isMine ? goldSprite : SilverSprite; + if (tMP_score != null) tMP_score.spriteAsset = isMine ? goldSprite : SilverSprite; + + // ⭐ 触发 Animator 状态机:Appear(出现)→ Loop(持续,直到 Finalize) + // Animator 从 Appear 状态自然过渡到 Loop,由状态机配置控制时机 + if (_animator != null) + { + if (!string.IsNullOrEmpty(animTrigger_Loop)) + _animator.SetTrigger(animTrigger_Loop); + } + } + + /// + /// not-self 收到帧同步 baoJiangEnd 后调用: + /// 1. 激活 tMP_beishu,关闭 img_BaoJiangZhong(必须) + /// 2. 触发 Close 动画状态机,播放分数递增1秒 + /// 3. 等 Close 动画播完后销毁(缩小由 Animator 控制,不由代码 DOScale) + /// + public void Finalize(int beishu, int score, bool isMine) + { + CancelAutoDestroy(); + + // 步骤1:切换显示(必须) + if (tMP_beishu != null) tMP_beishu.gameObject.SetActive(true); + if (tMP_score != null) tMP_score.gameObject.SetActive(true); + if (img_BaoJiangZhong != null) img_BaoJiangZhong.gameObject.SetActive(false); + + // 写入倍数 + 金银精灵 + if (tMP_beishu != null) + { + tMP_beishu.spriteAsset = isMine ? goldSprite : SilverSprite; + tMP_beishu.text = "" + beishu.ToString(); + } + if (tMP_score != null) + { + tMP_score.spriteAsset = isMine ? goldSprite : SilverSprite; + } + + // 步骤2+3:ScoreAnim 1秒递增 → 触发 Close 动画 → 等动画播完销毁 + _destroyCo = StartCoroutine(FinalizeSequence(score)); + } + + /// + /// not-self 收尾序列: + /// 1. ScoreAnim 1秒递增(或等待1秒) + /// 2. 触发 Close 动画状态机(缩小由 Animator 控制) + /// 3. 等待动画播完后销毁(Animator 关闭动画结束时机由 Exit Time 或 AnimationEvent 决定, + /// 此处用动画长度作为兜底等待) + /// + private IEnumerator FinalizeSequence(int score) + { + // 等1秒(无论 useScoreAnim 是否开启,都要等1秒再触发 Close) + if (useScoreAnim && tMP_score != null) + { + yield return StartCoroutine(ScoreAnim(score)); + } + else + { + if (tMP_score != null) tMP_score.text = score.ToString(); + yield return new WaitForSeconds(1f); + } + + // 触发 Close 动画状态机(缩小/淡出由 Animator 控制) + if (_animator != null && !string.IsNullOrEmpty(animTrigger_Close)) + { + _animator.SetTrigger(animTrigger_Close); + + // 等 Close 动画播完:优先用 AnimatorStateInfo.length,回退固定 0.5 秒 + // 注意:Trigger 触发后需要等一帧让 Animator 切换状态,再读取 length + yield return null; + var stateInfo = _animator.GetCurrentAnimatorStateInfo(0); + float waitTime = stateInfo.length > 0 ? stateInfo.length : 0.5f; + yield return new WaitForSeconds(waitTime); + } + else + { + // 无 Animator:回退到 DOScale 缩小 + yield return transform.DOScale(Vector3.zero, 0.3f).SetEase(Ease.InBack).WaitForCompletion(); + } + + Destroy(gameObject); + } + private IEnumerator ScoreAnim(int target) { float duration = 1f; diff --git a/Assets/MyGame/aa/Game/FLZY/BOSS/BaoJiangNotSelfHandler.cs b/Assets/MyGame/aa/Game/FLZY/BOSS/BaoJiangNotSelfHandler.cs new file mode 100644 index 000000000..c10ae2eed --- /dev/null +++ b/Assets/MyGame/aa/Game/FLZY/BOSS/BaoJiangNotSelfHandler.cs @@ -0,0 +1,253 @@ +using Assets.MyGame.Scripts.Net.WebResponses; +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using Random = UnityEngine.Random; + +/// +/// 其他玩家爆奖(not-self)流程管理器。 +/// +/// 流程: +/// 1. 服务端下发 RoomKillNotice(鱼死亡),客户端在 Ws_DieFish 判断 killFish.userId != 本地 user +/// 且 effect_DieAward 上挂的是 DieEffect_TSY(Boss爆奖模式)→ 调用 : +/// a. 不克隆 effect_DieAward,只读取预制体上的 BJEndUI(); +/// b. 把 BJEndUI 实例化到 killer 座位的 ; +/// c. 关闭 tMP_beishu / 激活 img_BaoJiangZhong; +/// d. 标记 = true。 +/// 2. 等待服务端帧同步 (爆奖玩家爆完奖励): +/// 在 中取出对应 pending,调用 显示最终 BJEndUI, +/// 执行 onScoreAdd 加分,清除 IsBaoJiangingActive。 +/// +/// 机器人杀 Boss 特殊处理: +/// 机器人不会主动发 baoJiangEnd(机器人客户端无人触发)。 +/// 由房主客户端在进入 not-self 在途状态后,延迟 5~10 秒代发 baoJiangEnd 帧同步给服务端, +/// 服务端广播给所有玩家 → 各客户端走 OnBaoJiangEnd 完成最终加分。 +/// +/// 帧同步数据由 携带(userId/fishId/beishu/score)。 +/// pending 用 "userId|fishId" 做 key,同一玩家同帧杀多条特殊鱼也能区分。 +/// +public static class BaoJiangNotSelfHandler +{ + private class PendingEntry + { + public BJEndUI endUI; + public SitPosData killerSit; + public Action onScoreAdd; + public int gold; + public int beishu; + public string userId; + public string fishId; + public bool isBot; + } + + // key: userId|fishId + private static readonly Dictionary _pending = new Dictionary(); + + /// 机器人爆奖模拟延迟下限(秒) + public const float BotSendDelayMin = 5f; + /// 机器人爆奖模拟延迟上限(秒) + public const float BotSendDelayMax = 10f; + + /// + /// 其他玩家爆奖进入"爆奖中"状态。 + /// 不克隆 effect_DieAward 预制体,只读取其上的 BJEndUI 引用并实例化到座位。 + /// + /// 击杀者座位(用于显示位置 + IsBaoJiangingActive 标记) + /// 鱼身上配置的 effect_DieAward 预制体(不克隆,仅读取 BJEndUI) + /// 被击杀的鱼 ID(用于帧同步匹配) + /// 击杀者 userId + /// 倍数(用于 Finalize 显示) + /// 金币数(用于 Finalize 时加分) + /// 加分回调(来自 Ws_DieFish 的 onScoreAdd) + public static bool ShowInProgress( + SitPosData killerSit, + GameObject effect_DieAwardPrefab, + string fishId, + string killerUserId, + int beishu, + int gold, + Action onScoreAdd) + { + if (killerSit == null) + { + Debug.LogWarning("[BaoJiangNotSelfHandler] killerSit 为空,跳过 not-self 爆奖"); + return false; + } + + // effect_DieAward 不克隆,只读取预制体上的 BJEventBase.bjEndUI + BJEndUI bjEndUIPrefab = ResolveBJEndUIPrefab(effect_DieAwardPrefab); + if (bjEndUIPrefab == null) + { + Debug.LogWarning("[BaoJiangNotSelfHandler] effect_DieAward 预制体上未找到 BJEndUI,跳过 not-self 爆奖"); + return false; + } + + // 实例化 BJEndUI 到座位 obj_BaoJiangZhongPanelPosition + Transform parent = killerSit.obj_BaoJiangZhongPanelPosition != null + ? killerSit.obj_BaoJiangZhongPanelPosition + : killerSit.transform; + + var endUI = UnityEngine.Object.Instantiate(bjEndUIPrefab, parent); + endUI.transform.localPosition = Vector3.zero; + endUI.transform.localRotation = Quaternion.identity; + endUI.transform.localScale = Vector3.one; + + // 进入"爆奖中"状态:关 tMP_beishu / 开 img_BaoJiangZhong + endUI.ShowInProgress(isMine: false); + + // 标记座位正在爆奖 + killerSit.IsBaoJiangingActive = true; + + // 机器人识别:优先用 SitPosData.isBot(服务端 RoomPlayerInfo 下发),回退 userId.StartsWith("bot_") + bool isBot = killerSit.isBot + || (!string.IsNullOrEmpty(killerUserId) && killerUserId.StartsWith("bot_")); + + string key = MakeKey(killerUserId, fishId); + _pending[key] = new PendingEntry + { + endUI = endUI, + killerSit = killerSit, + onScoreAdd = onScoreAdd, + gold = gold, + beishu = beishu, + userId = killerUserId, + fishId = fishId, + isBot = isBot, + }; + + Debug.Log($"[BaoJiangNotSelfHandler] not-self 爆奖进入在途状态:key={key} gold={gold} beishu={beishu} isBot={isBot}"); + + // 机器人杀 Boss 特殊处理:机器人不会主动发 baoJiangEnd,由房主客户端延迟 5~10 秒代发帧同步 + // 服务端广播给所有玩家 → 各客户端走 OnBaoJiangEnd 完成最终加分(保证多人游戏一致性) + if (isBot && IsLocalRoomOwner()) + { + GameManager.Instance.StartCoroutine(DelayedSendBaoJiangEndForBot(killerUserId, fishId, beishu, gold)); + } + + return true; + } + + /// + /// 收到帧同步 baoJiangEnd 时调用: + /// 显示最终 BJEndUI(开 tMP_beishu / 关 img_BaoJiangZhong)→ 加分 → 清除 IsBaoJiangingActive。 + /// + public static void OnBaoJiangEnd(string userId, string fishId, int beishu, int score) + { + string key = MakeKey(userId, fishId); + if (!_pending.TryGetValue(key, out var entry)) + { + Debug.LogWarning($"[BaoJiangNotSelfHandler] 未找到 pending not-self 爆奖:key={key}(可能已被安全超时清理或重复触发)"); + return; + } + + _pending.Remove(key); + + if (entry.endUI != null) + { + entry.endUI.Finalize(beishu, score, isMine: false); + } + + // 加分(与 self 流程一致,在最终效果展示后回加金币) + try + { + entry.onScoreAdd?.Invoke(0); + } + catch (Exception e) + { + Debug.LogError($"[BaoJiangNotSelfHandler] onScoreAdd 异常:{e}"); + } + + if (entry.killerSit != null) + { + entry.killerSit.IsBaoJiangingActive = false; + } + + Debug.Log($"[BaoJiangNotSelfHandler] not-self 爆奖完成:key={key} beishu={beishu} score={score}"); + } + + /// + /// 机器人杀 Boss 时由房主客户端延迟 5~10 秒后代发 baoJiangEnd 帧同步给服务端, + /// 服务端广播给所有玩家(含房主自己)→ 各客户端走 OnBaoJiangEnd 完成最终加分。 + /// 这样可保证所有客户端同一时刻切换到最终 BJEndUI 效果(多人游戏一致性)。 + /// + private static IEnumerator DelayedSendBaoJiangEndForBot(string userId, string fishId, int beishu, int score) + { + float delay = Random.Range(BotSendDelayMin, BotSendDelayMax); + Debug.Log($"[BaoJiangNotSelfHandler] 房主代发机器人爆奖结束帧同步:延迟 {delay:F2}s key={MakeKey(userId, fishId)}"); + yield return new WaitForSeconds(delay); + + // 防御:发送时 pending 可能已被 ClearAll 清掉(如玩家中途退房),跳过发送 + string key = MakeKey(userId, fishId); + if (!_pending.ContainsKey(key)) + { + Debug.LogWarning($"[BaoJiangNotSelfHandler] 延迟到点但 pending 已不存在,放弃代发:key={key}"); + yield break; + } + + SyncGameData sgd = new SyncGameData + { + sitPos = 0, + frameType = FrameDataType.baoJiangEnd, + time = BeijingTimeManager.Instance.CurrentTimestampMs, + frameData = new FrameData_BaoJiangEnd + { + userId = userId, + posID = 0, + fishId = fishId, + beishu = beishu, + score = score, + } + }; + WebSocketSendList.SyncGameData(sgd); + + Debug.Log($"[BaoJiangNotSelfHandler] 房主已代发 baoJiangEnd 帧同步:key={key} beishu={beishu} score={score}"); + } + + /// 判断当前本地客户端是否为房主(用于决定是否代发机器人帧同步) + private static bool IsLocalRoomOwner() + { + return SitPosData.roomOwnerSit != null + && GameManager.Instance != null + && GameManager.Instance.user != null + && SitPosData.roomOwnerSit.user == GameManager.Instance.user.id; + } + + /// + /// 从 effect_DieAward 预制体上读取 BJEndUI(不克隆 effect_DieAward)。 + /// 优先走 BJEventBase.bjEndUI 字段,回退 GetComponentInChildren<BJEndUI>。 + /// + private static BJEndUI ResolveBJEndUIPrefab(GameObject effect_DieAwardPrefab) + { + if (effect_DieAwardPrefab == null) return null; + + // 优先:BJEventBase(DieEffect_TSY 继承自它)的 bjEndUI 字段 + var bjEventBase = effect_DieAwardPrefab.GetComponent(); + if (bjEventBase != null && bjEventBase.bjEndUI != null) + return bjEventBase.bjEndUI; + + // 回退:effect_DieAward 自身或子节点上的 BJEndUI 组件 + var onSelf = effect_DieAwardPrefab.GetComponent(); + if (onSelf != null) return onSelf; + + return effect_DieAwardPrefab.GetComponentInChildren(true); + } + + /// 清空所有 pending(场景切换/退出房间时调用,避免悬空引用) + public static void ClearAll() + { + foreach (var kv in _pending) + { + if (kv.Value?.killerSit != null) + kv.Value.killerSit.IsBaoJiangingActive = false; + if (kv.Value?.endUI != null) + { + try { UnityEngine.Object.Destroy(kv.Value.endUI.gameObject); } + catch { /* 忽略 */ } + } + } + _pending.Clear(); + } + + private static string MakeKey(string userId, string fishId) => $"{userId}|{fishId}"; +} diff --git a/Assets/MyGame/aa/Game/FLZY/BOSS/BaoJiangNotSelfHandler.cs.meta b/Assets/MyGame/aa/Game/FLZY/BOSS/BaoJiangNotSelfHandler.cs.meta new file mode 100644 index 000000000..ce7b8d7c8 --- /dev/null +++ b/Assets/MyGame/aa/Game/FLZY/BOSS/BaoJiangNotSelfHandler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4124e0a2fce52fb4099a40bfb1aff861 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MyGame/aa/Game/FLZY/BOSS/DLY/FLZY_DLY_BOSS.cs b/Assets/MyGame/aa/Game/FLZY/BOSS/DLY/FLZY_DLY_BOSS.cs index 3daf058f9..6bc180f81 100644 --- a/Assets/MyGame/aa/Game/FLZY/BOSS/DLY/FLZY_DLY_BOSS.cs +++ b/Assets/MyGame/aa/Game/FLZY/BOSS/DLY/FLZY_DLY_BOSS.cs @@ -47,6 +47,7 @@ public class FLZY_DLY_BOSS : MonsterControl_BossBase { //GetComponent().enabled = false; - currEffect_DieAward.SetActive(true); + if (currEffect_DieAward != null) + currEffect_DieAward.SetActive(true); } } diff --git a/Assets/MyGame/aa/Game/FLZY/BOSS/LLBT/FLZY_LLBT_BOSS.cs b/Assets/MyGame/aa/Game/FLZY/BOSS/LLBT/FLZY_LLBT_BOSS.cs index c5978315c..bafa15f10 100644 --- a/Assets/MyGame/aa/Game/FLZY/BOSS/LLBT/FLZY_LLBT_BOSS.cs +++ b/Assets/MyGame/aa/Game/FLZY/BOSS/LLBT/FLZY_LLBT_BOSS.cs @@ -47,6 +47,7 @@ public class FLZY_LLBT_BOSS : MonsterControl_BossBase { //GetComponent().enabled = false; - currEffect_DieAward.SetActive(true); + if (currEffect_DieAward != null) + currEffect_DieAward.SetActive(true); } } diff --git a/Assets/MyGame/aa/Game/FLZY/BOSS/PTS/FLZY_PTS_BOSS.cs b/Assets/MyGame/aa/Game/FLZY/BOSS/PTS/FLZY_PTS_BOSS.cs index 06e2f5c6b..049ce8a2d 100644 --- a/Assets/MyGame/aa/Game/FLZY/BOSS/PTS/FLZY_PTS_BOSS.cs +++ b/Assets/MyGame/aa/Game/FLZY/BOSS/PTS/FLZY_PTS_BOSS.cs @@ -47,6 +47,7 @@ public class FLZY_PTS_BOSS : MonsterControl_BossBase { //GetComponent().enabled = false; - currEffect_DieAward.SetActive(true); + if (currEffect_DieAward != null) + currEffect_DieAward.SetActive(true); } } diff --git a/Assets/MyGame/aa/Game/FLZY/BOSS/QL/Game173_Effect_LDJT.prefab b/Assets/MyGame/aa/Game/FLZY/BOSS/QL/Game173_Effect_LDJT.prefab index 07499b10d..971cc0e75 100644 --- a/Assets/MyGame/aa/Game/FLZY/BOSS/QL/Game173_Effect_LDJT.prefab +++ b/Assets/MyGame/aa/Game/FLZY/BOSS/QL/Game173_Effect_LDJT.prefab @@ -132365,7 +132365,8 @@ MonoBehaviour: bjEndUI: {fileID: 1790254316978060978, guid: 24c31eadc42c2a84782806970ca46b14, type: 3} useScorePanel: 1 tMP_Score: {fileID: 6528776512666913368} - scorePanelPrefab: {fileID: 0} + scorePanelPrefab: {fileID: 2322849427427554443, guid: 76fbf7ef2bf607648b6fa328e86774da, + type: 3} currScore: 0 maxScore: 0 scoreCount: 0 @@ -132394,6 +132395,9 @@ MonoBehaviour: tMP_longzhu3: {fileID: 2498335782564118400} longzhu1: 0 longzhu2: 0 + tmp_CoinNum: {fileID: 0} + tmp_goldSprite: {fileID: 0} + tmp_SilverSprite: {fileID: 0} --- !u!1 &1709867586078768 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/MyGame/aa/Game/FLZY/BOSS/QL/UI_baojiang Variant 7.prefab b/Assets/MyGame/aa/Game/FLZY/BOSS/QL/UI_baojiang Variant 7.prefab index 90b359906..5a54601e5 100644 --- a/Assets/MyGame/aa/Game/FLZY/BOSS/QL/UI_baojiang Variant 7.prefab +++ b/Assets/MyGame/aa/Game/FLZY/BOSS/QL/UI_baojiang Variant 7.prefab @@ -11,7 +11,7 @@ PrefabInstance: - target: {fileID: 236781439713602893, guid: a96966a1d55149a4f83724f224013303, type: 3} propertyPath: m_Name - value: UI_baojiang Variant + value: UI_baojiang Variant 7 objectReference: {fileID: 0} - target: {fileID: 685976588209175045, guid: a96966a1d55149a4f83724f224013303, type: 3} @@ -113,6 +113,42 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 2278261232015200288, guid: a96966a1d55149a4f83724f224013303, + type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: -2085821068, guid: 68e4fec764425b4438eb6a06c7b99c16, + type: 3} + - target: {fileID: 4213903445032130685, guid: a96966a1d55149a4f83724f224013303, + type: 3} + propertyPath: m_SizeDelta.x + value: 385 + objectReference: {fileID: 0} + - target: {fileID: 4213903445032130685, guid: a96966a1d55149a4f83724f224013303, + type: 3} + propertyPath: m_SizeDelta.y + value: 326 + objectReference: {fileID: 0} + - target: {fileID: 4213903445032130685, guid: a96966a1d55149a4f83724f224013303, + type: 3} + propertyPath: m_LocalScale.x + value: 2.1550467 + objectReference: {fileID: 0} + - target: {fileID: 4213903445032130685, guid: a96966a1d55149a4f83724f224013303, + type: 3} + propertyPath: m_LocalScale.y + value: 2.1550467 + objectReference: {fileID: 0} + - target: {fileID: 4213903445032130685, guid: a96966a1d55149a4f83724f224013303, + type: 3} + propertyPath: m_LocalScale.z + value: 2.1550467 + objectReference: {fileID: 0} + - target: {fileID: 4213903445032130685, guid: a96966a1d55149a4f83724f224013303, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 141 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] diff --git a/Assets/MyGame/aa/Game/FLZY/BOSS/SLZP/FLZY_SLZP_BOSS.cs b/Assets/MyGame/aa/Game/FLZY/BOSS/SLZP/FLZY_SLZP_BOSS.cs index bb64baffb..30ade0771 100644 --- a/Assets/MyGame/aa/Game/FLZY/BOSS/SLZP/FLZY_SLZP_BOSS.cs +++ b/Assets/MyGame/aa/Game/FLZY/BOSS/SLZP/FLZY_SLZP_BOSS.cs @@ -47,6 +47,7 @@ public class FLZY_SLZP_BOSS : MonsterControl_BossBase { //GetComponent().enabled = false; - currEffect_DieAward.SetActive(true); + if (currEffect_DieAward != null) + currEffect_DieAward.SetActive(true); } } diff --git a/Assets/MyGame/aa/Game/FLZY/BOSS/TSK/FLZY_TSK_BOSS.cs b/Assets/MyGame/aa/Game/FLZY/BOSS/TSK/FLZY_TSK_BOSS.cs index c5acb5605..d3efe005e 100644 --- a/Assets/MyGame/aa/Game/FLZY/BOSS/TSK/FLZY_TSK_BOSS.cs +++ b/Assets/MyGame/aa/Game/FLZY/BOSS/TSK/FLZY_TSK_BOSS.cs @@ -52,6 +52,7 @@ public class FLZY_TSK_BOSS : MonsterControl_BossBase { //GetComponent().enabled = false; - currEffect_DieAward.SetActive(true); + if (currEffect_DieAward != null) + currEffect_DieAward.SetActive(true); } } diff --git a/Assets/MyGame/aa/Game/FLZY/BOSS/YGSM/FLZY_YGSM_BOSS.cs b/Assets/MyGame/aa/Game/FLZY/BOSS/YGSM/FLZY_YGSM_BOSS.cs index 572d5d32b..ce1620f61 100644 --- a/Assets/MyGame/aa/Game/FLZY/BOSS/YGSM/FLZY_YGSM_BOSS.cs +++ b/Assets/MyGame/aa/Game/FLZY/BOSS/YGSM/FLZY_YGSM_BOSS.cs @@ -47,6 +47,7 @@ public class FLZY_YGSM_BOSS : MonsterControl_BossBase { //GetComponent().enabled = false; - currEffect_DieAward.SetActive(true); + if (currEffect_DieAward != null) + currEffect_DieAward.SetActive(true); } } diff --git a/Assets/MyGame/aa/Game/HHWK/MonsterTSY/ZDX/HHWK_ZDX_DieEvent.cs b/Assets/MyGame/aa/Game/HHWK/MonsterTSY/ZDX/HHWK_ZDX_DieEvent.cs index 1d08a66f8..9d67cf1c0 100644 --- a/Assets/MyGame/aa/Game/HHWK/MonsterTSY/ZDX/HHWK_ZDX_DieEvent.cs +++ b/Assets/MyGame/aa/Game/HHWK/MonsterTSY/ZDX/HHWK_ZDX_DieEvent.cs @@ -22,11 +22,11 @@ public class HHWK_ZDX_DieEvent : DieEffect_TSY private void Awake() { - paoBei = (int)CreateFishManager.Instance.currGameType.currSitData.consumeGoldNum; + // paoBei 由 CreateFishManager 杀鱼流程按击杀者座位传入(避免误用本地 currSitData) if (fishLayer == 0) fishLayer = LayerMask.GetMask("Fish"); } - public void SetCoinCount() + public override void SetCoinCount() { StartCoroutine(BombRoutine()); } @@ -113,7 +113,8 @@ public class HHWK_ZDX_DieEvent : DieEffect_TSY if (control == null) continue; if (control.fishenum != FishTypeEnum.普通鱼) continue; - var sitPos = CreateFishManager.Instance.currGameType?.currSitData?.transform.position ?? Vector3.zero; + // 金币飞向击杀者座位(GetSeatPosition 按 posID 查找,避免误用本地 currSitData) + var sitPos = GetSeatPosition(); CreateFishManager.Instance.Id_DieFish_FX(control.guid, new RedPacketRecord { Amount = paoBei * control.monsterData.fishTypeConfig.fishScore }, sitPos, diff --git a/Assets/MyGame/aa/Game/UI_baojiang.prefab b/Assets/MyGame/aa/Game/UI_baojiang.prefab index 6d82315c2..d6d90a291 100644 --- a/Assets/MyGame/aa/Game/UI_baojiang.prefab +++ b/Assets/MyGame/aa/Game/UI_baojiang.prefab @@ -1,5 +1,80 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &5598207015042782747 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4661670236367478549} + - component: {fileID: 7626499617345871505} + - component: {fileID: 5482184688706782502} + m_Layer: 5 + m_Name: Text_beilv (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &4661670236367478549 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5598207015042782747} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 2.5648463, y: 2.5648463, z: 2.5648463} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5627438144398829183} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 23.282, y: -219} + m_SizeDelta: {x: 192, y: 55} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7626499617345871505 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5598207015042782747} + m_CullTransparentMesh: 1 +--- !u!114 &5482184688706782502 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5598207015042782747} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 33d407ecd9f681c41a44162e3ad963e1, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1001 &2200719792388851550 PrefabInstance: m_ObjectHideFlags: 0 @@ -236,6 +311,11 @@ PrefabInstance: propertyPath: m_AnchoredPosition.y value: 60 objectReference: {fileID: 0} + - target: {fileID: 5997907733971708680, guid: 016cca90246ec334390dabcc5bdb6207, + type: 3} + propertyPath: m_Enabled + value: 1 + objectReference: {fileID: 0} - target: {fileID: 6769213647795418602, guid: 016cca90246ec334390dabcc5bdb6207, type: 3} propertyPath: m_AnchoredPosition.x @@ -296,7 +376,11 @@ PrefabInstance: objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] - m_AddedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: 5805751044334051617, guid: 016cca90246ec334390dabcc5bdb6207, + type: 3} + insertIndex: -1 + addedObject: {fileID: 4661670236367478549} m_AddedComponents: - targetCorrespondingSourceObject: {fileID: 2144753057044015635, guid: 016cca90246ec334390dabcc5bdb6207, type: 3} @@ -325,7 +409,12 @@ MonoBehaviour: tMP_score: {fileID: 8500458599698691596} goldSprite: {fileID: 11400000, guid: b5a3b539bfcb41e46ad594b9b14d7732, type: 2} SilverSprite: {fileID: 11400000, guid: e034cf5e78470b44f8a1c4d42d5039d6, type: 2} + img_BaoJiangZhong: {fileID: 5482184688706782502} useScoreAnim: 0 + autoDestroyDelay: 5 + animTrigger_Appear: Appear + animTrigger_Loop: Loop + animTrigger_Close: Close --- !u!114 &4340237964197962142 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 2499807387639965376, guid: 016cca90246ec334390dabcc5bdb6207, @@ -338,6 +427,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!224 &5627438144398829183 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5805751044334051617, guid: 016cca90246ec334390dabcc5bdb6207, + type: 3} + m_PrefabInstance: {fileID: 2200719792388851550} + m_PrefabAsset: {fileID: 0} --- !u!114 &8500458599698691596 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 7745405151849361746, guid: 016cca90246ec334390dabcc5bdb6207, diff --git a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs index daa89bfb4..9e86f058e 100644 --- a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs +++ b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs @@ -460,6 +460,8 @@ public class GameMainPanel_FishBase : GameMainPanel_Base // SyncGameData_FreezeFish 已废弃:冰冻改由服务端 FishFrozen 事件统一触发 EventCenter.Instance.AddEventListener(ConstEventString.FishFrozen, OnFishFrozen); EventCenter.Instance.AddEventListener(ConstEventString.SyncGameData_BotFireAngle, SyncGameData_BotFireAngle); + // ⭐ 爆奖结束帧同步(baoJiangEnd):其他玩家爆奖完成,显示最终 BJEndUI 并加分 + EventCenter.Instance.AddEventListener(ConstEventString.BaoJiangEnd, OnBaoJiangEnd); btn_TuJian.onClick.AddListener(() => { subUIManager.ShowAsync(UIPanel.GameTuJian); @@ -540,10 +542,13 @@ public class GameMainPanel_FishBase : GameMainPanel_Base // SyncGameData_FreezeFish 已废弃:冰冻改由服务端 FishFrozen 事件统一触发 EventCenter.Instance.RemoveEventListener(ConstEventString.FishFrozen, OnFishFrozen); EventCenter.Instance.RemoveEventListener(ConstEventString.SyncGameData_BotFireAngle, SyncGameData_BotFireAngle); + EventCenter.Instance.RemoveEventListener(ConstEventString.BaoJiangEnd, OnBaoJiangEnd); // ⭐ 离场清理:子弹池 + 特效池彻底清空,防止内存泄漏 BulletPool.Instance.ClearAll(); EffectPool.Instance.ClearAll(); + // ⭐ 清理未完成的 not-self 爆奖 pending(避免悬空引用) + BaoJiangNotSelfHandler.ClearAll(); } public virtual void Start() @@ -2328,6 +2333,27 @@ public class GameMainPanel_FishBase : GameMainPanel_Base sit.tMP_TurretConsumeNum.text = data.cannonMultiple.ToString(); } + /// + /// 爆奖结束帧同步(baoJiangEnd): + /// 其他玩家爆奖流程完成,从 pending 取出对应 not-self 爆奖, + /// 显示最终 BJEndUI(开 tMP_beishu / 关 img_BaoJiangZhong)并加分。 + /// 自己触发的爆奖不在这里处理(self 流程在 BJEventBase 内部已自行结束)。 + /// + public void OnBaoJiangEnd(SyncGameData sync) + { + var data = FrameDataParser.Parse(sync.frameData); + if (data == null) + { + Debug.LogWarning("[GameMainPanel_FishBase] OnBaoJiangEnd: frameData 解析失败"); + return; + } + + // 自己触发的爆奖不在这里处理(self 流程已自行走完) + if (data.userId == GameManager.Instance.user.id) return; + + BaoJiangNotSelfHandler.OnBaoJiangEnd(data.userId, data.fishId, data.beishu, data.score); + } + public void SyncCannonMultiple(int consumeGold) { if (currSitData == null) return; diff --git a/Assets/MyGame/aa/UI/Game/右上.prefab b/Assets/MyGame/aa/UI/Game/右上.prefab index cbb05997c..0e0736e06 100644 --- a/Assets/MyGame/aa/UI/Game/右上.prefab +++ b/Assets/MyGame/aa/UI/Game/右上.prefab @@ -353,6 +353,16 @@ PrefabInstance: propertyPath: m_SortingLayer value: 0 objectReference: {fileID: 0} + - target: {fileID: 8127545208163857053, guid: 509192cd5f627cf409a54e9be694a24d, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -70 + objectReference: {fileID: 0} + - target: {fileID: 8127545208163857053, guid: 509192cd5f627cf409a54e9be694a24d, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 157 + objectReference: {fileID: 0} - target: {fileID: 8456731491629334137, guid: 509192cd5f627cf409a54e9be694a24d, type: 3} propertyPath: m_Pivot.x diff --git a/Assets/MyGame/aa/UI/Game/右下.prefab b/Assets/MyGame/aa/UI/Game/右下.prefab index 18bdda056..d80ba0fd7 100644 --- a/Assets/MyGame/aa/UI/Game/右下.prefab +++ b/Assets/MyGame/aa/UI/Game/右下.prefab @@ -38,6 +38,11 @@ PrefabInstance: propertyPath: m_AnchoredPosition.x value: -68 objectReference: {fileID: 0} + - target: {fileID: 6515038176716052403, guid: c9c177e60fd350e49844955f7e8a5874, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -80 + objectReference: {fileID: 0} - target: {fileID: 6916578527196273495, guid: c9c177e60fd350e49844955f7e8a5874, type: 3} propertyPath: m_Pivot.x diff --git a/Assets/MyGame/aa/UI/Game/左下.prefab b/Assets/MyGame/aa/UI/Game/左下.prefab index 0edb8d1ca..bb0a1dd24 100644 --- a/Assets/MyGame/aa/UI/Game/左下.prefab +++ b/Assets/MyGame/aa/UI/Game/左下.prefab @@ -1361,6 +1361,7 @@ RectTransform: - {fileID: 8688572226311385210} - {fileID: 5982321734877658021} - {fileID: 2913924626316377592} + - {fileID: 6515038176716052403} m_Father: {fileID: 6916578527196273495} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -1553,6 +1554,157 @@ RectTransform: m_AnchoredPosition: {x: -3.5020447, y: 36.505585} m_SizeDelta: {x: 170, y: 75} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &7786583167098886127 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5524080749604356889} + - component: {fileID: 1631232687274162216} + - component: {fileID: 73195319764559091} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5524080749604356889 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7786583167098886127} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6515038176716052403} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -11} + m_SizeDelta: {x: 99, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1631232687274162216 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7786583167098886127} + m_CullTransparentMesh: 1 +--- !u!114 &73195319764559091 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7786583167098886127} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 966302477530b50448107e982ba24b24, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8211773067005770755 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6515038176716052403} + - component: {fileID: 6688785355602917098} + - component: {fileID: 1292175335872007774} + m_Layer: 5 + m_Name: witPlay (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6515038176716052403 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8211773067005770755} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5524080749604356889} + m_Father: {fileID: 3177929166328559778} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 57.1, y: 116} + m_SizeDelta: {x: 151, y: 69} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6688785355602917098 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8211773067005770755} + m_CullTransparentMesh: 1 +--- !u!114 &1292175335872007774 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8211773067005770755} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 754604517d492bd4a9ac914a9f9e08ce, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &8529218940359093989 GameObject: m_ObjectHideFlags: 0 @@ -1821,6 +1973,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 16cfaab69e1fa404dbb8432276bd7537, type: 3} m_Name: m_EditorClassIdentifier: + IsBaoJiangingActive: 0 + obj_BaoJiangZhongPanelPosition: {fileID: 6515038176716052403} user: posID: 0 isBot: 0