侧边栏存档菜单UI实现中

This commit is contained in:
ALIENJACK\alien 2025-04-10 15:39:44 +08:00
parent 8bd3b2247b
commit 209c82da80
21 changed files with 847 additions and 114 deletions

View File

@ -35,7 +35,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 143.5, y: -15.666667}
m_AnchoredPosition: {x: 143.5, y: -20}
m_SizeDelta: {x: 183, y: 26}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4761092020446986678
@ -229,8 +229,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 20, y: -15.666667}
m_SizeDelta: {x: 40, y: 31.333334}
m_AnchoredPosition: {x: 20, y: -20}
m_SizeDelta: {x: 40, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7860273967724122996
CanvasRenderer:
@ -325,8 +325,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 40, y: -25.666668}
m_SizeDelta: {x: 40, y: 31.333336}
m_AnchoredPosition: {x: 40, y: -30}
m_SizeDelta: {x: 40, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6442047476311195174
CanvasRenderer:
@ -555,8 +555,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 175.5, y: -134.66667}
m_SizeDelta: {x: 311, y: 31.333334}
m_AnchoredPosition: {x: 155, y: -165}
m_SizeDelta: {x: 270, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &406189280625441644
MonoBehaviour:
@ -625,7 +625,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 321, y: -25.666668}
m_AnchoredPosition: {x: 321, y: -30}
m_SizeDelta: {x: 20, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &8983615257379814102
@ -904,8 +904,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 175.5, y: -171.00002}
m_SizeDelta: {x: 311, y: 31.333334}
m_AnchoredPosition: {x: 155, y: -210}
m_SizeDelta: {x: 270, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1792874459052106251
MonoBehaviour:
@ -978,8 +978,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 170.5, y: -25.666668}
m_SizeDelta: {x: 341, y: 51.333336}
m_AnchoredPosition: {x: 170.5, y: -146}
m_SizeDelta: {x: 341, y: 60}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &9142037267599823005
MonoBehaviour:
@ -1094,7 +1094,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 284, y: -25.666668}
m_AnchoredPosition: {x: 284, y: -30}
m_SizeDelta: {x: 30, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8134207541370216537
@ -1155,6 +1155,104 @@ MonoBehaviour:
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &3474088710924343098
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6878964193873653430}
- component: {fileID: 7910447946506517051}
- component: {fileID: 1245427187698918444}
- component: {fileID: 7858141028076829401}
m_Layer: 5
m_Name: Name
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6878964193873653430
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3474088710924343098}
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: 1100500336380202360}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7910447946506517051
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3474088710924343098}
m_CullTransparentMesh: 1
--- !u!114 &1245427187698918444
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3474088710924343098}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData:
m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3}
m_FontSize: 26
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 1
m_MaxSize: 185
m_Alignment: 0
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 1
m_VerticalOverflow: 1
m_LineSpacing: 1
m_Text: '[MenuName]'
--- !u!114 &7858141028076829401
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3474088710924343098}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0848bff101191904ead4bb831f7084db, type: 3}
m_Name:
m_EditorClassIdentifier:
m_BlurFactor: 1
m_Style: 1
m_AdditionalShadows: []
m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5}
m_EffectDistance: {x: 1.5, y: -1.5}
m_UseGraphicAlpha: 1
--- !u!1 &4124172888520656882
GameObject:
m_ObjectHideFlags: 0
@ -1254,6 +1352,65 @@ RectTransform:
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &4476720122184876793
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5970282275929291192}
- component: {fileID: 2558056583130529771}
m_Layer: 5
m_Name: ScreenNode
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5970282275929291192
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4476720122184876793}
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: 7389645496847632176}
- {fileID: 173892651193427531}
- {fileID: 8150810211498757695}
m_Father: {fileID: 1100500336380202360}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2558056583130529771
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4476720122184876793}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: 300
m_PreferredHeight: 300
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &4478785627166277609
GameObject:
m_ObjectHideFlags: 0
@ -1288,6 +1445,7 @@ RectTransform:
m_Children:
- {fileID: 8581099496228509946}
- {fileID: 2780569438310375802}
- {fileID: 1100500336380202360}
- {fileID: 278706555072840209}
- {fileID: 2404013603202822047}
m_Father: {fileID: 0}
@ -1311,8 +1469,6 @@ MonoBehaviour:
m_EditorClassIdentifier:
MenuRoot: {fileID: 4478785627166277610}
SelectBorder: {fileID: 7857863493876124730}
TEMPLATE_EXECUTEITEM: {fileID: 3721725547312714320}
TEMPLATE_VALUEEDITITEM: {fileID: 2621485483361375335}
--- !u!114 &7033441668005100640
MonoBehaviour:
m_ObjectHideFlags: 0
@ -1373,6 +1529,102 @@ MonoBehaviour:
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &4531500821505527959
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8450003830307438743}
- component: {fileID: 1589970305948971308}
- component: {fileID: 8043128130230171127}
- component: {fileID: 2233123445426827155}
m_Layer: 5
m_Name: Icon
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8450003830307438743
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4531500821505527959}
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: 1100500336380202360}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 170, y: -240.32788}
m_SizeDelta: {x: 40, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1589970305948971308
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4531500821505527959}
m_CullTransparentMesh: 1
--- !u!114 &8043128130230171127
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4531500821505527959}
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: 0}
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 &2233123445426827155
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4531500821505527959}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 1
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: 40
m_PreferredHeight: 40
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &4565892069299376824
GameObject:
m_ObjectHideFlags: 0
@ -1409,6 +1661,78 @@ RectTransform:
m_AnchoredPosition: {x: -5, y: 0}
m_SizeDelta: {x: -20, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &5162569472849600096
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7389645496847632176}
- component: {fileID: 714994651902078554}
- component: {fileID: 1024458178917207864}
m_Layer: 5
m_Name: Screen
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7389645496847632176
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5162569472849600096}
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: 5970282275929291192}
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 &714994651902078554
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5162569472849600096}
m_CullTransparentMesh: 1
--- !u!114 &1024458178917207864
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5162569472849600096}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, 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_Texture: {fileID: 0}
m_UVRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
--- !u!1 &5174902406667317058
GameObject:
m_ObjectHideFlags: 0
@ -1449,8 +1773,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 170.5, y: -149.66667}
m_SizeDelta: {x: 341, y: 196.66667}
m_AnchoredPosition: {x: 150, y: -146}
m_SizeDelta: {x: 300, y: 240}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2621485483361375335
MonoBehaviour:
@ -1651,8 +1975,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 175.5, y: -98.333336}
m_SizeDelta: {x: 311, y: 31.333334}
m_AnchoredPosition: {x: 155, y: -120}
m_SizeDelta: {x: 270, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &9093150501524936851
MonoBehaviour:
@ -1723,8 +2047,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 175.5, y: -25.666668}
m_SizeDelta: {x: 311, y: 31.333334}
m_AnchoredPosition: {x: 155, y: -30}
m_SizeDelta: {x: 270, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &6023196883469018230
MonoBehaviour:
@ -1787,8 +2111,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 155.5, y: -15.666667}
m_SizeDelta: {x: 311, y: 31.333334}
m_AnchoredPosition: {x: 135, y: -20}
m_SizeDelta: {x: 270, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6646371810488858664
CanvasRenderer:
@ -1889,8 +2213,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 106.66667, y: -15.666667}
m_SizeDelta: {x: 213.33334, y: 31.333334}
m_AnchoredPosition: {x: 89.58333, y: -20}
m_SizeDelta: {x: 179.16666, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &5919193658528722431
MonoBehaviour:
@ -1998,8 +2322,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 175.5, y: -62.000004}
m_SizeDelta: {x: 311, y: 31.333334}
m_AnchoredPosition: {x: 155, y: -75}
m_SizeDelta: {x: 270, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2814991476448031351
MonoBehaviour:
@ -2035,6 +2359,81 @@ MonoBehaviour:
m_EditorClassIdentifier:
slider: {fileID: 6489571631904078165}
txt_value: {fileID: 6176548475786947694}
--- !u!1 &6467406772825416429
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 173892651193427531}
- component: {fileID: 4085094471767132086}
- component: {fileID: 8350228378118296958}
m_Layer: 5
m_Name: Empty
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &173892651193427531
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6467406772825416429}
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: 5970282275929291192}
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 &4085094471767132086
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6467406772825416429}
m_CullTransparentMesh: 1
--- !u!114 &8350228378118296958
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6467406772825416429}
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: 0, g: 0, b: 0, 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: 0}
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 &6551251729527098609
GameObject:
m_ObjectHideFlags: 0
@ -2070,8 +2469,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 264.6667, y: -15.666667}
m_SizeDelta: {x: 92.66667, y: 31.333334}
m_AnchoredPosition: {x: 227.08331, y: -20}
m_SizeDelta: {x: 85.83333, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7323868397581272064
CanvasRenderer:
@ -2172,8 +2571,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 106.66667, y: -15.666667}
m_SizeDelta: {x: 213.33334, y: 31.333334}
m_AnchoredPosition: {x: 89.58333, y: -20}
m_SizeDelta: {x: 179.16666, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &6489571631904078165
MonoBehaviour:
@ -2281,7 +2680,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 164.5, y: -25.666668}
m_AnchoredPosition: {x: 164.5, y: -30}
m_SizeDelta: {x: 185, y: 26}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6532365540230118336
@ -2344,6 +2743,189 @@ MonoBehaviour:
m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5}
m_EffectDistance: {x: 1.5, y: -1.5}
m_UseGraphicAlpha: 1
--- !u!1 &7099541800602849681
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1100500336380202360}
- component: {fileID: 20405450890320071}
- component: {fileID: 1975302203658727050}
m_Layer: 5
m_Name: SavSlotItem_Template
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1100500336380202360
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7099541800602849681}
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: 5970282275929291192}
- {fileID: 8450003830307438743}
- {fileID: 6878964193873653430}
m_Father: {fileID: 4478785627166277610}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &20405450890320071
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7099541800602849681}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Padding:
m_Left: 20
m_Right: 10
m_Top: 10
m_Bottom: 10
m_ChildAlignment: 0
m_Spacing: 10
m_ChildForceExpandWidth: 1
m_ChildForceExpandHeight: 1
m_ChildControlWidth: 1
m_ChildControlHeight: 1
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!114 &1975302203658727050
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7099541800602849681}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 688af9c7251c334489191abcae4e0164, type: 3}
m_Name:
m_EditorClassIdentifier:
m_MenuNameTxt: {fileID: 1245427187698918444}
m_Icon: {fileID: 8043128130230171127}
UI_ScreenShot: {fileID: 1024458178917207864}
UI_Empty: {fileID: 8350228378118296958}
UI_SavTime: {fileID: 13043593624240728}
--- !u!1 &7141318786199574664
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8150810211498757695}
- component: {fileID: 7160219150891895322}
- component: {fileID: 13043593624240728}
- component: {fileID: 6806772567731511000}
m_Layer: 5
m_Name: SavTime
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8150810211498757695
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7141318786199574664}
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: 5970282275929291192}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -10, y: -10}
m_SizeDelta: {x: 300, y: 18.613636}
m_Pivot: {x: 1, y: 1}
--- !u!222 &7160219150891895322
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7141318786199574664}
m_CullTransparentMesh: 1
--- !u!114 &13043593624240728
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7141318786199574664}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData:
m_Font: {fileID: 12800000, guid: 33a3bdf8f6bd1ec4eba7c4bc58183212, type: 3}
m_FontSize: 18
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 1
m_MaxSize: 185
m_Alignment: 2
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 1
m_VerticalOverflow: 1
m_LineSpacing: 1
m_Text: '111211
ddsadas'
--- !u!114 &6806772567731511000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7141318786199574664}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0848bff101191904ead4bb831f7084db, type: 3}
m_Name:
m_EditorClassIdentifier:
m_BlurFactor: 1
m_Style: 1
m_AdditionalShadows: []
m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5}
m_EffectDistance: {x: 1.5, y: -1.5}
m_UseGraphicAlpha: 1
--- !u!1 &7579340952198812870
GameObject:
m_ObjectHideFlags: 0
@ -2806,8 +3388,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 264.6667, y: -15.666667}
m_SizeDelta: {x: 92.66667, y: 31.333334}
m_AnchoredPosition: {x: 227.08331, y: -20}
m_SizeDelta: {x: 85.83333, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7497419100168238325
CanvasRenderer:
@ -2981,8 +3563,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 155.5, y: -15.666667}
m_SizeDelta: {x: 311, y: 31.333334}
m_AnchoredPosition: {x: 135, y: -20}
m_SizeDelta: {x: 270, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &88244861463061753
CanvasRenderer:

View File

@ -225,7 +225,7 @@ MonoBehaviour:
bUseLocalWebApi: 0
mLocalWebApi: http://localhost:5051
bEditorUUID: 0
bEditorOpenGUIJoyStick: 1
bEditorOpenGUIJoyStick: 0
--- !u!1 &1498586261
GameObject:
m_ObjectHideFlags: 3

View File

@ -1,7 +1,6 @@
using AxibugEmuOnline.Client.ClientCore;
using AxibugEmuOnline.Client.Tools;
using AxibugProtobuf;
using MAME.Core;
using System;
using System.IO;
using System.Runtime.InteropServices;
@ -23,7 +22,7 @@ namespace AxibugEmuOnline.Client
public RomPlatformType EmuPlatform { get; private set; }
/// <summary> 指示该存档是否为空 </summary>
public bool IsEmpty { get; }
public bool IsEmpty { get; private set; }
/// <summary> 存档文件路径 </summary>
public string FilePath
{
@ -41,7 +40,12 @@ namespace AxibugEmuOnline.Client
/// <summary> 存档顺序号,用于判断云存档和本地存档的同步状态,是否存在冲突 </summary>
public uint Sequecen { get; private set; }
SimpleFSM<SaveFile> FSM;
byte[] m_savDataCaches;
byte[] m_screenShotCaches;
Header m_headerCache;
bool m_cacheOutdate = true;
public SaveFile(int romID, RomPlatformType platform, int slotIndex)
{
@ -55,7 +59,7 @@ namespace AxibugEmuOnline.Client
FSM.AddState<UploadingState>();
FSM.AddState<SyncedState>();
IsEmpty = File.Exists(FilePath);
IsEmpty = !File.Exists(FilePath);
if (IsEmpty) Sequecen = 0;
else //从文件头读取存储序号
@ -83,8 +87,28 @@ namespace AxibugEmuOnline.Client
{
FSM.Update();
}
/// <summary>
/// 获得存档的保存时间(UTC)
/// </summary>
/// <returns></returns>
public DateTime GetSavTimeUTC()
{
GetSavData(out _, out _);
return new DateTime((long)m_headerCache.SavTicks, DateTimeKind.Utc);
}
public unsafe void GetSavData(out byte[] savData, out byte[] screenShotData)
{
if (!m_cacheOutdate)
{
savData = m_savDataCaches;
screenShotData = m_screenShotCaches;
return;
}
m_cacheOutdate = false;
savData = null;
screenShotData = null;
@ -99,15 +123,15 @@ namespace AxibugEmuOnline.Client
return;
}
var header = new Header();
m_headerCache = new Header();
IntPtr ptr = Marshal.AllocHGlobal(headerSize);
Marshal.StructureToPtr(header, ptr, false);
Marshal.StructureToPtr(m_headerCache, ptr, false);
Marshal.Copy(raw, 0, ptr, headerSize);
Marshal.FreeHGlobal(ptr);
savData = new byte[header.DataLength];
savData = new byte[m_headerCache.DataLength];
Array.Copy(raw, headerSize, savData, 0, savData.Length);
screenShotData = new byte[header.ScreenShotLength];
screenShotData = new byte[m_headerCache.ScreenShotLength];
Array.Copy(raw, headerSize + savData.Length, screenShotData, 0, screenShotData.Length);
return;
@ -121,8 +145,9 @@ namespace AxibugEmuOnline.Client
{
Sequence = sequence,
RomID = RomID,
DataLength = savData.Length,
ScreenShotLength = screenShotData.Length
SavTicks = (ulong)DateTime.UtcNow.Ticks,
DataLength = (uint)savData.Length,
ScreenShotLength = (uint)screenShotData.Length,
};
int headerSize = Marshal.SizeOf(typeof(Header));
IntPtr ptr = Marshal.AllocHGlobal(headerSize);
@ -144,6 +169,11 @@ namespace AxibugEmuOnline.Client
File.WriteAllBytes(filePath, raw);
Sequecen = sequence;
m_headerCache = header;
IsEmpty = false;
m_cacheOutdate = true;
}
/// <summary>
@ -157,7 +187,7 @@ namespace AxibugEmuOnline.Client
}
[StructLayout(LayoutKind.Explicit, Size = 16)]
[StructLayout(LayoutKind.Explicit, Size = 24)]
struct Header
{
[FieldOffset(0)]
@ -165,9 +195,11 @@ namespace AxibugEmuOnline.Client
[FieldOffset(4)]
public int RomID;
[FieldOffset(8)]
public int DataLength;
[FieldOffset(12)]
public int ScreenShotLength;
public ulong SavTicks;
[FieldOffset(16)]
public uint DataLength;
[FieldOffset(20)]
public uint ScreenShotLength;
}
public enum EnumState

View File

@ -51,7 +51,7 @@ namespace AxibugEmuOnline.Client
{
if (Datacontext != null && Datacontext.Paramerters.Count > 0)
{
var opts = new List<OptionMenu>();
var opts = new List<InternalOptionMenu>();
opts.Add(new Opt_CreatePreset(Datacontext));
opts.AddRange(Datacontext.Presets.Select(p => new Opt_Presets(Datacontext, p)));
@ -101,7 +101,7 @@ namespace AxibugEmuOnline.Client
private Filter m_filter;
private FilterPreset m_preset;
private OptionUI_MenuItem m_ui;
private List<OptionMenu> m_menu;
private List<InternalOptionMenu> m_menu;
public override string Name => m_preset.Name;
@ -110,7 +110,7 @@ namespace AxibugEmuOnline.Client
m_filter = filter;
m_preset = preset;
m_menu = new List<OptionMenu>();
m_menu = new List<InternalOptionMenu>();
m_menu.Add(new Opt_Delete(m_filter, m_preset));
foreach (var p in m_filter.Paramerters)
{
@ -142,7 +142,7 @@ namespace AxibugEmuOnline.Client
App.settings.Filter.EnableFilter(m_filter);
}
protected override List<OptionMenu> GetOptionMenus()
protected override List<InternalOptionMenu> GetOptionMenus()
{
return m_menu;
}

View File

@ -21,13 +21,13 @@ namespace AxibugEmuOnline.Client
}
}
private List<OptionMenu> m_options;
private List<InternalOptionMenu> m_options;
protected override void Awake()
{
base.Awake();
m_options = new List<OptionMenu>()
m_options = new List<InternalOptionMenu>()
{
new OptMenu_Search(this),
new OptMenu_ShowAll(this),

View File

@ -13,7 +13,7 @@ namespace AxibugEmuOnline.Client
private object m_state;
private StepPerformer m_stepPerformer;
private readonly List<OptionMenu> menus = new List<OptionMenu>();
private readonly List<InternalOptionMenu> menus = new List<InternalOptionMenu>();
public static InGameUI Instance { get; private set; }
public RomFile RomFile { get; private set; }
@ -45,8 +45,9 @@ namespace AxibugEmuOnline.Client
menus.Add(new InGameUI_FilterSetting(this));
menus.Add(new InGameUI_Scaler(this));
menus.Add(new InGameUI_Reset(this));
menus.Add(new InGameUI_SaveState(this));
menus.Add(new InGameUI_LoadState(this));
menus.Add(new InGameUI_SaveStateQuick(this));
menus.Add(new InGameUI_LoadStateQuick(this));
menus.Add(new InGameUI_SaveStateMenu(this));
menus.Add(new InGameUI_QuitGame(this));
base.Awake();

View File

@ -15,11 +15,11 @@ namespace AxibugEmuOnline.Client
m_gameUI = gameUI;
}
protected override List<OptionMenu> GetOptionMenus()
protected override List<InternalOptionMenu> GetOptionMenus()
{
List<OptionMenu> menus = new List<OptionMenu>();
List<InternalOptionMenu> menus = new List<InternalOptionMenu>();
menus.Add(new FilterNone(m_gameUI.RomFile));
menus.AddRange(App.settings.Filter.Filters.Select(f => new FilterMenu(m_gameUI.RomFile, f) as OptionMenu));
menus.AddRange(App.settings.Filter.Filters.Select(f => new FilterMenu(m_gameUI.RomFile, f) as InternalOptionMenu));
return menus;
}
@ -44,7 +44,7 @@ namespace AxibugEmuOnline.Client
public class FilterMenu : ExpandMenu
{
private Filter m_filter;
private List<OptionMenu> m_presetsMenuItems;
private List<InternalOptionMenu> m_presetsMenuItems;
public override bool IsApplied
{
@ -62,11 +62,11 @@ namespace AxibugEmuOnline.Client
public FilterMenu(RomFile rom, Filter filter)
{
m_filter = filter;
m_presetsMenuItems = new List<OptionMenu> { new FilterPresetMenu(rom, m_filter, m_filter.DefaultPreset) };
m_presetsMenuItems = new List<InternalOptionMenu> { new FilterPresetMenu(rom, m_filter, m_filter.DefaultPreset) };
m_presetsMenuItems.AddRange(m_filter.Presets.Select(preset => new FilterPresetMenu(rom, m_filter, preset)));
}
protected override List<OptionMenu> GetOptionMenus()
protected override List<InternalOptionMenu> GetOptionMenus()
{
return m_presetsMenuItems;
}

View File

@ -1,12 +1,12 @@
namespace AxibugEmuOnline.Client
{
public class InGameUI_LoadState : ExecuteMenu
public class InGameUI_LoadStateQuick : ExecuteMenu
{
private InGameUI m_gameUI;
public override bool Visible => !m_gameUI.IsNetPlay;
public override string Name => "读取快照";
public override bool Visible => !m_gameUI.IsNetPlay && m_gameUI.GetQuickState() != null;
public override string Name => "快速读取";
public InGameUI_LoadState(InGameUI gameUI)
public InGameUI_LoadStateQuick(InGameUI gameUI)
{
m_gameUI = gameUI;
}

View File

@ -0,0 +1,51 @@
using AxibugEmuOnline.Client.ClientCore;
using System;
using System.Collections.Generic;
namespace AxibugEmuOnline.Client
{
public class InGameUI_SaveStateMenu : ExpandMenu
{
private InGameUI m_gameUI;
public override string Name => "保存";
public InGameUI_SaveStateMenu(InGameUI inGameUI)
{
m_gameUI = inGameUI;
}
protected override List<InternalOptionMenu> GetOptionMenus()
{
var saveFiles = App.SavMgr.GetSlotSaves(m_gameUI.RomFile.ID, m_gameUI.RomFile.Platform);
List<InternalOptionMenu> result = new List<InternalOptionMenu>();
foreach (var savFile in saveFiles)
{
if (savFile.AutoSave) continue;
result.Add(new SaveSlotMenu(savFile));
}
return result;
}
/// <summary> 存档侧边选项UI </summary>
public class SaveSlotMenu : ExecuteMenu
{
public override Type MenuUITemplateType => typeof(OptionUI_SavSlotItem);
public SaveFile SavFile { get; private set; }
public override bool Visible => !SavFile.AutoSave;
public SaveSlotMenu(SaveFile savFile)
{
SavFile = savFile;
}
public override void OnExcute(OptionUI optionUI, ref bool cancelHide)
{
cancelHide = true;//保存后不关闭
}
public override string Name => SavFile.AutoSave ? "自动存档" : $"存档{SavFile.SlotIndex}";
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 62f9d15054674d646b218039b90d8dd4

View File

@ -3,14 +3,14 @@ using System.Diagnostics;
namespace AxibugEmuOnline.Client
{
public class InGameUI_SaveState : ExecuteMenu
public class InGameUI_SaveStateQuick : ExecuteMenu
{
private InGameUI m_gameUI;
public override bool Visible => !m_gameUI.IsNetPlay;
public override string Name => "保存快照";
public override string Name => "快速保存";
public InGameUI_SaveState(InGameUI gameUI)
public InGameUI_SaveStateQuick(InGameUI gameUI)
{
m_gameUI = gameUI;
}

View File

@ -7,7 +7,7 @@ namespace AxibugEmuOnline.Client
{
public class InGameUI_Scaler : ExpandMenu
{
private List<OptionMenu> m_subMenus = new List<OptionMenu>();
private List<InternalOptionMenu> m_subMenus = new List<InternalOptionMenu>();
public override string Name => "屏幕比例";
public InGameUI_Scaler(InGameUI inGameUI)
{
@ -18,7 +18,7 @@ namespace AxibugEmuOnline.Client
}
}
protected override List<OptionMenu> GetOptionMenus()
protected override List<InternalOptionMenu> GetOptionMenus()
{
return m_subMenus;
}

View File

@ -13,10 +13,7 @@ namespace AxibugEmuOnline.Client
[SerializeField]
Selector SelectBorder;
[Space]
[Header("模板")]
[SerializeField] OptionUI_ExecuteItem TEMPLATE_EXECUTEITEM;
[SerializeField] OptionUI_ValueEditItem TEMPLATE_VALUEEDITITEM;
Dictionary<Type, OptionUI_MenuItem> m_menuUI_templates = new Dictionary<Type, OptionUI_MenuItem>();
private OptionUI m_child;
private OptionUI m_parent;
@ -67,8 +64,11 @@ namespace AxibugEmuOnline.Client
protected override void Awake()
{
TEMPLATE_EXECUTEITEM.gameObject.SetActiveEx(false);
TEMPLATE_VALUEEDITITEM.gameObject.SetActiveEx(false);
foreach (var templateIns in GetComponentsInChildren<OptionUI_MenuItem>(true))
{
m_menuUI_templates[templateIns.GetType()] = templateIns;
templateIns.gameObject.SetActiveEx(false);
}
SelectBorder.gameObject.SetActiveEx(false);
base.Awake();
@ -117,6 +117,7 @@ namespace AxibugEmuOnline.Client
if (m_runtimeMenuItems[currentSelect].Visible)
{
find = true;
break;
}
currentSelect++;
}
@ -154,7 +155,7 @@ namespace AxibugEmuOnline.Client
/// 当菜单弹出时,动态添加一个菜单选项
/// </summary>
/// <param name="menu"></param>
public void AddOptionMenuWhenPoping(OptionMenu menu)
public void AddOptionMenuWhenPoping(InternalOptionMenu menu)
{
if (!m_bPoped) return;
@ -166,7 +167,7 @@ namespace AxibugEmuOnline.Client
SelectBorder.Target = optionUI_MenuItem.transform as RectTransform;
}
public void Pop<T>(List<T> menus, int defaultIndex = 0, Action onClose = null) where T : OptionMenu
public void Pop<T>(List<T> menus, int defaultIndex = 0, Action onClose = null) where T : InternalOptionMenu
{
m_onClose = onClose;
ReleaseRuntimeMenus();
@ -270,25 +271,18 @@ namespace AxibugEmuOnline.Client
}
}
private void CreateRuntimeMenuItem(OptionMenu menuData)
private void CreateRuntimeMenuItem(InternalOptionMenu menuData)
{
if (menuData is ExecuteMenu)
m_menuUI_templates.TryGetValue(menuData.MenuUITemplateType, out var template);
if (template == null)
{
ExecuteMenu executeMenu = (ExecuteMenu)menuData;
var menuUI = Instantiate(TEMPLATE_EXECUTEITEM.gameObject, TEMPLATE_EXECUTEITEM.transform.parent).GetComponent<OptionUI_ExecuteItem>();
menuUI.gameObject.SetActive(true);
menuUI.SetData(this, executeMenu);
m_runtimeMenuItems.Add(menuUI);
}
else if (menuData is ValueSetMenu)
{
var valueSetMenu = (ValueSetMenu)menuData;
var menuUI = Instantiate(TEMPLATE_VALUEEDITITEM.gameObject, TEMPLATE_VALUEEDITITEM.transform.parent).GetComponent<OptionUI_ValueEditItem>();
menuUI.gameObject.SetActive(true);
menuUI.SetData(this, valueSetMenu);
m_runtimeMenuItems.Add(menuUI);
}
else throw new NotImplementedException($"暂不支持的菜单类型{menuData.GetType().Name}");
throw new NotImplementedException($"{menuData.GetType().Name}指定的MenuUI类型实例未在OptionUI中找到");
}
var menuUI = Instantiate(template.gameObject, template.transform.parent).GetComponent<OptionUI_MenuItem>();
menuUI.gameObject.SetActive(true);
menuUI.SetData(this, menuData);
m_runtimeMenuItems.Add(menuUI);
}
private void ReleaseRuntimeMenus()
@ -361,7 +355,7 @@ namespace AxibugEmuOnline.Client
/// <param name="menus"></param>
/// <param name="defaultIndex"></param>
/// <param name="onClose"></param>
public void ExpandSubMenu<T>(List<T> menus, int defaultIndex = 0, Action onClose = null) where T : OptionMenu
public void ExpandSubMenu<T>(List<T> menus, int defaultIndex = 0, Action onClose = null) where T : InternalOptionMenu
{
if (m_child == null)
{
@ -392,8 +386,9 @@ namespace AxibugEmuOnline.Client
/// <summary>
/// 带有执行行为的菜单
/// </summary>
public abstract class ExecuteMenu : OptionMenu
public abstract class ExecuteMenu : InternalOptionMenu
{
public override Type MenuUITemplateType => typeof(OptionUI_ExecuteItem);
/// <summary> 设置这个值以控制菜单中显示"已应用"标记 </summary>
public virtual bool IsApplied { get; }
@ -413,13 +408,14 @@ namespace AxibugEmuOnline.Client
optionUI.ExpandSubMenu(GetOptionMenus());
}
protected abstract List<OptionMenu> GetOptionMenus();
protected abstract List<InternalOptionMenu> GetOptionMenus();
}
/// <summary>
/// 带有值类型显示和编辑的菜单
/// </summary>
public abstract class ValueSetMenu : OptionMenu
public abstract class ValueSetMenu : InternalOptionMenu
{
public override Type MenuUITemplateType => typeof(OptionUI_ValueEditItem);
protected ValueSetMenu() : base() { }
public abstract Type ValueType { get; }
@ -430,8 +426,9 @@ namespace AxibugEmuOnline.Client
}
/// <summary> 不要直接继承这个类 </summary>
public abstract class OptionMenu
public abstract class InternalOptionMenu
{
public abstract Type MenuUITemplateType { get; }
public abstract string Name { get; }
public virtual Sprite Icon { get; }
public virtual bool Visible => true;
@ -439,7 +436,6 @@ namespace AxibugEmuOnline.Client
public virtual void OnFocus() { }
public virtual void OnShow(OptionUI_MenuItem ui) { }
public virtual void OnHide() { }
public virtual void OnHide() { }
}
}

View File

@ -7,7 +7,7 @@ namespace AxibugEmuOnline.Client
public GameObject ExpandFlag;
public GameObject ApplyFlag;
protected override void OnSetData(OptionMenu menuData)
protected override void OnSetData(InternalOptionMenu menuData)
{
base.OnSetData(menuData);

View File

@ -12,9 +12,9 @@ namespace AxibugEmuOnline.Client
public bool Visible => m_Menu.Visible;
public OptionUI OptionUI { get; private set; }
protected OptionMenu m_Menu;
protected InternalOptionMenu m_Menu;
public void SetData(OptionUI optionUI, OptionMenu menuData)
public void SetData(OptionUI optionUI, InternalOptionMenu menuData)
{
OptionUI = optionUI;
m_Menu = menuData;
@ -33,7 +33,7 @@ namespace AxibugEmuOnline.Client
public bool IsExpandMenu => m_Menu is ExpandMenu;
public bool IsApplied => m_Menu is ExecuteMenu om && om.IsApplied;
protected abstract void OnSetData(OptionMenu menuData);
protected abstract void OnSetData(InternalOptionMenu menuData);
public abstract void OnExecute(OptionUI optionUI, ref bool cancelHide);
public virtual void OnLeft() { }
@ -44,11 +44,11 @@ namespace AxibugEmuOnline.Client
}
public abstract class OptionUI_MenuItem<T> : OptionUI_MenuItem
where T : OptionMenu
where T : InternalOptionMenu
{
protected T MenuData => m_Menu as T;
protected override void OnSetData(OptionMenu menuData)
protected override void OnSetData(InternalOptionMenu menuData)
{
MenuData.OnShow(this);
}

View File

@ -0,0 +1,67 @@
using UnityEngine;
using UnityEngine.UI;
using static AxibugEmuOnline.Client.InGameUI_SaveStateMenu;
namespace AxibugEmuOnline.Client
{
public class OptionUI_SavSlotItem : OptionUI_MenuItem<SaveSlotMenu>
{
public RawImage UI_ScreenShot;
public Image UI_Empty;
public Text UI_SavTime;
Texture2D m_screenTex;
protected override void OnSetData(InternalOptionMenu menuData)
{
base.OnSetData(menuData);
RefreshUI();
}
private void RefreshUI()
{
bool isEmpty = MenuData.SavFile.IsEmpty;
UI_ScreenShot.gameObject.SetActiveEx(!isEmpty);
UI_Empty.gameObject.SetActiveEx(isEmpty);
UI_SavTime.gameObject.SetActiveEx(true);
if (isEmpty)
{
UI_SavTime.text = "没有数据";
if (m_screenTex)
{
Destroy(m_screenTex);
m_screenTex = null;
}
}
else
{
var savTime = MenuData.SavFile.GetSavTimeUTC().ToLocalTime();
UI_SavTime.text = $"{savTime.Year}/{savTime.Month}/{savTime.Day}\n{savTime.Hour}:{savTime.Minute}:{savTime.Second}";
MenuData.SavFile.GetSavData(out byte[] savData, out byte[] screenShotData);
if (!m_screenTex) m_screenTex = new Texture2D(1, 1);
m_screenTex.LoadImage(screenShotData);
UI_ScreenShot.texture = m_screenTex;
}
}
public override void OnHide()
{
base.OnHide();
if (m_screenTex)
{
Destroy(m_screenTex);
m_screenTex = null;
}
}
public override void OnExecute(OptionUI optionUI, ref bool cancelHide)
{
MenuData.OnExcute(optionUI, ref cancelHide);
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 688af9c7251c334489191abcae4e0164

View File

@ -16,7 +16,7 @@ namespace AxibugEmuOnline.Client
IValueEditControl m_currentCom;
protected override void OnSetData(OptionMenu menuData)
protected override void OnSetData(InternalOptionMenu menuData)
{
com_floatEdit.gameObject.SetActive(false);
com_intEdit.gameObject.SetActive(false);

View File

@ -34,7 +34,7 @@ namespace AxibugEmuOnline.Client
#endif
}
public static void PopSideBar<T>(List<T> menus, int defaultIndex = 0, Action onClose = null) where T : OptionMenu
public static void PopSideBar<T>(List<T> menus, int defaultIndex = 0, Action onClose = null) where T : InternalOptionMenu
{
s_ins.m_OptionUI.Pop(menus, defaultIndex, onClose);
}