diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/OptionUI.prefab b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/OptionUI.prefab index e8d6c8f..5a20333 100644 --- a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/OptionUI.prefab +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/OptionUI.prefab @@ -1,5 +1,101 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &782102846085628909 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6503369113137645357} + - component: {fileID: 6442047476311195174} + - component: {fileID: 394891843266770919} + - component: {fileID: 5658511545186035791} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6503369113137645357 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 782102846085628909} + 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_Children: [] + m_Father: {fileID: 2780569438310375802} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 25, y: -25} + m_SizeDelta: {x: 40, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6442047476311195174 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 782102846085628909} + m_CullTransparentMesh: 1 +--- !u!114 &394891843266770919 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 782102846085628909} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 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 &5658511545186035791 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 782102846085628909} + 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: 40 + m_PreferredHeight: 40 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 --- !u!1 &793983410033291345 GameObject: m_ObjectHideFlags: 0 @@ -106,13 +202,14 @@ GameObject: m_Component: - component: {fileID: 2780569438310375802} - component: {fileID: 9142037267599823005} + - component: {fileID: 3721725547312714320} m_Layer: 5 m_Name: ExecuteItem_Template m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &2780569438310375802 RectTransform: m_ObjectHideFlags: 0 @@ -124,14 +221,15 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: + - {fileID: 6503369113137645357} - {fileID: 1714682891259844147} m_Father: {fileID: 5397686940312333149} m_RootOrder: 1 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 124.5, y: -540} + m_SizeDelta: {x: 209, y: 50} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &9142037267599823005 MonoBehaviour: @@ -146,12 +244,12 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 m_ChildAlignment: 4 - m_Spacing: 0 + m_Spacing: 12 m_ChildForceExpandWidth: 0 m_ChildForceExpandHeight: 0 m_ChildControlWidth: 1 @@ -159,6 +257,20 @@ MonoBehaviour: m_ChildScaleWidth: 0 m_ChildScaleHeight: 0 m_ReverseArrangement: 0 +--- !u!114 &3721725547312714320 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2500436782395572584} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: eb6aef4a36f116c42a45843286be880c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_MenuNameTxt: {fileID: 1824253632728291860} + m_Icon: {fileID: 394891843266770919} --- !u!1 &3968697266383191021 GameObject: m_ObjectHideFlags: 0 @@ -211,12 +323,12 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Padding: - m_Left: 10 - m_Right: 10 - m_Top: 10 - m_Bottom: 10 + m_Left: 20 + m_Right: 20 + m_Top: 0 + m_Bottom: 0 m_ChildAlignment: 4 - m_Spacing: 0 + m_Spacing: 12 m_ChildForceExpandWidth: 0 m_ChildForceExpandHeight: 0 m_ChildControlWidth: 1 @@ -288,6 +400,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: MenuRoot: {fileID: 5397686940312333149} + TEMPLATE_EXECUTEITEM: {fileID: 3721725547312714320} --- !u!1 &6998597834321643812 GameObject: m_ObjectHideFlags: 0 @@ -318,12 +431,12 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 2780569438310375802} - m_RootOrder: 0 + m_RootOrder: 1 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 130.5, y: -25} + m_SizeDelta: {x: 147, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &6532365540230118336 CanvasRenderer: @@ -355,7 +468,7 @@ MonoBehaviour: m_Calls: [] m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 18 + m_FontSize: 26 m_FontStyle: 0 m_BestFit: 0 m_MinSize: 1 diff --git a/AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity b/AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity index eb85124..9561d07 100644 --- a/AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity +++ b/AxibugEmuOnline.Client/Assets/Scene/AxibugEmuOnline.Client.unity @@ -1482,5 +1482,9 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 5397686940312333149, guid: d3c2508a55398a24db5d68f68d2702ea, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: d3c2508a55398a24db5d68f68d2702ea, type: 3} diff --git a/AxibugEmuOnline.Client/Assets/Script/UI/CommandDispatcher.cs b/AxibugEmuOnline.Client/Assets/Script/UI/CommandDispatcher.cs index cd6b1ca..492e28d 100644 --- a/AxibugEmuOnline.Client/Assets/Script/UI/CommandDispatcher.cs +++ b/AxibugEmuOnline.Client/Assets/Script/UI/CommandDispatcher.cs @@ -1,3 +1,5 @@ +using AxibugEmuOnline.Client.UI; +using System; using System.Collections.Generic; using UnityEngine; @@ -7,29 +9,29 @@ namespace AxibugEmuOnline.Client { public static CommandDispatcher Instance { get; private set; } - List m_register = new List(); - Dictionary m_keyMapper = new Dictionary(); + List m_register = new List(); + Dictionary m_keyMapper = new Dictionary(); private void Awake() { Instance = this; - m_keyMapper.Add(KeyCode.A, MenuItemController.EnumCommand.SelectItemLeft); - m_keyMapper.Add(KeyCode.D, MenuItemController.EnumCommand.SelectItemRight); - m_keyMapper.Add(KeyCode.W, MenuItemController.EnumCommand.SelectItemUp); - m_keyMapper.Add(KeyCode.S, MenuItemController.EnumCommand.SelectItemDown); - m_keyMapper.Add(KeyCode.K, MenuItemController.EnumCommand.Enter); - m_keyMapper.Add(KeyCode.L, MenuItemController.EnumCommand.Back); - m_keyMapper.Add(KeyCode.I, MenuItemController.EnumCommand.OptionMenu); + m_keyMapper.Add(KeyCode.A, EnumCommand.SelectItemLeft); + m_keyMapper.Add(KeyCode.D, EnumCommand.SelectItemRight); + m_keyMapper.Add(KeyCode.W, EnumCommand.SelectItemUp); + m_keyMapper.Add(KeyCode.S, EnumCommand.SelectItemDown); + m_keyMapper.Add(KeyCode.K, EnumCommand.Enter); + m_keyMapper.Add(KeyCode.L, EnumCommand.Back); + m_keyMapper.Add(KeyCode.I, EnumCommand.OptionMenu); - m_keyMapper.Add(KeyCode.LeftArrow, MenuItemController.EnumCommand.SelectItemLeft); - m_keyMapper.Add(KeyCode.RightArrow, MenuItemController.EnumCommand.SelectItemRight); - m_keyMapper.Add(KeyCode.UpArrow, MenuItemController.EnumCommand.SelectItemUp); - m_keyMapper.Add(KeyCode.DownArrow, MenuItemController.EnumCommand.SelectItemDown); - m_keyMapper.Add(KeyCode.Return, MenuItemController.EnumCommand.Enter); - m_keyMapper.Add(KeyCode.Escape, MenuItemController.EnumCommand.Back); - m_keyMapper.Add(KeyCode.RightShift, MenuItemController.EnumCommand.OptionMenu); - m_keyMapper.Add(KeyCode.LeftShift, MenuItemController.EnumCommand.OptionMenu); + m_keyMapper.Add(KeyCode.LeftArrow, EnumCommand.SelectItemLeft); + m_keyMapper.Add(KeyCode.RightArrow, EnumCommand.SelectItemRight); + m_keyMapper.Add(KeyCode.UpArrow, EnumCommand.SelectItemUp); + m_keyMapper.Add(KeyCode.DownArrow, EnumCommand.SelectItemDown); + m_keyMapper.Add(KeyCode.Return, EnumCommand.Enter); + m_keyMapper.Add(KeyCode.Escape, EnumCommand.Back); + m_keyMapper.Add(KeyCode.RightShift, EnumCommand.OptionMenu); + m_keyMapper.Add(KeyCode.LeftShift, EnumCommand.OptionMenu); } private void OnDestroy() @@ -37,19 +39,19 @@ namespace AxibugEmuOnline.Client Instance = null; } - public void RegistController(MenuItemController controller) + public void RegistController(CommandExecuter controller) { if (m_register.Contains(controller)) { return; } m_register.Add(controller); } - public void UnRegistController(MenuItemController menuItemController) + public void UnRegistController(CommandExecuter menuItemController) { m_register.Remove(menuItemController); } - readonly List oneFrameRegister = new List(); + readonly List oneFrameRegister = new List(); private void Update() { foreach (var item in m_keyMapper) @@ -62,7 +64,7 @@ namespace AxibugEmuOnline.Client for (int i = 0; i < oneFrameRegister.Count; i++) { var controller = oneFrameRegister[i]; - if (!controller.enabled) continue; + if (!controller.Enable) continue; controller.ExecuteCommand(item.Value, false); } } @@ -74,11 +76,122 @@ namespace AxibugEmuOnline.Client for (int i = 0; i < oneFrameRegister.Count; i++) { var controller = oneFrameRegister[i]; - if (!controller.enabled) continue; + if (!controller.Enable) continue; controller.ExecuteCommand(item.Value, true); } } } } } + + public abstract class CommandExecuter : MonoBehaviour + { + private PulseInvoker m_pulsInvoker_Left; + private PulseInvoker m_pulsInvoker_Right; + private PulseInvoker m_pulsInvoker_Up; + private PulseInvoker m_pulsInvoker_Down; + + [SerializeField] + float PulseInvoke_Delay = 0.4f; + [SerializeField] + float PulseInvoke_Interval = 0.05f; + + public abstract bool Enable { get; } + + protected virtual void Awake() + { + m_pulsInvoker_Left = new PulseInvoker(OnCmdSelectItemLeft, PulseInvoke_Delay, PulseInvoke_Interval); + m_pulsInvoker_Right = new PulseInvoker(OnCmdSelectItemRight, PulseInvoke_Delay, PulseInvoke_Interval); + m_pulsInvoker_Up = new PulseInvoker(OnCmdSelectItemUp, PulseInvoke_Delay, PulseInvoke_Interval); + m_pulsInvoker_Down = new PulseInvoker(OnCmdSelectItemDown, PulseInvoke_Delay, PulseInvoke_Interval); + } + + protected virtual void Update() + { + m_pulsInvoker_Left.Update(Time.deltaTime); + m_pulsInvoker_Right.Update(Time.deltaTime); + m_pulsInvoker_Up.Update(Time.deltaTime); + m_pulsInvoker_Down.Update(Time.deltaTime); + } + + public void ExecuteCommand(EnumCommand cmd, bool cancel) + { + if (!cancel) + { + switch (cmd) + { + case EnumCommand.SelectItemLeft: + m_pulsInvoker_Left.SetActive(); + OnCmdSelectItemLeft(); + break; + case EnumCommand.SelectItemRight: + m_pulsInvoker_Right.SetActive(); + OnCmdSelectItemRight(); + break; + case EnumCommand.SelectItemUp: + m_pulsInvoker_Up.SetActive(); + OnCmdSelectItemUp(); + break; + case EnumCommand.SelectItemDown: + m_pulsInvoker_Down.SetActive(); + OnCmdSelectItemDown(); + break; + case EnumCommand.Enter: + if (OnCmdEnter()) + { + m_pulsInvoker_Left.DisActive(); + m_pulsInvoker_Right.DisActive(); + m_pulsInvoker_Up.DisActive(); + m_pulsInvoker_Down.DisActive(); + } + break; + case EnumCommand.Back: + OnCmdBack(); + break; + case EnumCommand.OptionMenu: + OnCmdOptionMenu(); + break; + } + } + else + { + switch (cmd) + { + case EnumCommand.SelectItemLeft: + m_pulsInvoker_Left.DisActive(); break; + case EnumCommand.SelectItemRight: + m_pulsInvoker_Right.DisActive(); break; + case EnumCommand.SelectItemUp: + m_pulsInvoker_Up.DisActive(); break; + case EnumCommand.SelectItemDown: + m_pulsInvoker_Down.DisActive(); break; + } + } + } + + protected virtual void OnCmdSelectItemLeft() { } + + protected virtual void OnCmdSelectItemRight() { } + + protected virtual void OnCmdSelectItemUp() { } + + protected virtual void OnCmdSelectItemDown() { } + + protected virtual void OnCmdOptionMenu() { } + protected virtual bool OnCmdEnter() => false; + protected virtual void OnCmdBack() { } + protected abstract void OnSelectMenuChanged(); + + } + + public enum EnumCommand + { + SelectItemLeft, + SelectItemRight, + SelectItemUp, + SelectItemDown, + Enter, + Back, + OptionMenu + } } diff --git a/AxibugEmuOnline.Client/Assets/Script/UI/MenuItemController.cs b/AxibugEmuOnline.Client/Assets/Script/UI/MenuItemController.cs index b34e6ac..d09e73e 100644 --- a/AxibugEmuOnline.Client/Assets/Script/UI/MenuItemController.cs +++ b/AxibugEmuOnline.Client/Assets/Script/UI/MenuItemController.cs @@ -4,35 +4,15 @@ using UnityEngine; namespace AxibugEmuOnline.Client { - public abstract class MenuItemController : MonoBehaviour + public abstract class MenuItemController : CommandExecuter { - public enum EnumCommand - { - SelectItemLeft, - SelectItemRight, - SelectItemUp, - SelectItemDown, - Enter, - Back, - OptionMenu - } - - [SerializeField] protected Transform m_menuItemRoot; protected List m_runtimeMenuUI = new List(); + public override bool Enable => enabled; - private PulseInvoker m_pulsInvoker_Left; - private PulseInvoker m_pulsInvoker_Right; - private PulseInvoker m_pulsInvoker_Up; - private PulseInvoker m_pulsInvoker_Down; private MenuItem m_enteredItem = null; - [SerializeField] - float PulseInvoke_Delay = 0.4f; - [SerializeField] - float PulseInvoke_Interval = 0.05f; - protected int m_selectIndex = -1; public virtual int SelectIndex @@ -61,87 +41,6 @@ namespace AxibugEmuOnline.Client Canvas.ForceUpdateCanvases(); SelectIndex = 0; - - m_pulsInvoker_Left = new PulseInvoker(OnCmdSelectItemLeft, PulseInvoke_Delay, PulseInvoke_Interval); - m_pulsInvoker_Right = new PulseInvoker(OnCmdSelectItemRight, PulseInvoke_Delay, PulseInvoke_Interval); - m_pulsInvoker_Up = new PulseInvoker(OnCmdSelectItemUp, PulseInvoke_Delay, PulseInvoke_Interval); - m_pulsInvoker_Down = new PulseInvoker(OnCmdSelectItemDown, PulseInvoke_Delay, PulseInvoke_Interval); - } - - - protected virtual void Update() - { - m_pulsInvoker_Left.Update(Time.deltaTime); - m_pulsInvoker_Right.Update(Time.deltaTime); - m_pulsInvoker_Up.Update(Time.deltaTime); - m_pulsInvoker_Down.Update(Time.deltaTime); - } - - public void ExecuteCommand(EnumCommand cmd, bool cancel) - { - if (!cancel) - { - switch (cmd) - { - case EnumCommand.SelectItemLeft: - m_pulsInvoker_Left.SetActive(); - OnCmdSelectItemLeft(); - break; - case EnumCommand.SelectItemRight: - m_pulsInvoker_Right.SetActive(); - OnCmdSelectItemRight(); - break; - case EnumCommand.SelectItemUp: - m_pulsInvoker_Up.SetActive(); - OnCmdSelectItemUp(); - break; - case EnumCommand.SelectItemDown: - m_pulsInvoker_Down.SetActive(); - OnCmdSelectItemDown(); - break; - case EnumCommand.Enter: - if (m_enteredItem == null) - { - var willEnterItem = GetItemUIByIndex(SelectIndex); - bool res = OnCmdEnter(willEnterItem); - if (res) - { - m_enteredItem = willEnterItem; - - m_pulsInvoker_Left.DisActive(); - m_pulsInvoker_Right.DisActive(); - m_pulsInvoker_Up.DisActive(); - m_pulsInvoker_Down.DisActive(); - } - - } - break; - case EnumCommand.Back: - if (m_enteredItem != null) - { - OnCmdBack(m_enteredItem); - m_enteredItem = null; - } - break; - case EnumCommand.OptionMenu: - OnCmdOptionMenu(); - break; - } - } - else - { - switch (cmd) - { - case EnumCommand.SelectItemLeft: - m_pulsInvoker_Left.DisActive(); break; - case EnumCommand.SelectItemRight: - m_pulsInvoker_Right.DisActive(); break; - case EnumCommand.SelectItemUp: - m_pulsInvoker_Up.DisActive(); break; - case EnumCommand.SelectItemDown: - m_pulsInvoker_Down.DisActive(); break; - } - } } protected virtual MenuItem GetItemUIByIndex(int index) @@ -149,19 +48,30 @@ namespace AxibugEmuOnline.Client return m_runtimeMenuUI[SelectIndex]; } - protected virtual void OnCmdSelectItemLeft() { } + protected override bool OnCmdEnter() + { + if (m_enteredItem == null) + { + var willEnterItem = GetItemUIByIndex(SelectIndex); + bool res = willEnterItem.OnEnterItem(); + if (res) + { + m_enteredItem = willEnterItem; + } + return res; + } - protected virtual void OnCmdSelectItemRight() { } - - protected virtual void OnCmdSelectItemUp() { } - - protected virtual void OnCmdSelectItemDown() { } - - protected virtual void OnCmdOptionMenu() { } - protected virtual bool OnCmdEnter(MenuItem item) => item.OnEnterItem(); - protected virtual bool OnCmdBack(MenuItem item) => item.OnExitItem(); - protected abstract void OnSelectMenuChanged(); + return false; + } + protected override void OnCmdBack() + { + if (m_enteredItem != null) + { + m_enteredItem.OnExitItem(); + m_enteredItem = null; + } + } } public abstract class MenuItemController : MenuItemController @@ -189,10 +99,5 @@ namespace AxibugEmuOnline.Client if (CommandDispatcher.Instance != null) CommandDispatcher.Instance.UnRegistController(this); } - - - - - } } diff --git a/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI.cs b/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI.cs deleted file mode 100644 index 03ebfdd..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace AxibugEmuOnline.Client -{ - public class OptionUI : MonoBehaviour - { - public static OptionUI Instance { get; private set; } - - [SerializeField] - RectTransform MenuRoot; - - private bool m_bPoped = false; - - private void Awake() - { - Instance = this; - } - - private void Start() - { - Canvas.ForceUpdateCanvases(); - var width = MenuRoot.rect.size.x; - var temp = MenuRoot.anchoredPosition; - temp.x = -width; - } - - public void Pop(IEnumerable menus) - { - } - - public void Hide() - { - - } - } - - public abstract class OptionMenu - { - public string Name { get; protected set; } - - public OptionMenu(string name) - { - Name = name; - } - } - - public abstract class ExecuteMenu : OptionMenu - { - protected ExecuteMenu(string name) : base(name) { } - - public abstract void OnExcute(); - } - - public abstract class ValueSetMenu : OptionMenu - { - protected ValueSetMenu(string name) : base(name) { } - - public abstract Type ValueType { get; } - public abstract object ValueRaw { get; } - public abstract void OnValueChanged(object newValue); - } - - public abstract class ValueSetMenu : ValueSetMenu - { - public sealed override Type ValueType => typeof(T); - - public T Value { get; private set; } - - public sealed override object ValueRaw => Value; - - public sealed override void OnValueChanged(object newValue) - { - Value = (T)newValue; - } - protected ValueSetMenu(string name) : base(name) { } - } -} diff --git a/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI.meta b/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI.meta new file mode 100644 index 0000000..ab20c77 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 65c17e13e38c7dd459e5c74ff9b37e87 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI/OptionUI.cs b/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI/OptionUI.cs new file mode 100644 index 0000000..1de156f --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI/OptionUI.cs @@ -0,0 +1,166 @@ +using DG.Tweening; +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace AxibugEmuOnline.Client +{ + public class OptionUI : CommandExecuter + { + public static OptionUI Instance { get; private set; } + + [SerializeField] + RectTransform MenuRoot; + + [Space] + [Header("Ä£°å")] + [SerializeField] OptionUI_ExecuteItem TEMPLATE_EXECUTEITEM; + + private bool m_bPoped = false; + private List m_runtimeMenuItems = new List(); + + protected override void Awake() + { + Instance = this; + TEMPLATE_EXECUTEITEM.gameObject.SetActiveEx(false); + + base.Awake(); + } + + private void Start() + { + Canvas.ForceUpdateCanvases(); + var width = MenuRoot.rect.size.x; + var temp = MenuRoot.anchoredPosition; + temp.x = width; + MenuRoot.anchoredPosition = temp; + } + + protected override void Update() + { + if (Input.GetKeyDown(KeyCode.T)) + { + if (m_bPoped) Hide(); + else Pop(new List + { + new ExecuteMenu("²âÊԲ˵¥1"), + new ExecuteMenu("Copilot"), + new ExecuteMenu("ChatGPT 4o"), + }); + } + } + + public void Pop(IEnumerable menus) + { + ReleaseRuntimeMenus(); + foreach (var menu in menus) CreateRuntimeMenuItem(menu); + CommandDispatcher.Instance.RegistController(this); + if (!m_bPoped) + { + m_bPoped = true; + DOTween.To( + () => MenuRoot.anchoredPosition.x, + (value) => + { + var temp = MenuRoot.anchoredPosition; + temp.x = value; + MenuRoot.anchoredPosition = temp; + }, + 0, + 0.3f + ).SetEase(Ease.OutCubic); + } + } + + public void Hide() + { + if (m_bPoped) + { + m_bPoped = false; + Canvas.ForceUpdateCanvases(); + var width = MenuRoot.rect.width; + DOTween.To( + () => MenuRoot.anchoredPosition.x, + (value) => + { + var temp = MenuRoot.anchoredPosition; + temp.x = value; + MenuRoot.anchoredPosition = temp; + }, + width, + 0.3f + ).SetEase(Ease.OutCubic); + } + } + + private void CreateRuntimeMenuItem(OptionMenu menuData) + { + if (menuData is ExecuteMenu executeMenu) + { + var menuUI = GameObject.Instantiate(TEMPLATE_EXECUTEITEM.gameObject, TEMPLATE_EXECUTEITEM.transform.parent).GetComponent(); + menuUI.gameObject.SetActive(true); + menuUI.SetData(executeMenu); + m_runtimeMenuItems.Add(menuUI); + } + } + + private void ReleaseRuntimeMenus() + { + foreach (var item in m_runtimeMenuItems) + { + Destroy(item.gameObject); + } + m_runtimeMenuItems.Clear(); + } + + public override bool Enable => m_bPoped; + + protected override void OnSelectMenuChanged() + { + + } + } + + public abstract class OptionMenu + { + public string Name { get; protected set; } + public Sprite Icon { get; protected set; } + public OptionMenu(string name, Sprite icon = null) + { + Name = name; + Icon = icon; + } + } + + public class ExecuteMenu : OptionMenu + { + public ExecuteMenu(string name, Sprite icon = null) : base(name, icon) { } + + public virtual void OnExcute() { } + } + + public abstract class ValueSetMenu : OptionMenu + { + public ValueSetMenu(string name) : base(name) { } + + public abstract Type ValueType { get; } + public abstract object ValueRaw { get; } + public abstract void OnValueChanged(object newValue); + } + + public class ValueSetMenu : ValueSetMenu + { + public sealed override Type ValueType => typeof(T); + + public T Value { get; private set; } + + public sealed override object ValueRaw => Value; + + public sealed override void OnValueChanged(object newValue) + { + Value = (T)newValue; + } + protected ValueSetMenu(string name) : base(name) { } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI.cs.meta b/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI/OptionUI.cs.meta similarity index 100% rename from AxibugEmuOnline.Client/Assets/Script/UI/OptionUI.cs.meta rename to AxibugEmuOnline.Client/Assets/Script/UI/OptionUI/OptionUI.cs.meta diff --git a/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI/OptionUI_ExecuteItem.cs b/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI/OptionUI_ExecuteItem.cs new file mode 100644 index 0000000..0208f2f --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI/OptionUI_ExecuteItem.cs @@ -0,0 +1,22 @@ +using UnityEngine; +using UnityEngine.UI; + +namespace AxibugEmuOnline.Client +{ + public class OptionUI_ExecuteItem : MonoBehaviour + { + [SerializeField] Text m_MenuNameTxt; + [SerializeField] Image m_Icon; + + public void SetData(ExecuteMenu executeMenu) + { + m_MenuNameTxt.text = executeMenu.Name; + if (executeMenu.Icon == null) m_Icon.gameObject.SetActiveEx(false); + else + { + m_Icon.gameObject.SetActiveEx(true); + m_Icon.sprite = executeMenu.Icon; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI/OptionUI_ExecuteItem.cs.meta b/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI/OptionUI_ExecuteItem.cs.meta new file mode 100644 index 0000000..b3fb48f --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI/OptionUI_ExecuteItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eb6aef4a36f116c42a45843286be880c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/UI/SubMenuItemGroup.cs b/AxibugEmuOnline.Client/Assets/Script/UI/SubMenuItemGroup.cs index eeacb02..4a6b605 100644 --- a/AxibugEmuOnline.Client/Assets/Script/UI/SubMenuItemGroup.cs +++ b/AxibugEmuOnline.Client/Assets/Script/UI/SubMenuItemGroup.cs @@ -22,10 +22,12 @@ namespace AxibugEmuOnline.Client private TweenerCore rollTween; - protected virtual void Awake() + protected override void Awake() { m_selected = false; if (alphaGroup != null) alphaGroup.alpha = 0; + + base.Awake(); } public override void Init(List menuDataList) @@ -62,22 +64,22 @@ namespace AxibugEmuOnline.Client } } - protected override bool OnCmdEnter(MenuItem item) + protected override bool OnCmdEnter() { LaunchUI.Instance.ToDetailMenuLayout(); + base.OnCmdEnter(); + var item = GetItemUIByIndex(SelectIndex); item.SetSelectState(false); - base.OnCmdEnter(item); return true; } - protected override bool OnCmdBack(MenuItem item) + protected override void OnCmdBack() { + base.OnCmdBack(); LaunchUI.Instance.ToMainMenuLayout(); + var item = GetItemUIByIndex(SelectIndex); item.SetSelectState(true); - base.OnCmdBack(item); - - return true; } protected override void OnCmdSelectItemUp() diff --git a/AxibugEmuOnline.Client/Assets/Script/UI/ThirdMenuRoot.cs b/AxibugEmuOnline.Client/Assets/Script/UI/ThirdMenuRoot.cs index 74b6a40..67b02fe 100644 --- a/AxibugEmuOnline.Client/Assets/Script/UI/ThirdMenuRoot.cs +++ b/AxibugEmuOnline.Client/Assets/Script/UI/ThirdMenuRoot.cs @@ -60,14 +60,16 @@ namespace AxibugEmuOnline.Client public override void Init(List menuDataList) { } - protected override bool OnCmdEnter(MenuItem item) + protected override bool OnCmdEnter() { + var item = GetItemUIByIndex(SelectIndex); return item.OnEnterItem(); } - protected override bool OnCmdBack(MenuItem item) + protected override void OnCmdBack() { - return item.OnExitItem(); + var item = GetItemUIByIndex(SelectIndex); + item.OnExitItem(); } private void LateUpdate()