diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/OptionUI.prefab b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/OptionUI.prefab
index 73c3cd97..94f5a72d 100644
--- a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/OptionUI.prefab
+++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/OptionUI.prefab
@@ -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:
diff --git a/AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity b/AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity
index a9ce8555..eb2adf4c 100644
--- a/AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity
+++ b/AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity
@@ -225,7 +225,7 @@ MonoBehaviour:
bUseLocalWebApi: 0
mLocalWebApi: http://localhost:5051
bEditorUUID: 0
- bEditorOpenGUIJoyStick: 1
+ bEditorOpenGUIJoyStick: 0
--- !u!1 &1498586261
GameObject:
m_ObjectHideFlags: 3
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFile.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFile.cs
index 97252644..d722627b 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFile.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFile.cs
@@ -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; }
/// 指示该存档是否为空
- public bool IsEmpty { get; }
+ public bool IsEmpty { get; private set; }
/// 存档文件路径
public string FilePath
{
@@ -41,7 +40,12 @@ namespace AxibugEmuOnline.Client
/// 存档顺序号,用于判断云存档和本地存档的同步状态,是否存在冲突
public uint Sequecen { get; private set; }
+
SimpleFSM 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();
FSM.AddState();
- IsEmpty = File.Exists(FilePath);
+ IsEmpty = !File.Exists(FilePath);
if (IsEmpty) Sequecen = 0;
else //从文件头读取存储序号
@@ -83,8 +87,28 @@ namespace AxibugEmuOnline.Client
{
FSM.Update();
}
+
+ ///
+ /// 获得存档的保存时间(UTC)
+ ///
+ ///
+ 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;
}
///
@@ -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
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/BgSettingsUI/UI_FilterItem.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/BgSettingsUI/UI_FilterItem.cs
index c93b4d5b..54f40ec4 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/BgSettingsUI/UI_FilterItem.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/BgSettingsUI/UI_FilterItem.cs
@@ -51,7 +51,7 @@ namespace AxibugEmuOnline.Client
{
if (Datacontext != null && Datacontext.Paramerters.Count > 0)
{
- var opts = new List();
+ var opts = new List();
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 m_menu;
+ private List 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();
+ m_menu = new List();
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 GetOptionMenus()
+ protected override List GetOptionMenus()
{
return m_menu;
}
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/GamesUI/RomListMenuItem.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/GamesUI/RomListMenuItem.cs
index 6a7338d3..eba1f4a7 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/GamesUI/RomListMenuItem.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/GamesUI/RomListMenuItem.cs
@@ -21,13 +21,13 @@ namespace AxibugEmuOnline.Client
}
}
- private List m_options;
+ private List m_options;
protected override void Awake()
{
base.Awake();
- m_options = new List()
+ m_options = new List()
{
new OptMenu_Search(this),
new OptMenu_ShowAll(this),
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI.cs
index 08e9b095..dcf73f6e 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI.cs
@@ -13,7 +13,7 @@ namespace AxibugEmuOnline.Client
private object m_state;
private StepPerformer m_stepPerformer;
- private readonly List menus = new List();
+ private readonly List menus = new List();
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();
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_FilterSetting.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_FilterSetting.cs
index aaf24689..402032e9 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_FilterSetting.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_FilterSetting.cs
@@ -15,11 +15,11 @@ namespace AxibugEmuOnline.Client
m_gameUI = gameUI;
}
- protected override List GetOptionMenus()
+ protected override List GetOptionMenus()
{
- List menus = new List();
+ List menus = new List();
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 m_presetsMenuItems;
+ private List 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 { new FilterPresetMenu(rom, m_filter, m_filter.DefaultPreset) };
+ m_presetsMenuItems = new List { 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 GetOptionMenus()
+ protected override List GetOptionMenus()
{
return m_presetsMenuItems;
}
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_LoadState.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_LoadStateQuick.cs
similarity index 62%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_LoadState.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_LoadStateQuick.cs
index 9aa0d1b5..b4b39e24 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_LoadState.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_LoadStateQuick.cs
@@ -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;
}
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_LoadState.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_LoadStateQuick.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_LoadState.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_LoadStateQuick.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateMenu.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateMenu.cs
new file mode 100644
index 00000000..1bed10d8
--- /dev/null
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateMenu.cs
@@ -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 GetOptionMenus()
+ {
+ var saveFiles = App.SavMgr.GetSlotSaves(m_gameUI.RomFile.ID, m_gameUI.RomFile.Platform);
+ List result = new List();
+ foreach (var savFile in saveFiles)
+ {
+ if (savFile.AutoSave) continue;
+ result.Add(new SaveSlotMenu(savFile));
+ }
+ return result;
+ }
+
+ /// 存档侧边选项UI
+ 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}";
+ }
+ }
+}
\ No newline at end of file
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateMenu.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateMenu.cs.meta
new file mode 100644
index 00000000..b202a3ea
--- /dev/null
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateMenu.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 62f9d15054674d646b218039b90d8dd4
\ No newline at end of file
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveState.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateQuick.cs
similarity index 80%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveState.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateQuick.cs
index c6cbee4d..f8a51a1b 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveState.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateQuick.cs
@@ -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;
}
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveState.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateQuick.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveState.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateQuick.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_Scaler.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_Scaler.cs
index 6e86197e..4c9fad7e 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_Scaler.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_Scaler.cs
@@ -7,7 +7,7 @@ namespace AxibugEmuOnline.Client
{
public class InGameUI_Scaler : ExpandMenu
{
- private List m_subMenus = new List();
+ private List m_subMenus = new List();
public override string Name => "屏幕比例";
public InGameUI_Scaler(InGameUI inGameUI)
{
@@ -18,7 +18,7 @@ namespace AxibugEmuOnline.Client
}
}
- protected override List GetOptionMenus()
+ protected override List GetOptionMenus()
{
return m_subMenus;
}
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI.cs
index ec5ee71a..6a517274 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI.cs
@@ -13,10 +13,7 @@ namespace AxibugEmuOnline.Client
[SerializeField]
Selector SelectBorder;
- [Space]
- [Header("模板")]
- [SerializeField] OptionUI_ExecuteItem TEMPLATE_EXECUTEITEM;
- [SerializeField] OptionUI_ValueEditItem TEMPLATE_VALUEEDITITEM;
+ Dictionary m_menuUI_templates = new Dictionary();
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(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
/// 当菜单弹出时,动态添加一个菜单选项
///
///
- 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(List menus, int defaultIndex = 0, Action onClose = null) where T : OptionMenu
+ public void Pop(List 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();
- 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();
- 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();
+ menuUI.gameObject.SetActive(true);
+ menuUI.SetData(this, menuData);
+ m_runtimeMenuItems.Add(menuUI);
}
private void ReleaseRuntimeMenus()
@@ -361,7 +355,7 @@ namespace AxibugEmuOnline.Client
///
///
///
- public void ExpandSubMenu(List menus, int defaultIndex = 0, Action onClose = null) where T : OptionMenu
+ public void ExpandSubMenu(List menus, int defaultIndex = 0, Action onClose = null) where T : InternalOptionMenu
{
if (m_child == null)
{
@@ -392,8 +386,9 @@ namespace AxibugEmuOnline.Client
///
/// 带有执行行为的菜单
///
- public abstract class ExecuteMenu : OptionMenu
+ public abstract class ExecuteMenu : InternalOptionMenu
{
+ public override Type MenuUITemplateType => typeof(OptionUI_ExecuteItem);
/// 设置这个值以控制菜单中显示"已应用"标记
public virtual bool IsApplied { get; }
@@ -413,13 +408,14 @@ namespace AxibugEmuOnline.Client
optionUI.ExpandSubMenu(GetOptionMenus());
}
- protected abstract List GetOptionMenus();
+ protected abstract List GetOptionMenus();
}
///
/// 带有值类型显示和编辑的菜单
///
- 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
}
/// 不要直接继承这个类
- 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() { }
}
-
}
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_ExecuteItem.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_ExecuteItem.cs
index 8228f985..0fc4e903 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_ExecuteItem.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_ExecuteItem.cs
@@ -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);
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_MenuItem.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_MenuItem.cs
index b492a171..9f1f9ba1 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_MenuItem.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_MenuItem.cs
@@ -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 : 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);
}
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_SavSlotItem.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_SavSlotItem.cs
new file mode 100644
index 00000000..69542533
--- /dev/null
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_SavSlotItem.cs
@@ -0,0 +1,67 @@
+using UnityEngine;
+using UnityEngine.UI;
+using static AxibugEmuOnline.Client.InGameUI_SaveStateMenu;
+
+namespace AxibugEmuOnline.Client
+{
+ public class OptionUI_SavSlotItem : OptionUI_MenuItem
+ {
+ 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);
+ }
+ }
+}
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_SavSlotItem.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_SavSlotItem.cs.meta
new file mode 100644
index 00000000..405dbc8d
--- /dev/null
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_SavSlotItem.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 688af9c7251c334489191abcae4e0164
\ No newline at end of file
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_ValueEditItem.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_ValueEditItem.cs
index 2f76e0d3..9f8ff3b4 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_ValueEditItem.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_ValueEditItem.cs
@@ -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);
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OverlayUI/OverlayManager.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OverlayUI/OverlayManager.cs
index 08f2ad08..73fe0bec 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OverlayUI/OverlayManager.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OverlayUI/OverlayManager.cs
@@ -34,7 +34,7 @@ namespace AxibugEmuOnline.Client
#endif
}
- public static void PopSideBar(List menus, int defaultIndex = 0, Action onClose = null) where T : OptionMenu
+ public static void PopSideBar(List menus, int defaultIndex = 0, Action onClose = null) where T : InternalOptionMenu
{
s_ins.m_OptionUI.Pop(menus, defaultIndex, onClose);
}