TH1/Unity/Assets/Scripts/TH1_UI/Common/ButtonHoverEffect.cs
2026-01-13 14:44:49 +08:00

106 lines
3.2 KiB
C#

using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections;
using Logic.Audio;
[RequireComponent(typeof(AudioSource))]
public class ButtonHoverEffect : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler
{
[Header("悬停效果")]
[Tooltip("鼠标悬停时的音效")]
public AudioClip hoverSound;
[Tooltip("目标缩放大小")]
public float targetScale = 1.1f;
[Header("点击效果")]
[Tooltip("鼠标点击时的音效")]
public AudioClip clickSound; // 新增:点击音效
[Tooltip("按下时的缩放大小")]
public float pressScale = 0.8f; // 新增:按下时的缩放
[Header("动画设置")]
[Tooltip("缩放动画的持续时间")]
public float scaleDuration = 0.1f;
private AudioSource audioSource;
private Vector3 originalScale;
private Coroutine scaleCoroutine;
// 新增一个状态,标记指针是否在按钮上
private bool isPointerOver = false;
void Awake()
{
audioSource = GetComponent<AudioSource>();
originalScale = transform.localScale;
}
// --- 鼠标进入 ---
public void OnPointerEnter(PointerEventData eventData)
{
isPointerOver = true; // 标记指针进入
if (hoverSound != null)
{
AudioManager.Instance.PlayAudio("SFX/UI_buttonHover");
//audioSource.PlayOneShot(hoverSound);
}
else
AudioManager.Instance.PlayAudio("SFX/UI_buttonHover");
StartScaling(originalScale * targetScale);
}
// --- 鼠标移出 ---
public void OnPointerExit(PointerEventData eventData)
{
isPointerOver = false; // 标记指针离开
StartScaling(originalScale);
}
// --- 新增:鼠标按下 ---
public void OnPointerDown(PointerEventData eventData)
{
// 播放点击音效
if (clickSound != null)
{
AudioManager.Instance.PlayAudio("SFX/UI_buttonClick");
//audioSource.PlayOneShot(clickSound);
}
else
AudioManager.Instance.PlayAudio("SFX/UI_buttonClick");
// 缩放到“按下”状态
StartScaling(originalScale * pressScale);
}
// --- 新增:鼠标抬起 ---
public void OnPointerUp(PointerEventData eventData)
{
// 如果指针仍在按钮上,则恢复到“悬停”状态,否则恢复到原始大小
Vector3 target = isPointerOver ? originalScale * targetScale : originalScale;
StartScaling(target);
}
private void StartScaling(Vector3 endScale)
{
if (scaleCoroutine != null)
{
StopCoroutine(scaleCoroutine);
}
scaleCoroutine = StartCoroutine(ScaleRoutine(endScale));
}
private IEnumerator ScaleRoutine(Vector3 endScale)
{
float timer = 0f;
Vector3 startScale = transform.localScale;
while (timer < scaleDuration)
{
timer += Time.unscaledDeltaTime;
transform.localScale = Vector3.Lerp(startScale, endScale, timer / scaleDuration);
yield return null;
}
transform.localScale = endScale;
}
}