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(); 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; } }