Projext/Assets/02_Scripts/UI/Menu/ButtonHoverEffect.cs

93 lines
2.9 KiB
C#
Raw Normal View History

using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;
/// <summary>
/// 버튼에 붙이면:
/// - 마우스가 올라오면 → 커짐 (Hover)
/// - 클릭하면 → 펀치 애니메이션
/// </summary>
public class ButtonHoverEffect : MonoBehaviour,
IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler
{
[Header("Hover 설정")]
public float hoverScale = 1.15f; // 커질 크기
public float hoverSpeed = 8f; // 커지는 속도
[Header("펀치 애니메이션 설정")]
public float punchScale = 0.85f; // 줄어들 크기
public float punchDuration = 0.12f; // 한 방향 시간
// ── 내부 상태 ──────────────────────────
private Vector3 _originalScale;
private bool _isHovering = false;
private bool _isPunching = false;
private Coroutine _punchCoroutine;
private void Awake()
{
_originalScale = transform.localScale;
}
private void Update()
{
if (_isPunching) return;
// 목표 스케일: 호버 중이면 크게, 아니면 원래 크기
Vector3 target = _isHovering
? _originalScale * hoverScale
: _originalScale;
transform.localScale = Vector3.Lerp(
transform.localScale, target, Time.unscaledDeltaTime * hoverSpeed);
}
// ── 마우스 진입 ────────────────────────
public void OnPointerEnter(PointerEventData eventData)
{
_isHovering = true;
}
// ── 마우스 이탈 ────────────────────────
public void OnPointerExit(PointerEventData eventData)
{
_isHovering = false;
}
// ── 클릭 시 펀치 ──────────────────────
public void OnPointerClick(PointerEventData eventData)
{
if (_punchCoroutine != null)
StopCoroutine(_punchCoroutine);
_punchCoroutine = StartCoroutine(PunchRoutine());
}
private IEnumerator PunchRoutine()
{
_isPunching = true;
Vector3 bigScale = _originalScale * hoverScale;
Vector3 smallScale = _originalScale * punchScale;
// 1. 축소
float elapsed = 0f;
while (elapsed < punchDuration)
{
elapsed += Time.unscaledDeltaTime;
transform.localScale = Vector3.Lerp(bigScale, smallScale, elapsed / punchDuration);
yield return null;
}
// 2. 복원 (hover 크기로 돌아옴)
elapsed = 0f;
while (elapsed < punchDuration)
{
elapsed += Time.unscaledDeltaTime;
transform.localScale = Vector3.Lerp(smallScale, bigScale, elapsed / punchDuration);
yield return null;
}
_isPunching = false;
}
}