93 lines
2.9 KiB
C#
93 lines
2.9 KiB
C#
|
|
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;
|
||
|
|
}
|
||
|
|
}
|