Slot.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. using UnityEngine.EventSystems;
  5. namespace HQFPSWeapons.UserInterface
  6. {
  7. [ExecuteInEditMode]
  8. public abstract class Slot : UserInterfaceBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
  9. {
  10. public Message<Slot> Refresh = new Message<Slot>();
  11. public Message<Slot, PointerEventData> PointerDown = new Message<Slot, PointerEventData>();
  12. public Message<Slot, PointerEventData> PointerUp = new Message<Slot, PointerEventData>();
  13. public Message<PointerEventData, Slot> BeginDrag = new Message<PointerEventData, Slot>();
  14. public Message<PointerEventData, Slot> Drag = new Message<PointerEventData, Slot>();
  15. public Message<PointerEventData, Slot> EndDrag = new Message<PointerEventData, Slot>();
  16. public Message<State> StateChanged = new Message<State>();
  17. public ContainerInterface<Slot> BaseParent { get; private set; }
  18. [BHeader("General", true)]
  19. [SerializeField]
  20. protected Graphic _Graphic;
  21. [SerializeField]
  22. private Transition m_Transition;
  23. [SerializeField]
  24. private SoundPlayer m_PointerDownAudio = null;
  25. protected State m_State = State.Normal;
  26. private CanvasRenderer m_Renderer;
  27. protected bool m_Pressed;
  28. protected bool m_Selected;
  29. protected bool m_PointerHovering;
  30. public virtual void Select()
  31. {
  32. m_Selected = true;
  33. RefreshState(m_State);
  34. }
  35. public virtual void Deselect()
  36. {
  37. m_Selected = false;
  38. RefreshState(m_PointerHovering ? State.Highlighted : State.Normal);
  39. }
  40. public virtual void OnPointerEnter(PointerEventData data)
  41. {
  42. m_PointerHovering = true;
  43. if(!m_Pressed)
  44. RefreshState(State.Highlighted);
  45. }
  46. public virtual void OnPointerDown(PointerEventData data)
  47. {
  48. if(data.button == PointerEventData.InputButton.Left)
  49. {
  50. m_Pressed = true;
  51. RefreshState(State.Pressed);
  52. }
  53. m_PointerDownAudio.Play2D();
  54. PointerDown.Send(this, data);
  55. }
  56. public virtual void OnPointerUp(PointerEventData data)
  57. {
  58. m_Pressed = false;
  59. Slot slotUnderPointer = data.pointerCurrentRaycast.gameObject == null ? null : data.pointerCurrentRaycast.gameObject.GetComponent<Slot>();
  60. if(slotUnderPointer != null)
  61. {
  62. if(slotUnderPointer != this)
  63. RefreshState(State.Normal);
  64. else
  65. RefreshState(State.Highlighted);
  66. }
  67. else
  68. RefreshState(State.Normal);
  69. PointerUp.Send(this, data);
  70. }
  71. public virtual void OnPointerExit(PointerEventData data)
  72. {
  73. m_PointerHovering = false;
  74. if(!m_Pressed)
  75. RefreshState(State.Normal);
  76. else
  77. RefreshState(State.Pressed);
  78. }
  79. public void OnBeginDrag(PointerEventData data)
  80. {
  81. BeginDrag.Send(data, this);
  82. }
  83. public void OnDrag(PointerEventData data)
  84. {
  85. Drag.Send(data, this);
  86. }
  87. public void OnEndDrag(PointerEventData data)
  88. {
  89. EndDrag.Send(data, this);
  90. }
  91. protected virtual void Awake()
  92. {
  93. if(!Application.isPlaying)
  94. return;
  95. m_Renderer = GetComponent<CanvasRenderer>();
  96. BaseParent = GetComponentInParent<ContainerInterface<Slot>>();
  97. }
  98. protected virtual void OnEnable()
  99. {
  100. if(_Graphic == null)
  101. _Graphic = GetComponent<Graphic>();
  102. if(m_Transition == null)
  103. m_Transition = new Transition();
  104. OnValidate();
  105. }
  106. protected virtual void OnDisable()
  107. {
  108. var r = m_Renderer == null ? GetComponent<CanvasRenderer>() : m_Renderer;
  109. if(r != null)
  110. r.SetColor(Color.white);
  111. }
  112. protected virtual void OnDestroy()
  113. {
  114. var r = m_Renderer == null ? GetComponent<CanvasRenderer>() : m_Renderer;
  115. if(r != null)
  116. r.SetColor(Color.white);
  117. }
  118. protected virtual void OnValidate()
  119. {
  120. var r = m_Renderer == null ? GetComponent<CanvasRenderer>() : m_Renderer;
  121. if(r != null)
  122. r.SetColor(m_Transition.NormalColor);
  123. }
  124. private void RefreshState(State state)
  125. {
  126. m_State = state;
  127. Color color = m_Transition.NormalColor;
  128. if(state == State.Highlighted)
  129. color = m_Transition.HighlightedColor;
  130. else if(state == State.Pressed)
  131. color = m_Transition.PressedColor;
  132. if(m_Selected)
  133. color = m_Transition.HighlightedColor;
  134. _Graphic.CrossFadeColor(color, m_Transition.FadeDuration, true, true);
  135. StateChanged.Send(m_State);
  136. }
  137. #region Internal
  138. public enum State
  139. {
  140. Normal,
  141. Highlighted,
  142. Pressed,
  143. }
  144. [Serializable]
  145. public class Transition
  146. {
  147. public Color NormalColor = Color.grey;
  148. public Color HighlightedColor = Color.grey;
  149. public Color PressedColor = Color.grey;
  150. [Clamp(0.01f, 1f)]
  151. public float FadeDuration = 0.1f;
  152. }
  153. #endregion
  154. }
  155. }