using System.Collections; using UnityEngine; using UnityEngine.EventSystems; /// /// 버튼에 붙이면: /// - 마우스가 올라오면 → 커짐 (Hover) /// - 클릭하면 → 펀치 애니메이션 /// 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; } }