WIP: add logic and UI

This commit is contained in:
MinhHai
2026-02-04 15:17:39 +07:00
parent 8c2ac52b86
commit 5dd3dcf48d
18 changed files with 1930 additions and 19 deletions
@@ -0,0 +1,918 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1590197940424963217
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6666702292353843246}
- component: {fileID: 4026888369354985289}
m_Layer: 0
m_Name: DlgExit
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6666702292353843246
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1590197940424963217}
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: 4878816101074468399}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &4026888369354985289
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1590197940424963217}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8ca9d1418c284fd395248056f086c7d4, type: 3}
m_Name:
m_EditorClassIdentifier:
ConfirmBtn: {fileID: 3576373828330281173}
CancelBtn: {fileID: 5816777684468032703}
--- !u!1 &1725743065086802770
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4878816101074468399}
- component: {fileID: 1101450299599105715}
- component: {fileID: 5337953600179164026}
m_Layer: 0
m_Name: Popup
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4878816101074468399
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1725743065086802770}
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: 7913819123905793175}
- {fileID: 7527520206793245717}
- {fileID: 4965393937731457567}
- {fileID: 4000902174573487903}
m_Father: {fileID: 6666702292353843246}
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: 0}
m_SizeDelta: {x: 933.3333, y: 533.3333}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1101450299599105715
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1725743065086802770}
m_CullTransparentMesh: 1
--- !u!114 &5337953600179164026
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1725743065086802770}
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: 4744752b0496d42d0b1c52fcb705e044, 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 &4518958362188575915
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4965393937731457567}
- component: {fileID: 1891070853961845177}
- component: {fileID: 807580002560918717}
- component: {fileID: 3576373828330281173}
m_Layer: 0
m_Name: Button_Confirm
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4965393937731457567
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4518958362188575915}
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: 4642911678502374063}
m_Father: {fileID: 4878816101074468399}
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: -210, y: -150}
m_SizeDelta: {x: 313, y: 91}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1891070853961845177
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4518958362188575915}
m_CullTransparentMesh: 1
--- !u!114 &807580002560918717
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4518958362188575915}
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: b545f49a479374ffaaec0c8f123b0c5f, 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!114 &3576373828330281173
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4518958362188575915}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 807580002560918717}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1 &4670976812881016521
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7913819123905793175}
- component: {fileID: 2369126678925736279}
- component: {fileID: 7564280183498118806}
m_Layer: 0
m_Name: Text (TMP)_Title
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7913819123905793175
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4670976812881016521}
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: 4878816101074468399}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 1}
m_AnchorMax: {x: 0.5, y: 1}
m_AnchoredPosition: {x: -3.7721, y: -17.4557}
m_SizeDelta: {x: 298.0753, y: 34.9115}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2369126678925736279
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4670976812881016521}
m_CullTransparentMesh: 1
--- !u!114 &7564280183498118806
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4670976812881016521}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: "Th\xF4ng b\xE1o"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 30
m_fontSizeBase: 30
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &5918190347695128963
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4642911678502374063}
- component: {fileID: 4834289956051303799}
- component: {fileID: 3482299799452283765}
m_Layer: 0
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4642911678502374063
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5918190347695128963}
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: 4965393937731457567}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4834289956051303799
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5918190347695128963}
m_CullTransparentMesh: 1
--- !u!114 &3482299799452283765
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5918190347695128963}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: "X\xE1c nh\u1EADn"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 50
m_fontSizeBase: 50
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &5923497699521027687
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4000902174573487903}
- component: {fileID: 7348237821025748982}
- component: {fileID: 356920440688922164}
- component: {fileID: 5816777684468032703}
m_Layer: 0
m_Name: Button_Cancel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4000902174573487903
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5923497699521027687}
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: 1979839230795202451}
m_Father: {fileID: 4878816101074468399}
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: 210, y: -150}
m_SizeDelta: {x: 313, y: 91}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7348237821025748982
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5923497699521027687}
m_CullTransparentMesh: 1
--- !u!114 &356920440688922164
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5923497699521027687}
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: b545f49a479374ffaaec0c8f123b0c5f, 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!114 &5816777684468032703
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5923497699521027687}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 356920440688922164}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1 &6076086137757476783
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7527520206793245717}
- component: {fileID: 717316905677608887}
- component: {fileID: 2182669632864579474}
m_Layer: 0
m_Name: Text (TMP)_Content
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7527520206793245717
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6076086137757476783}
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: 4878816101074468399}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 1}
m_AnchorMax: {x: 0.5, y: 1}
m_AnchoredPosition: {x: -2, y: -201.94122}
m_SizeDelta: {x: 862.825, y: 279.6172}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &717316905677608887
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6076086137757476783}
m_CullTransparentMesh: 1
--- !u!114 &2182669632864579474
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6076086137757476783}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: "R\u1EDDi kh\u1ECFi ho\xE0n m\u1EF9 ?"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 93.94
m_fontSizeBase: 93.94
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &8385824745593160430
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1979839230795202451}
- component: {fileID: 926584410341277518}
- component: {fileID: 7589457457506445651}
m_Layer: 0
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1979839230795202451
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8385824745593160430}
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: 4000902174573487903}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &926584410341277518
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8385824745593160430}
m_CullTransparentMesh: 1
--- !u!114 &7589457457506445651
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8385824745593160430}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: "H\u1EE7y"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 50
m_fontSizeBase: 50
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 0c248d0510a114829b58d62d2ecc3b5e
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+283
View File
@@ -457,6 +457,142 @@ MonoBehaviour:
m_PointerBehavior: 0
m_CursorLockBehavior: 0
m_ScrollDeltaPerTick: 6
--- !u!1 &1180649769221527971
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1908310604726647551}
- component: {fileID: 7432323784403002332}
- component: {fileID: 6253396656395833156}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1908310604726647551
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1180649769221527971}
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: 8680646788002276863}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7432323784403002332
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1180649769221527971}
m_CullTransparentMesh: 1
--- !u!114 &6253396656395833156
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1180649769221527971}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text:
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4281479730
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 24
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &1182266301883914285
GameObject:
m_ObjectHideFlags: 0
@@ -2564,6 +2700,152 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &5721980010412121515
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8680646788002276863}
- component: {fileID: 8076476413184855661}
- component: {fileID: 8851603462695586251}
- component: {fileID: 5556504023802397200}
- component: {fileID: 1370263596141727443}
m_Layer: 5
m_Name: ExitBtn
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8680646788002276863
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5721980010412121515}
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: 1908310604726647551}
m_Father: {fileID: 3483809415181351540}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -880, y: -66.70001}
m_SizeDelta: {x: 85, y: 99}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8076476413184855661
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5721980010412121515}
m_CullTransparentMesh: 1
--- !u!114 &8851603462695586251
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5721980010412121515}
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: 052d4b5b3b147d04cbd00f737f5c7c53, 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!114 &5556504023802397200
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5721980010412121515}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 8851603462695586251}
m_OnClick:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 1890210201668811196}
m_TargetAssemblyTypeName: CECUIManager, Assembly-CSharp
m_MethodName: ShowUI
m_Mode: 5
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument: Win_Quest
m_BoolArgument: 0
m_CallState: 2
--- !u!114 &1370263596141727443
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5721980010412121515}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 96de7d56a4514c979bdd93568dba2031, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &5885931642767984348
GameObject:
m_ObjectHideFlags: 0
@@ -3249,6 +3531,7 @@ RectTransform:
- {fileID: 984617901920738932}
- {fileID: 2783469216819378410}
- {fileID: 8913509984865075419}
- {fileID: 8680646788002276863}
- {fileID: 5823843793071880086}
- {fileID: 1462603449517194619}
- {fileID: 7020286574697807252}
@@ -43,3 +43,5 @@ MonoBehaviour:
prefab: {fileID: 5492547392745930423, guid: 54cccb2c6a758a24183474cd385ccb2c, type: 3}
- id: CDlgInfoTooltip
prefab: {fileID: 6830833846243993097, guid: 97dd1de3aba08a04980849e40d5c1ea4, type: 3}
- id: CDlgInfoTooltip
prefab: {fileID: 6830833846243993097, guid: 97dd1de3aba08a04980849e40d5c1ea4, type: 3}
@@ -1063,6 +1063,32 @@ namespace BrewMonster
return true;
}
/// <summary>
/// Write user config data into buffer at given offset. 在指定偏移处写入用户配置数据。
/// </summary>
public bool SaveUserConfigData(byte[] pDataBuf, int startIndex, out int piSize)
{
if (startIndex < 0) { piSize = 0; return false; }
piSize = 0;
int iTotalSize = 0;
iTotalSize += sizeof(uint);
iTotalSize += Marshal.SizeOf(typeof(EC_VIDEO_SETTING));
iTotalSize += Marshal.SizeOf(typeof(EC_GAME_SETTING));
iTotalSize += Marshal.SizeOf(typeof(EC_BLACKLIST_SETTING));
iTotalSize += Marshal.SizeOf(typeof(EC_COMPUTER_AIDED_SETTING));
if (pDataBuf != null && startIndex + iTotalSize <= pDataBuf.Length)
{
using (MemoryStream ms = new MemoryStream(pDataBuf, startIndex, pDataBuf.Length - startIndex))
using (BinaryWriter writer = new BinaryWriter(ms))
{
writer.Write((uint)EC_ConfigConstants.EC_CONFIG_VERSION);
}
}
piSize = iTotalSize;
return true;
}
public void DefaultUserConfigData()
{
DefaultUserSettings(ref m_ss, ref m_vs, ref m_gs, ref m_bs, ref m_cas);
@@ -0,0 +1,314 @@
// Filename : EC_PendingAction.cs
// Creator : Xu Wenbin
// Date : 2011/11/09
// Converted from C++: EC_PendingAction.cpp / EC_PendingAction.h
using System.Collections.Generic;
using BrewMonster;
using BrewMonster.Network;
using BrewMonster.UI;
using CSNetwork;
using UnityEngine;
// Logout type constants (C++: gnetdef.h)
// _PLAYER_LOGOUT_FULL 0, _PLAYER_LOGOUT_HALF 1
public static class PendingActionConstants
{
public const int _PLAYER_LOGOUT_FULL = 0;
public const int _PLAYER_LOGOUT_HALF = 1;
}
// CECPendingAction — base class for delayed/pending actions
public abstract class CECPendingAction
{
// 执行的时限 / Execution time limit
private readonly CECCounter m_Counter;
// 是否还需要执行 / Whether still needs to execute
private bool m_bNeedExecute;
// 是否收到外界执行指示 / Whether received external execute trigger
private bool m_bTriggered;
// 执行结果:是否成功执行 / Execute result: whether executed successfully
private bool m_bExecuteResult;
public CECPendingAction(uint dwTimerPeriod)
{
m_Counter = new CECCounter();
m_Counter.SetPeriod((float)dwTimerPeriod);
m_bNeedExecute = true;
m_bTriggered = false;
m_bExecuteResult = false;
}
public void Update(uint dwElapsedTime)
{
if (GetNeedExecute())
{
// 每次都尝试执行 / Try execute every time
if (m_Counter.IncCounter((float)dwElapsedTime))
{
// 计时器到 / Timer reached
// 强制执行 / Force execute
m_bExecuteResult = Execute();
// 不需要再进行尝试 / No need to try again
m_bNeedExecute = false;
}
// else 计时中 / else counting
}
}
public void Trigger()
{
if (!GetNeedExecute())
{
// 计时器已经强制执行,不需要再触发执行 / Timer already forced execute, no need to trigger again
return;
}
if (GetTriggered())
{
// 不允许多次触发 / Multiple trigger not allowed
return;
}
m_bTriggered = true;
m_bExecuteResult = Execute();
m_bNeedExecute = false;
}
public bool GetNeedExecute() => m_bNeedExecute;
public bool GetTriggered() => m_bTriggered;
public abstract string GetName();
protected abstract bool Execute();
// Whether currently in game (session connected, game state in-game, host ready)
protected bool IsInGame()
{
var pSession = GetGameSession();
var pGameRun = GetGameRun();
var pHost = pGameRun?.GetHostPlayer();
return pSession != null
&& pSession.IsConnected
&& pGameRun != null
&& pGameRun.GetGameState() == (int)GameState.GS_GAME
&& pHost != null
&& pHost.HostIsReady();
}
protected static CECGameRun GetGameRun() => EC_Game.GetGameRun();
protected static GameSession GetGameSession() => UnityGameSession.Instance?.GameSession;
protected static CECHostPlayer GetHostPlayer() => GetGameRun()?.GetHostPlayer();
}
// 游戏小退 / Game logout (half — back to select role)
public class CECPendingLogoutHalf : CECPendingAction
{
public CECPendingLogoutHalf(uint dwTimerPeriod = 5000) : base(dwTimerPeriod) { }
protected override bool Execute()
{
bool bSuccess = false;
if (IsInGame())
{
GetGameSession().SendPlayerLogout(PendingActionConstants._PLAYER_LOGOUT_HALF);
bSuccess = true;
}
return bSuccess;
}
public override string GetName() => "CECPendingLogoutHalf";
}
// 游戏大退 / Game logout (full — account logout)
public class CECPendingLogoutFull : CECPendingAction
{
public CECPendingLogoutFull(uint dwTimerPeriod = 5000) : base(dwTimerPeriod) { }
protected override bool Execute()
{
bool bSuccess = false;
if (IsInGame())
{
GetGameSession().SendPlayerLogout(PendingActionConstants._PLAYER_LOGOUT_FULL);
bSuccess = true;
}
return bSuccess;
}
public override string GetName() => "CECPendingLogoutFull";
}
// 寄售角色 / Selling role
public class CECPendingSellingRole : CECPendingAction
{
public CECPendingSellingRole(uint dwTimerPeriod = 5000) : base(dwTimerPeriod) { }
protected override bool Execute()
{
bool bSuccess = false;
if (IsInGame())
{
GetGameSession().SendPlayerLogout(PendingActionConstants._PLAYER_LOGOUT_HALF);
GetGameRun().SetSellingRoleID(GetHostPlayer().GetCharacterID());
bSuccess = true;
}
return bSuccess;
}
public override string GetName() => "CECPendingSellingRole";
}
// 跨服小退 / Cross-server logout (half)
public class CECPendingLogoutCrossServer : CECPendingAction
{
public CECPendingLogoutCrossServer(uint dwTimerPeriod = 5000) : base(dwTimerPeriod) { }
protected override bool Execute()
{
GetGameRun().SetLogoutFlag(2);
return true;
}
public override string GetName() => "CECPendingLogoutCrossServer";
}
// 进出跨服 / Cross-server get in or out
// m_bGetIn: 进入跨服时为 true;否则为 false / true when entering cross-server; otherwise false
public class CECPendingCrossServerGetInOut : CECPendingAction
{
private readonly bool m_bGetIn;
public CECPendingCrossServerGetInOut(bool bGetIn, uint dwTimerPeriod = 5000)
: base(dwTimerPeriod)
{
m_bGetIn = bGetIn;
}
protected override bool Execute()
{
bool bSuccess = false;
if (IsInGame())
{
var session = GetGameSession();
if (session != null)
{
if (m_bGetIn)
session.c2s_CmdNPCSevCrossServerGetIn();
else
session.c2s_CmdNPCSevCrossServerGetOut();
}
}
var pGameUIMan = GetGameRun()?.GetUIManager()?.GetInGameUIMan();
if (pGameUIMan is CECGameUIMan inGameUIMan)
inGameUIMan.EndNPCService();
return bSuccess;
}
public override string GetName() => "CECPendingCrossServerGetInOut";
}
// CECPendingActionArray — container for multiple pending actions
public class CECPendingActionArray
{
private readonly List<CECPendingAction> m_actions = new List<CECPendingAction>();
private bool m_bAllowMultiActions;
public CECPendingActionArray(bool bAllowMultiActions)
{
m_bAllowMultiActions = bAllowMultiActions;
}
~CECPendingActionArray()
{
Clear();
}
public void Append(CECPendingAction pAction)
{
// 添加新事件 / Add new event
if (pAction == null)
{
Debug.Assert(false);
return;
}
if (!pAction.GetNeedExecute())
{
Debug.Assert(false);
return;
}
if (!GetAllowMultiAction())
Clear();
m_actions.Add(pAction);
}
public void AppendForSaveConfig(CECPendingAction pAction)
{
if (pAction == null)
{
Debug.Assert(false);
return;
}
if (!pAction.GetNeedExecute())
{
Debug.Assert(false);
return;
}
uint saveResult = EC_Game.GetGameRun().SaveConfigsToServer();
if (saveResult != 2)
{
pAction.Trigger();
return;
}
Append(pAction);
}
public void Update(uint dwElapsedTime)
{
if (m_actions.Count == 0) return;
for (int i = m_actions.Count - 1; i >= 0; i--)
{
CECPendingAction pAction = m_actions[i];
pAction.Update(dwElapsedTime);
if (!pAction.GetNeedExecute())
{
m_actions.RemoveAt(i);
}
}
}
public void TriggerAll()
{
if (m_actions.Count == 0) return;
foreach (var pAction in m_actions)
{
if (pAction.GetNeedExecute())
pAction.Trigger();
}
}
public void Clear()
{
// 清除当前所有事件 / Clear all current events
if (m_actions.Count == 0) return;
m_actions.Clear();
}
public void SetAllowMultiAction(bool bAllow)
{
if (GetAllowMultiAction() == bAllow) return;
m_bAllowMultiActions = bAllow;
// 按时间先后顺序,只保留队列最后一个 / By time order, keep only the last one in queue
if (!bAllow && m_actions.Count > 1)
{
var last = m_actions[m_actions.Count - 1];
m_actions.Clear();
m_actions.Add(last);
}
}
public bool GetAllowMultiAction() => m_bAllowMultiActions;
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: a8fc69213d734cb49b1b381a760ae418
timeCreated: 1770180043
@@ -1458,6 +1458,23 @@ namespace CSNetwork
p.Roleid = m_iCharID;
SendProtocol(p);
}
/// <summary>
/// Save config data to server (sends setuiconfig with compressed config blob).
/// 保存配置数据到服务器(发送 setuiconfig 及压缩后的配置数据)。
/// </summary>
public void SaveConfigData(byte[] pBuf, int len)
{
if (pBuf == null || len <= 0) return;
var p = new setuiconfig();
p.Roleid = m_iCharID;
p.Localsid = (int)_localsid;
byte[] slice = new byte[len];
Buffer.BlockCopy(pBuf, 0, slice, 0, len);
p.Ui_config = new Octets(slice);
SendProtocol(p);
}
private void SetCharacterID(int iCharID)
{
m_iCharID = iCharID;
@@ -1894,5 +1911,17 @@ namespace CSNetwork
gamedatasend.Data = C2SCommandFactory.CreateNPCSevClearEmbeddedChipCmd(iEquipIdx, tidEquip);
SendProtocol(gamedatasend);
}
// Cross-server get in (C++: c2s_CmdNPCSevCrossServerGetIn) — TODO: implement C2S packet when needed
public void c2s_CmdNPCSevCrossServerGetIn()
{
// TODO: C2SCommandFactory.CreateNPCSevCrossServerGetInCmd() and SendProtocol
}
// Cross-server get out (C++: c2s_CmdNPCSevCrossServerGetOut) — TODO: implement C2S packet when needed
public void c2s_CmdNPCSevCrossServerGetOut()
{
// TODO: C2SCommandFactory.CreateNPCSevCrossServerGetOutCmd() and SendProtocol
}
}
}
+18 -18
View File
@@ -211,7 +211,7 @@ namespace BrewMonster.Scripts.Task.UI
if (m_pTxt_QuestItem == null) return;
const string LINK_CLICK_VER = "DlgTaskLinkClickCamFix_v2";
UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: {LINK_CLICK_VER} pressEventCamera={(eventData.pressEventCamera != null ? eventData.pressEventCamera.name : "null")}");
// UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: {LINK_CLICK_VER} pressEventCamera={(eventData.pressEventCamera != null ? eventData.pressEventCamera.name : "null")}");
// C++: int x = GET_X_LPARAM(lParam); int y = GET_Y_LPARAM(lParam); // C++: int x = GET_X_LPARAM(lParam); int y = GET_Y_LPARAM(lParam);
Vector2 localPoint;
@@ -221,7 +221,7 @@ namespace BrewMonster.Scripts.Task.UI
eventData.pressEventCamera,
out localPoint);
UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: Click at localPoint={localPoint}, screenPos={eventData.position}");
// UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: Click at localPoint={localPoint}, screenPos={eventData.position}");
// C++: GetItemLinkItemOn(x, y, pObj, &Item); // C++: GetItemLinkItemOn(x, y, pObj, &Item);
// Find which link was clicked (like C++ GetItemLinkItemOn checks vecItemLink[i].rc.PtInRect) // 查找点击了哪个链接(如C++ GetItemLinkItemOn检查vecItemLink[i].rc.PtInRect
@@ -229,12 +229,12 @@ namespace BrewMonster.Scripts.Task.UI
// Debug: verify TMP parsed <link> tags and we have linkInfo
int linkCount = m_pTxt_QuestItem.textInfo?.linkCount ?? -1;
UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: TMP linkCount={linkCount}, raycastTarget={m_pTxt_QuestItem.raycastTarget}, richText={m_pTxt_QuestItem.richText}");
// UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: TMP linkCount={linkCount}, raycastTarget={m_pTxt_QuestItem.raycastTarget}, richText={m_pTxt_QuestItem.richText}");
if (linkCount <= 0)
{
string text = m_pTxt_QuestItem.text ?? string.Empty;
string preview = text.Substring(0, Mathf.Min(300, text.Length));
UnityEngine.Debug.LogWarning($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: No links parsed. Text preview: {preview}");
// UnityEngine.Debug.LogWarning($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: No links parsed. Text preview: {preview}");
return;
}
@@ -245,7 +245,7 @@ namespace BrewMonster.Scripts.Task.UI
{
// IMPORTANT: TMP_TextUtilities.FindIntersectingLink expects camera=null for ScreenSpaceOverlay.
// 重要:ScreenSpaceOverlay 必须传 camera=null,否则会算错导致 linkIndex = -1。
UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: Canvas renderMode={canvas.renderMode}, worldCamera={(canvas.worldCamera != null ? canvas.worldCamera.name : "null")}, pressEventCamera={(eventData.pressEventCamera != null ? eventData.pressEventCamera.name : "null")}");
// UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: Canvas renderMode={canvas.renderMode}, worldCamera={(canvas.worldCamera != null ? canvas.worldCamera.name : "null")}, pressEventCamera={(eventData.pressEventCamera != null ? eventData.pressEventCamera.name : "null")}");
if (canvas.renderMode == RenderMode.ScreenSpaceOverlay)
{
camera = null;
@@ -258,7 +258,7 @@ namespace BrewMonster.Scripts.Task.UI
}
else
{
UnityEngine.Debug.LogWarning($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: {LINK_CLICK_VER} Canvas not found in parents of m_pTxt_QuestItem!");
// UnityEngine.Debug.LogWarning($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: {LINK_CLICK_VER} Canvas not found in parents of m_pTxt_QuestItem!");
// No canvas found; fall back to pressEventCamera (may be null) then main
camera = eventData.pressEventCamera != null ? eventData.pressEventCamera : Camera.main;
}
@@ -266,16 +266,16 @@ namespace BrewMonster.Scripts.Task.UI
// Find intersecting link (like C++ checks vecItemLink[i].rc.PtInRect(x, y)) // 查找相交的链接(如C++检查vecItemLink[i].rc.PtInRect(x, y)
int linkIndexCam = TMP_TextUtilities.FindIntersectingLink(m_pTxt_QuestItem, eventData.position, camera);
int linkIndexNull = TMP_TextUtilities.FindIntersectingLink(m_pTxt_QuestItem, eventData.position, null);
UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: {LINK_CLICK_VER} FindIntersectingLink(cam={(camera != null ? camera.name : "null")})={linkIndexCam}, FindIntersectingLink(null)={linkIndexNull}, screenPos={eventData.position}");
// UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: {LINK_CLICK_VER} FindIntersectingLink(cam={(camera != null ? camera.name : "null")})={linkIndexCam}, FindIntersectingLink(null)={linkIndexNull}, screenPos={eventData.position}");
int linkIndex = linkIndexCam != -1 ? linkIndexCam : linkIndexNull;
UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: FindIntersectingLink => linkIndex={linkIndex}, camera={(camera != null ? camera.name : "null")}, screenPos={eventData.position}");
// UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: FindIntersectingLink => linkIndex={linkIndex}, camera={(camera != null ? camera.name : "null")}, screenPos={eventData.position}");
// Dump all links for debugging
for (int i = 0; i < m_pTxt_QuestItem.textInfo.linkCount; i++)
{
TMP_LinkInfo li = m_pTxt_QuestItem.textInfo.linkInfo[i];
UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: Link[{i}] id={li.GetLinkID()} text={li.GetLinkText()}");
// UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: Link[{i}] id={li.GetLinkID()} text={li.GetLinkText()}");
}
// C++: if( Item.m_pItem != NULL ) // C++: if( Item.m_pItem != NULL )
@@ -284,7 +284,7 @@ namespace BrewMonster.Scripts.Task.UI
TMP_LinkInfo linkInfo = m_pTxt_QuestItem.textInfo.linkInfo[linkIndex];
string linkID = linkInfo.GetLinkID();
UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: Found link - linkID={linkID}");
// UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: Found link - linkID={linkID}");
// C++: if( Item.m_pItem->GetType() == enumEICoord ) // C++: if( Item.m_pItem->GetType() == enumEICoord )
// Check if this is a coordinate link (NPC, monster, item, target - all use enumEICoord in C++) // 检查这是否是坐标链接(NPC、怪物、物品、目标 - 在C++中都使用enumEICoord
@@ -301,7 +301,7 @@ namespace BrewMonster.Scripts.Task.UI
// Use currently selected task ID (like m_idSelTask in C++ FollowCoord call) // 使用当前选中的任务ID(如C++ FollowCoord调用中的m_idSelTask
int currentTaskID = m_idSelTask;
UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: Coordinate link clicked, EntityID={entityID} (NPC/Monster/Item/Target), task={currentTaskID}");
// UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: Coordinate link clicked, EntityID={entityID} (NPC/Monster/Item/Target), task={currentTaskID}");
// C++: CECUIHelper::FollowCoord(Item.m_pItem, m_idSelTask); // C++: CECUIHelper::FollowCoord(Item.m_pItem, m_idSelTask);
// FollowCoord triggers auto-move to the coordinates (for NPC, monster, item, target) // FollowCoord触发自动移动到坐标(适用于NPC、怪物、物品、目标)
@@ -317,7 +317,7 @@ namespace BrewMonster.Scripts.Task.UI
// This matches C++: CECUIHelper::FollowCoord(Item.m_pItem, m_idSelTask)
// 这匹配C++CECUIHelper::FollowCoord(Item.m_pItem, m_idSelTask)
bool ok = CECUIHelper.FollowCoord(entityID, currentTaskID);
UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: FollowCoord(entity={entityID}, task={currentTaskID}) => {ok}");
// UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: FollowCoord(entity={entityID}, task={currentTaskID}) => {ok}");
}
}
}
@@ -326,7 +326,7 @@ namespace BrewMonster.Scripts.Task.UI
// Even without a task, still follow coord
// 即使没有任务,也照样跟随坐标
bool ok = CECUIHelper.FollowCoord(entityID, 0);
UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: FollowCoord(entity={entityID}, task=0) => {ok}");
// UnityEngine.Debug.Log($"[DlgTask] OnEventLButtonDown_Txt_QuestItem: FollowCoord(entity={entityID}, task=0) => {ok}");
}
}
}
@@ -605,7 +605,7 @@ namespace BrewMonster.Scripts.Task.UI
// }
m_idSelTask = idTask;
Debug.Log($"[DlgTask] OnEventLButtonDown_Tv_Quest: {idTask}");
// Debug.Log($"[DlgTask] OnEventLButtonDown_Tv_Quest: {idTask}");
}
// void OnEventMouseMove_Txt_QuestItem(WPARAM wParam, LPARAM lParam, AUIObject *pObj);
// void OnEventLButtonDown_Txt_QuestItem(WPARAM wParam, LPARAM lParam, AUIObject *pObj);
@@ -706,7 +706,7 @@ namespace BrewMonster.Scripts.Task.UI
//
private bool Tick()
{
Debug.Log("[DlgTask] Tick");
// Debug.Log("[DlgTask] Tick");
RefreshTaskTrace();
// Time-window task refresh: while in Search view, refresh the list when server time crosses a minute boundary.
// This is throttled to avoid rebuilding large task lists every frame.
@@ -817,7 +817,7 @@ namespace BrewMonster.Scripts.Task.UI
}
public void RefreshTaskTrace()
{
Debug.Log("[DlgTask] RefreshTaskTrace");
// Debug.Log("[DlgTask] RefreshTaskTrace");
// Get AUIManager, fallback to GetGameUIMan() if m_pAUIManager is not set yet
// 获取AUIManager,如果m_pAUIManager尚未设置则回退到GetGameUIMan()
AUIManager auiManager = GetAUIManager();
@@ -1050,7 +1050,7 @@ namespace BrewMonster.Scripts.Task.UI
}
else
{
Debug.LogError($"Task {idTask} not found ATaskTempl !!!");
// Debug.LogError($"Task {idTask} not found ATaskTempl !!!");
}
}
else
@@ -1112,7 +1112,7 @@ namespace BrewMonster.Scripts.Task.UI
if (idTask != m_idLastTask)
{
_nameTaskText.SetText(EC_Utility.FormatForTextMeshPro(GetTaskNameWithColor(pTemp)));
Debug.Log("[DlgTask] SearchForTask name task: " + _nameTaskText.text);
// Debug.Log("[DlgTask] SearchForTask name task: " + _nameTaskText.text);
if (pTextDesc != null) pTextDesc.SetText(EC_Utility.FormatForTextMeshPro(pTemp.GetDescription()));
m_idLastTask = idTask;
bLastTaskChanged = true;
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2832b8373ed049a89499155c2a507557
timeCreated: 1770188709
@@ -0,0 +1,39 @@
using BrewMonster.UI;
using UnityEngine;
using UnityEngine.UI;
namespace BrewMonster.Scripts
{
public class CDlgExit : AUIDialog
{
[SerializeField] private Button ConfirmBtn;
[SerializeField] private Button CancelBtn;
// [SerializeField] private Toggle CheckBox;
private void Awake()
{
ConfirmBtn.onClick.AddListener(OnCommand_confirm);
CancelBtn.onClick.AddListener(OnCancelClicked);
}
private void OnCancelClicked()
{
Show(false);
}
void OnCommand_confirm()
{
// TODO: Implement logout and exit logic
// if( m_pChk_Forcequit.isOn || !GetGameSession()->IsConnected())
// GetGameRun()->PostMessage(MSG_EXITGAME, -1, 0);
// else
// GetGameRun()->GetPendingLogOut().AppendForSaveConfig(new CECPendingLogoutFull());
CECGameRun.Instance.GetPendingLogOut().AppendForSaveConfig(new CECPendingLogoutFull());
Show(false);
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8ca9d1418c284fd395248056f086c7d4
timeCreated: 1770188720
@@ -0,0 +1,27 @@
using System;
using BrewMonster.UI;
using UnityEngine;
using UnityEngine.UI;
namespace BrewMonster.Scripts
{
public class ExitTest : MonoBehaviour
{
private bool isExitDlgOpen = false;
private Button btn;
private void Start()
{
btn = GetComponent<Button>();
btn.onClick.AddListener(ToggleDlgExit);
}
void ToggleDlgExit()
{
isExitDlgOpen = !isExitDlgOpen;
CECUIManager.Instance.GetInGameUIMan().GetDialog( "Win_Message2" ).Show( isExitDlgOpen );
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 96de7d56a4514c979bdd93568dba2031
timeCreated: 1770190994
@@ -159,6 +159,17 @@ namespace BrewMonster.UI
{
}
/// <summary>
/// Get user layout data for saving to server. Stub: returns size 0 (UI layout save not implemented).
/// 获取用户布局数据用于保存到服务器。桩:返回长度 0(UI 布局保存未实现)。
/// </summary>
public void GetUserLayout(byte[] pData, ref uint dwUISize)
{
dwUISize = 0;
// When pData != null and dwUISize > 0, would write layout bytes
}
public override void Init()
{
base.Init();
@@ -3,6 +3,7 @@ using System.IO;
using System.IO.Compression;
using Unity.SharpZipLib.Zip.Compression.Streams;
using UnityEngine;
using CompressionLevel = System.IO.Compression.CompressionLevel;
namespace BrewMonster
{
@@ -33,6 +34,38 @@ namespace BrewMonster
return result;
}
/// <summary>
/// Compress data (raw deflate). Caller should allocate dst with size >= dstOffset + srcLen * 2 for safety.
/// 压缩数据(原始 deflate)。调用方应分配 dst 大小 >= dstOffset + srcLen * 2。
/// </summary>
/// <param name="dstOffset">Start index in dst where compressed bytes are written. 压缩数据写入 dst 的起始下标。</param>
/// <param name="dstLen">On input max length; on output actual compressed length. 输入为最大长度,输出为实际压缩长度。</param>
/// <returns>0 ok, non-zero error</returns>
public static int Compress(byte[] src, int srcLen, byte[] dst, int dstOffset, ref int dstLen)
{
try
{
using (var output = new MemoryStream())
{
using (var deflate = new DeflateStream(output, CompressionLevel.Fastest))
{
deflate.Write(src, 0, srcLen);
}
byte[] compressed = output.ToArray();
if (dstOffset + compressed.Length > dst.Length)
return Z_BUF_ERROR;
Buffer.BlockCopy(compressed, 0, dst, dstOffset, compressed.Length);
dstLen = compressed.Length;
return Z_OK;
}
}
catch (Exception e)
{
Console.WriteLine($"ERROR::AFilePackage::Compress: {e.Message}");
return Z_ERROR;
}
}
private static int ZlibUnCompress(byte[] dest, ref int destLen, byte[] source, int sourceLen)
{
try
+184 -1
View File
@@ -19,6 +19,8 @@ public partial class CECGameRun
{
private static CECGameRun instance;
#region PROPERTIES AND FIELDS
private GameObject _playerPrefab;
private GameObject _monsterPrefab;//CECMonster
private GameObject _npcServerPrefab;//CECNPCServer
@@ -38,6 +40,10 @@ public partial class CECGameRun
protected CECUIManager m_pUIManager; // UI manager
CECPendingActionArray m_pendingLogout;
#endregion
public CECWorld GetWorld() { return m_pWorld; }
public CECTeamMan GetTeamMan() { return m_pTeamMan; }
@@ -54,6 +60,14 @@ public partial class CECGameRun
private int m_iDExpEndTime = 0;
// Cache for SaveConfigsToServer: last sent config data to skip duplicate sends
private byte[] m_pCfgDataBuf;
private int m_iCfgDataSize;
// Logout flag (C++: m_iLogoutFlag)
private int m_iLogoutFlag = -1;
// Selling role ID for role trade (C++: SetSellingRoleID/GetSellingRoleID)
private int m_iSellingRoleID;
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void AfterSceneLoad()
@@ -85,6 +99,8 @@ public partial class CECGameRun
m_InstTab.Add(161, new CECInstance());
AddressableManager.Instance.OnDispose += Dispose;
StartGame(0, Vector3.zero);
m_pendingLogout = new CECPendingActionArray( false);
}
private static void Dispose()
@@ -707,10 +723,177 @@ public partial class CECGameRun
m_iDExpEndTime = endTime;
}
public int GetGameState() { return m_iGameState; }
public void SaveConfigsToServer()
// Logout flag: -1 none, 0 exit app, 1 re-select role, 2 goto login (C++: SetLogoutFlag/GetLogoutFlag)
public void SetLogoutFlag(int iFlag) { m_iLogoutFlag = iFlag; }
public int GetLogoutFlag() { return m_iLogoutFlag; }
// Selling role ID for role trade (C++: SetSellingRoleID)
public void SetSellingRoleID(int roleid) { m_iSellingRoleID = roleid; }
public int GetSellingRoleID() { return m_iSellingRoleID; }
/* --- Original C++ SaveConfigsToServer (for comparison) ---
DWORD CECGameRun::SaveConfigsToServer()
{
if (!m_pWorld || !m_pWorld->GetHostPlayer() || !m_pWorld->GetHostPlayer()->HostIsReady() || !m_pUIManager->GetInGameUIMan())
return 0;
g_pGame->GetConfigs()->SaveBlockedID();
int iTotalSize = 0;
iTotalSize += sizeof (DWORD);
iTotalSize += sizeof (int);
int iHostSize = 0;
CECHostPlayer* pHost = m_pWorld->GetHostPlayer();
pHost->SaveConfigData(NULL, &iHostSize);
iTotalSize += iHostSize;
iTotalSize += sizeof (int);
DWORD dwUISize = 0;
CECGameUIMan* pGameUI = (CECGameUIMan*)m_pUIManager->GetInGameUIMan();
pGameUI->GetUserLayout(NULL, dwUISize);
iTotalSize += (int)dwUISize;
iTotalSize += sizeof (int);
int iSettingSize = 0;
g_pGame->GetConfigs()->SaveUserConfigData(NULL, &iSettingSize);
iTotalSize += iSettingSize;
void* pDataBuf = a_malloctemp(iTotalSize);
if (!pDataBuf) { glb_ErrorOutput(ECERR_NOTENOUGHMEMORY, "CECGameRun::SaveConfigsToServer", __LINE__); return 0; }
BYTE* pData = (BYTE*)pDataBuf;
*((DWORD*)pData) = USERCFG_VERSION;
pData += sizeof (DWORD);
*((int*)pData) = iHostSize;
pData += sizeof (int);
pHost->SaveConfigData(pData, &iHostSize);
pData += iHostSize;
*((int*)pData) = (int)dwUISize;
pData += sizeof (int);
pGameUI->GetUserLayout(pData, dwUISize);
pData += dwUISize;
*((int*)pData) = iSettingSize;
pData += sizeof (int);
g_pGame->GetConfigs()->SaveUserConfigData(pData, &iSettingSize);
pData += iSettingSize;
if (m_pCfgDataBuf) {
if (m_iCfgDataSize == iTotalSize && !memcmp(m_pCfgDataBuf, pDataBuf, iTotalSize)) { a_freetemp(pDataBuf); return 1; }
a_free(m_pCfgDataBuf); m_pCfgDataBuf = NULL; m_iCfgDataSize = 0;
}
if ((m_pCfgDataBuf = (BYTE*)a_malloc(iTotalSize))) { memcpy(m_pCfgDataBuf, pDataBuf, iTotalSize); m_iCfgDataSize = iTotalSize; }
DWORD dwCompLen = iTotalSize * 2;
void* pCompBuf = a_malloctemp(dwCompLen);
if (!pCompBuf) { a_freetemp(pDataBuf); glb_ErrorOutput(ECERR_NOTENOUGHMEMORY, "CECGameRun::SaveConfigsToServer", __LINE__); return 0; }
int iVerLen = sizeof (DWORD);
memcpy(pCompBuf, pDataBuf, iVerLen);
BYTE* pSrc = (BYTE*)pDataBuf + iVerLen;
BYTE* pDst = (BYTE*)pCompBuf + iVerLen;
dwCompLen -= iVerLen;
int iRes = AFilePackage::Compress(pSrc, iTotalSize - iVerLen, pDst, &dwCompLen);
if (0 == iRes) { g_pGame->GetGameSession()->SaveConfigData(pCompBuf, dwCompLen+iVerLen); iRes = 2; }
else { a_LogOutput(1, "CECGameRun::SaveConfigsToServer, Failed to compress config data (%d:%d)", iRes, iTotalSize); iRes = 0; }
a_freetemp(pDataBuf);
a_freetemp(pCompBuf);
return iRes;
}
--- End original C++ --- */
// Save necessary user configs (UI, shortcut, accelerate keys, etc.) to server
// ֵ: 0(ʧ), 1(ظ), 2(Э)
public uint SaveConfigsToServer()
{
const uint USERCFG_VERSION = 3;
CECHostPlayer pHost = GetHostPlayer();
CECGameUIMan pGameUI = m_pUIManager?.GetInGameUIMan() as CECGameUIMan;
if (m_pWorld == null || pHost == null || !pHost.HostIsReady() || pGameUI == null)
return 0;
EC_Game.GetConfigs().SaveBlockedID();
// Calculate total size: version + host + UI + settings
int iTotalSize = sizeof(uint);
int iHostSize = 0;
pHost.SaveConfigData(null, ref iHostSize);
iTotalSize += sizeof(int) + iHostSize;
uint dwUISize = 0;
pGameUI.GetUserLayout(null, ref dwUISize);
iTotalSize += sizeof(int) + (int)dwUISize;
int iSettingSize = 0;
EC_Game.GetConfigs().SaveUserConfigData(null, out iSettingSize);
iTotalSize += sizeof(int) + iSettingSize;
byte[] pDataBuf = new byte[iTotalSize];
int offset = 0;
// Write version
Buffer.BlockCopy(BitConverter.GetBytes(USERCFG_VERSION), 0, pDataBuf, offset, sizeof(uint));
offset += sizeof(uint);
// Write host block (length + data)
Buffer.BlockCopy(BitConverter.GetBytes(iHostSize), 0, pDataBuf, offset, sizeof(int));
offset += sizeof(int);
pHost.SaveConfigData(pDataBuf, ref iHostSize, offset);
offset += iHostSize;
// Write UI block (length + data)
Buffer.BlockCopy(BitConverter.GetBytes((int)dwUISize), 0, pDataBuf, offset, sizeof(int));
offset += sizeof(int);
pGameUI.GetUserLayout(pDataBuf, ref dwUISize);
offset += (int)dwUISize;
// Write user setting block (length + data)
Buffer.BlockCopy(BitConverter.GetBytes(iSettingSize), 0, pDataBuf, offset, sizeof(int));
offset += sizeof(int);
EC_Game.GetConfigs().SaveUserConfigData(pDataBuf, offset, out iSettingSize);
offset += iSettingSize;
// Here we make a cache. If the data will be sent is same as last
// time, we can ignore it.
// Skip send if data is identical to last time
if (m_pCfgDataBuf != null && m_iCfgDataSize == iTotalSize)
{
bool same = true;
for (int i = 0; i < iTotalSize && same; i++)
same = (m_pCfgDataBuf[i] == pDataBuf[i]);
if (same)
return 1;
}
m_pCfgDataBuf = null;
m_iCfgDataSize = 0;
m_pCfgDataBuf = new byte[iTotalSize];
Buffer.BlockCopy(pDataBuf, 0, m_pCfgDataBuf, 0, iTotalSize);
m_iCfgDataSize = iTotalSize;
// Compress payload (version kept uncompressed)
int iVerLen = sizeof(uint);
int compLen = (iTotalSize - iVerLen) * 2;
byte[] pCompBuf = new byte[iVerLen + compLen];
Buffer.BlockCopy(pDataBuf, 0, pCompBuf, 0, iVerLen);
int iRes = AFilePackage.Compress(pDataBuf, iTotalSize - iVerLen, pCompBuf, iVerLen, ref compLen);
if (iRes == 0)
{
var session = UnityGameSession.Instance?.GameSession;
if (session != null)
{
session.SaveConfigData(pCompBuf, iVerLen + compLen);
return 2;
}
}
else
BMLogger.LogWarning($"CECGameRun::SaveConfigsToServer, Failed to compress config data ({iRes}:{iTotalSize})");
return 0;
}
public void ReleasePendingActions()
{
m_pendingLogout.Clear();
}
public CECPendingActionArray GetPendingLogOut(){ return m_pendingLogout; }
}
public enum GameState
+27
View File
@@ -3525,6 +3525,33 @@ namespace BrewMonster
return true;
}
/// <summary>
/// Save host config (shortcut sets, etc.) to buffer. When pData is null, only outputs size in iHostSize.
/// 保存主机配置(快捷键组等)到缓冲区。pData 为 null 时仅输出 iHostSize。
/// </summary>
/// <param name="writeOffset">When pData is not null, write at this index. 写入时的起始下标。</param>
public bool SaveConfigData(byte[] pData, ref int iHostSize, int writeOffset = 0)
{
var list = new List<byte>();
list.AddRange(BitConverter.GetBytes(HostCfgConstants.HOSTCFG_VERSION));
for (int i = 0; i < m_aSCSets1.Length; i++)
{
if (m_aSCSets1[i] == null || !m_aSCSets1[i].SaveConfigData(out byte[] buf))
continue;
list.AddRange(buf);
}
for (int i = 0; i < m_aSCSets2.Length; i++)
{
if (m_aSCSets2[i] == null || !m_aSCSets2[i].SaveConfigData(out byte[] buf))
continue;
list.AddRange(buf);
}
iHostSize = list.Count;
if (pData != null && writeOffset >= 0 && writeOffset + iHostSize <= pData.Length)
Buffer.BlockCopy(list.ToArray(), 0, pData, writeOffset, iHostSize);
return true;
}
public int GetCharacterID()
{
return m_PlayerInfo.cid;