using System; using UnityEngine; using UnityEngine.UI; using UnityEngine.Events; using UnityEngine.EventSystems; using UnityEngine.Serialization; /// <summary> /// 开关按钮 /// </summary> public class UISwitchButton : MonoBehaviour, IPointerClickHandler { public bool interactable = true; [SerializeField] private Text m_Text; [SerializeField] private Image m_Image; public Sprite openSprite; public Sprite closeSprite; public string openText; public string closeText; [SerializeField] private ButtonState m_State; #region 校验事件 [Serializable] public class ValidateEventArgs { public bool cancel; } private ValidateEventArgs m_ValidateEventArgs = new ValidateEventArgs(); [Serializable] public class ValidateEvent : UnityEvent<ValidateEventArgs> { } [FormerlySerializedAs("onValidate")] [SerializeField] private ValidateEvent m_OnValidate = new ValidateEvent(); public ValidateEvent OnValidate { get { return m_OnValidate; } } #endregion #region 状态变化事件 [Serializable] public class StateChangedEvent : UnityEvent<UISwitchButton> { } [FormerlySerializedAs("onChangedState")] [SerializeField] private StateChangedEvent m_OnChangedState = new StateChangedEvent(); public StateChangedEvent OnChangedState { get { return m_OnChangedState; } } public enum ButtonState { Open, Close } #endregion public void Reset() { m_State = ButtonState.Open; UpdateDisplay(); } private void Awake() { UpdateDisplay(); } public void OnPointerClick(PointerEventData eventData) { if (interactable) OnClick(); } public void UpdateDisplay() { if (m_State == ButtonState.Open) { if (m_Text != null) m_Text.text = openText; if (m_Image != null) m_Image.sprite = openSprite; } else { if (m_Text != null) m_Text.text = closeText; if (m_Image != null) m_Image.sprite = closeSprite; } } public void OnClick() { m_ValidateEventArgs.cancel = false; m_OnValidate?.Invoke(m_ValidateEventArgs); //外部取消了点击事件的处理 if (m_ValidateEventArgs.cancel) return; m_State = (m_State == ButtonState.Open) ? ButtonState.Close : ButtonState.Open; UpdateDisplay(); m_OnChangedState?.Invoke(this); } public bool IsOpen { get { return m_State == ButtonState.Open; } set { m_State = value ? ButtonState.Open : ButtonState.Close; UpdateDisplay(); } } }
using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.Events; using UnityEngine.EventSystems; using UnityEngine.Serialization; /// <summary>gine; /// 多状态开关按钮 /// </summary> public class UIExpandSwitchButton : MonoBehaviour, IPointerClickHandler { public bool interactable = true; [SerializeField] private int index; [SerializeField] private Image m_Image; [SerializeField] private List<Sprite> swapSprites = new List<Sprite>(); public int Index { get { return index; } set { ChangeState(value); } } [Serializable] public class StateChangedEvent : UnityEvent<UIExpandSwitchButton> { } [FormerlySerializedAs("onChangedState")] [SerializeField] private StateChangedEvent m_OnChangedState = new StateChangedEvent(); public void OnPointerClick(PointerEventData eventData) { if (!interactable) return; index = (index + 1) % swapSprites.Count; ChangeState(index); } public void ChangeStateWithoutNotify(int index) { this.index = index; UpdateDisplay(); } private void ChangeState(int index) { this.index = index; UpdateDisplay(); m_OnChangedState?.Invoke(this); } private void UpdateDisplay() { if (index < 0 || index >= swapSprites.Count) return; Sprite sprite = swapSprites[index]; m_Image.sprite = sprite; } }