using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
namespace Rokid.UXR.Interaction {
public class ButtonState : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerEnterHandler, IPointerExitHandler
{
[SerializeField]
private Sprite pressed;
[SerializeField]
private Sprite highlight;
[SerializeField]
private Sprite normal;
[SerializeField]
private Image targetGraphic;
[SerializeField]
private Image hotArea;
[SerializeField]
private bool hovering;
[SerializeField]
private bool pointerDown;
///
/// 默认 graphicScale
///
private Vector3 oriGraphicScale;
private Vector3 oriHotAreaScale;
///
/// hover状态 graphicScale
///
public float hoverScale = 1.0f;
///
/// hover状态 hotArea
///
public float hotAreaHoverScale = 1.0f;
public float downScale = 1.0f;
public void OnPointerDown(PointerEventData eventData)
{
pointerDown = true;
}
public void OnPointerUp(PointerEventData eventData)
{
pointerDown = false;
}
public void OnPointerEnter(PointerEventData eventData)
{
hovering = true;
}
public void OnPointerExit(PointerEventData eventData)
{
hovering = false;
pointerDown = false;
}
private void Start()
{
oriGraphicScale = targetGraphic.transform.localScale;
if (hotArea != null)
oriHotAreaScale = hotArea.transform.localScale;
}
private void OnEnable()
{
OnPointerExit(null);
}
private void OnDisable()
{
OnPointerExit(null);
}
private void Update()
{
if (hovering && !pointerDown)
{
targetGraphic.sprite = highlight;
targetGraphic.transform.localScale = oriGraphicScale * hoverScale;
if (hotArea != null)
hotArea.transform.localScale = oriHotAreaScale * hotAreaHoverScale;
}
else if (pointerDown)
{
targetGraphic.sprite = pressed;
targetGraphic.transform.localScale = oriGraphicScale * downScale;
if (hotArea != null)
hotArea.transform.localScale = oriHotAreaScale * hotAreaHoverScale;
}
else
{
targetGraphic.sprite = normal;
targetGraphic.transform.localScale = oriGraphicScale;
if (hotArea != null)
hotArea.transform.localScale = oriHotAreaScale;
}
}
}
}