AxibugEmuOnline/AxibugEmuOnline.Client/Assets/Script/UI/OptionUI/OptionUI.cs

209 lines
6.5 KiB
C#
Raw Normal View History

2024-09-12 15:08:48 +08:00
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;
2024-09-12 17:47:05 +08:00
[SerializeField]
RectTransform SelectBorder;
2024-09-12 15:08:48 +08:00
[Space]
[Header("ģ<><C4A3>")]
[SerializeField] OptionUI_ExecuteItem TEMPLATE_EXECUTEITEM;
public override bool AloneMode => true;
2024-09-12 17:47:05 +08:00
public override bool Enable => m_bPoped;
2024-09-12 15:08:48 +08:00
private bool m_bPoped = false;
2024-09-13 10:28:02 +08:00
private List<OptionUI_MenuItem> m_runtimeMenuItems = new List<OptionUI_MenuItem>();
2024-09-12 15:08:48 +08:00
2024-09-12 17:47:05 +08:00
private int m_selectIndex = -1;
public int SelectIndex
{
get { return m_selectIndex; }
set
{
value = Mathf.Clamp(value, 0, m_runtimeMenuItems.Count - 1);
if (m_selectIndex == value) return;
m_selectIndex = value;
2024-09-13 10:28:02 +08:00
OptionUI_MenuItem optionUI_MenuItem = m_runtimeMenuItems[m_selectIndex];
optionUI_MenuItem.OnFocus();
var itemUIRect = optionUI_MenuItem.transform as RectTransform;
2024-09-12 17:47:05 +08:00
SelectBorder.pivot = itemUIRect.pivot;
SelectBorder.sizeDelta = itemUIRect.rect.size;
DOTween.To(() => SelectBorder.position, (value) => SelectBorder.position = value, itemUIRect.position, 0.125f);
SelectBorder.SetAsLastSibling();
}
}
2024-09-12 15:08:48 +08:00
protected override void Awake()
{
Instance = this;
TEMPLATE_EXECUTEITEM.gameObject.SetActiveEx(false);
2024-09-12 17:47:05 +08:00
SelectBorder.gameObject.SetActiveEx(false);
2024-09-12 15:08:48 +08:00
base.Awake();
}
private void Start()
{
Canvas.ForceUpdateCanvases();
var width = MenuRoot.rect.size.x;
var temp = MenuRoot.anchoredPosition;
temp.x = width;
MenuRoot.anchoredPosition = temp;
}
2024-09-13 10:28:02 +08:00
public void Pop(List<OptionMenu> menus, int defaultIndex = 0)
2024-09-12 15:08:48 +08:00
{
ReleaseRuntimeMenus();
foreach (var menu in menus) CreateRuntimeMenuItem(menu);
CommandDispatcher.Instance.RegistController(this);
2024-09-12 17:47:05 +08:00
SelectBorder.gameObject.SetActiveEx(true);
Canvas.ForceUpdateCanvases();
m_selectIndex = 0;
2024-09-13 10:28:02 +08:00
OptionUI_MenuItem optionUI_MenuItem = m_runtimeMenuItems[defaultIndex];
optionUI_MenuItem.OnFocus();
var itemUIRect = optionUI_MenuItem.transform as RectTransform;
2024-09-12 17:47:05 +08:00
SelectBorder.pivot = itemUIRect.pivot;
SelectBorder.position = itemUIRect.position;
SelectBorder.sizeDelta = itemUIRect.rect.size;
SelectBorder.SetAsLastSibling();
2024-09-12 15:08:48 +08:00
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)
{
2024-09-12 17:47:05 +08:00
SelectBorder.gameObject.SetActiveEx(false);
CommandDispatcher.Instance.UnRegistController(this);
2024-09-12 15:08:48 +08:00
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<OptionUI_ExecuteItem>();
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();
}
2024-09-12 17:47:05 +08:00
protected override void OnCmdSelectItemDown()
2024-09-12 15:08:48 +08:00
{
2024-09-12 17:47:05 +08:00
SelectIndex++;
}
2024-09-12 17:47:05 +08:00
protected override void OnCmdSelectItemUp()
{
SelectIndex--;
2024-09-12 15:08:48 +08:00
}
2024-09-13 10:28:02 +08:00
protected override void OnCmdBack()
{
Hide();
}
protected override bool OnCmdEnter()
{
m_runtimeMenuItems[SelectIndex].OnExecute();
return true;
}
2024-09-12 15:08:48 +08:00
}
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<T> : 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) { }
}
}