106 lines
3.2 KiB
C#
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;
|
|
}
|
|
|
|
|
|
}
|