Files
XRLib/Assets/Scripts/UVC/UI/Buttons/ImageButton.cs
2025-08-06 19:16:41 +09:00

131 lines
4.6 KiB
C#

using System;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.Serialization;
using UnityEngine.UI;
namespace UVC.UI.Buttons
{
/// <summary>
/// 이미지 color를 변경하여 버튼과 같은 UI 요소에 시각적 피드백을 제공하는 이미지 버튼입니다.
/// </summary>
public class ImageButton : Image, IPointerDownHandler, IPointerUpHandler,
IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler
{
[SerializeField]
private Color originalColor = Color.white; // 기본 상태일 때의 색상
[SerializeField]
private Color hoverColor = Color.gray; // 마우스 포인터가 위에 있을 때의 색상
[SerializeField]
private Color clickColor = Color.gray; // 클릭했을 때의 색상
[SerializeField]
private Color disabledColor = Color.gray; // 비활성화 상태일 때의 색상
[SerializeField]
private bool interactable = true;
public bool Interactable
{
get => interactable;
set
{
if (interactable == value) return;
interactable = value;
raycastTarget = value; // 상호 작용 가능 상태에 따라 raycastTarget 설정
color = value ? originalColor : disabledColor;
}
}
[Serializable]
/// <summary>
/// 버튼 클릭 이벤트에 대한 함수 정의.
/// </summary>
public class ButtonClickedEvent : UnityEvent { }
// onClick 이벤트는 인스펙터에 노출되며, 버튼 클릭 시 호출될 함수를 등록할 수 있습니다.
[FormerlySerializedAs("onClick")]
[SerializeField]
private ButtonClickedEvent m_OnClick = new ButtonClickedEvent();
/// <summary>
/// 버튼을 클릭할 때마다 호출되는 UnityEvent입니다.
/// </summary>
public ButtonClickedEvent onClick
{
get { return m_OnClick; }
set { m_OnClick = value; }
}
protected override void Awake()
{
base.Awake();
// 초기화 시 Interactable 프로퍼티를 통해 색상과 raycastTarget을 설정합니다.
raycastTarget = interactable;
color = interactable ? originalColor : disabledColor;
}
/// <summary>
/// 포인터가 버튼을 눌렀을 때 호출됩니다.
/// </summary>
public virtual void OnPointerDown(PointerEventData eventData)
{
if (Interactable)
{
color = clickColor; // 클릭 시 컬러 변경
}
}
/// <summary>
/// 포인터가 버튼 영역에 들어왔을 때 호출됩니다.
/// </summary>
public virtual void OnPointerEnter(PointerEventData eventData)
{
if (Interactable)
{
color = hoverColor; // 마우스 오버 시 컬러 변경
}
}
/// <summary>
/// 포인터가 버튼 영역을 벗어났을 때 호출됩니다.
/// </summary>
public virtual void OnPointerExit(PointerEventData eventData)
{
// 상호작용 가능 여부와 관계없이 포인터가 나가면 상태에 맞는 기본 색상으로 돌아갑니다.
color = interactable ? originalColor : disabledColor;
}
/// <summary>
/// 포인터가 버튼에서 떼어졌을 때 호출됩니다.
/// </summary>
public virtual void OnPointerUp(PointerEventData eventData)
{
if (Interactable)
{
color = hoverColor; // 클릭 후 원래 컬러로 변경
}
}
/// <summary>
/// 버튼 클릭이 완료되었을 때 호출됩니다. (PointerDown과 PointerUp이 같은 대상에서 발생)
/// </summary>
public virtual void OnPointerClick(PointerEventData eventData)
{
// 왼쪽 마우스 버튼 클릭이 아니면 무시합니다.
if (eventData.button != PointerEventData.InputButton.Left) return;
Press();
}
/// <summary>
/// 내부적으로 클릭 이벤트를 실행합니다.
/// </summary>
private void Press()
{
// 컴포넌트가 활성화 상태가 아니거나 상호작용 불가능하면 이벤트를 호출하지 않습니다.
if (!IsActive() || !interactable) return;
m_OnClick.Invoke();
}
}
}