zombie_mp/Assets/HQ FPS Weapons/Scripts/UserInterface/Inventory/Slot.cs
Sewmina Dilshan 68183e5317 initial
2021-08-23 13:28:33 +05:30

206 lines
4.7 KiB
C#

using System;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
namespace HQFPSWeapons.UserInterface
{
[ExecuteInEditMode]
public abstract class Slot : UserInterfaceBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
public Message<Slot> Refresh = new Message<Slot>();
public Message<Slot, PointerEventData> PointerDown = new Message<Slot, PointerEventData>();
public Message<Slot, PointerEventData> PointerUp = new Message<Slot, PointerEventData>();
public Message<PointerEventData, Slot> BeginDrag = new Message<PointerEventData, Slot>();
public Message<PointerEventData, Slot> Drag = new Message<PointerEventData, Slot>();
public Message<PointerEventData, Slot> EndDrag = new Message<PointerEventData, Slot>();
public Message<State> StateChanged = new Message<State>();
public ContainerInterface<Slot> BaseParent { get; private set; }
[BHeader("General", true)]
[SerializeField]
protected Graphic _Graphic;
[SerializeField]
private Transition m_Transition;
[SerializeField]
private SoundPlayer m_PointerDownAudio = null;
protected State m_State = State.Normal;
private CanvasRenderer m_Renderer;
protected bool m_Pressed;
protected bool m_Selected;
protected bool m_PointerHovering;
public virtual void Select()
{
m_Selected = true;
RefreshState(m_State);
}
public virtual void Deselect()
{
m_Selected = false;
RefreshState(m_PointerHovering ? State.Highlighted : State.Normal);
}
public virtual void OnPointerEnter(PointerEventData data)
{
m_PointerHovering = true;
if(!m_Pressed)
RefreshState(State.Highlighted);
}
public virtual void OnPointerDown(PointerEventData data)
{
if(data.button == PointerEventData.InputButton.Left)
{
m_Pressed = true;
RefreshState(State.Pressed);
}
m_PointerDownAudio.Play2D();
PointerDown.Send(this, data);
}
public virtual void OnPointerUp(PointerEventData data)
{
m_Pressed = false;
Slot slotUnderPointer = data.pointerCurrentRaycast.gameObject == null ? null : data.pointerCurrentRaycast.gameObject.GetComponent<Slot>();
if(slotUnderPointer != null)
{
if(slotUnderPointer != this)
RefreshState(State.Normal);
else
RefreshState(State.Highlighted);
}
else
RefreshState(State.Normal);
PointerUp.Send(this, data);
}
public virtual void OnPointerExit(PointerEventData data)
{
m_PointerHovering = false;
if(!m_Pressed)
RefreshState(State.Normal);
else
RefreshState(State.Pressed);
}
public void OnBeginDrag(PointerEventData data)
{
BeginDrag.Send(data, this);
}
public void OnDrag(PointerEventData data)
{
Drag.Send(data, this);
}
public void OnEndDrag(PointerEventData data)
{
EndDrag.Send(data, this);
}
protected virtual void Awake()
{
if(!Application.isPlaying)
return;
m_Renderer = GetComponent<CanvasRenderer>();
BaseParent = GetComponentInParent<ContainerInterface<Slot>>();
}
protected virtual void OnEnable()
{
if(_Graphic == null)
_Graphic = GetComponent<Graphic>();
if(m_Transition == null)
m_Transition = new Transition();
OnValidate();
}
protected virtual void OnDisable()
{
var r = m_Renderer == null ? GetComponent<CanvasRenderer>() : m_Renderer;
if(r != null)
r.SetColor(Color.white);
}
protected virtual void OnDestroy()
{
var r = m_Renderer == null ? GetComponent<CanvasRenderer>() : m_Renderer;
if(r != null)
r.SetColor(Color.white);
}
protected virtual void OnValidate()
{
var r = m_Renderer == null ? GetComponent<CanvasRenderer>() : m_Renderer;
if(r != null)
r.SetColor(m_Transition.NormalColor);
}
private void RefreshState(State state)
{
m_State = state;
Color color = m_Transition.NormalColor;
if(state == State.Highlighted)
color = m_Transition.HighlightedColor;
else if(state == State.Pressed)
color = m_Transition.PressedColor;
if(m_Selected)
color = m_Transition.HighlightedColor;
_Graphic.CrossFadeColor(color, m_Transition.FadeDuration, true, true);
StateChanged.Send(m_State);
}
#region Internal
public enum State
{
Normal,
Highlighted,
Pressed,
}
[Serializable]
public class Transition
{
public Color NormalColor = Color.grey;
public Color HighlightedColor = Color.grey;
public Color PressedColor = Color.grey;
[Clamp(0.01f, 1f)]
public float FadeDuration = 0.1f;
}
#endregion
}
}