示意
按钮点击效果.gif
相关配置
在Button组件同级下挂上该脚本组件:UIBtnScaleEffect
image.png
代码
UIBtnScaleEffect.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class UIBtnScaleEffect : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
[SerializeField, Header("按下时缩小至多少?"), Range(0, 1)]
private float _downScale = 0.85f;
[SerializeField, Header("缩放变化持续时间:按下过程")]
private float _downDuration = 0.2f;
[SerializeField, Header("缩放变化持续时间:抬起过程")]
private float _upDuration = 0.15f;
private RectTransform RectTransform
{
get
{
if (_rectTransform == null)
{
_rectTransform = GetComponent<RectTransform>();
}
return _rectTransform;
}
}
private RectTransform _rectTransform;
public void OnPointerDown(PointerEventData eventData)
{
StopAllCoroutines();
StartCoroutine(ChangeScaleCoroutine(1, _downScale, _downDuration));
}
public void OnPointerUp(PointerEventData eventData)
{
StopAllCoroutines();
StartCoroutine(ChangeScaleCoroutine(RectTransform.localScale.x, 1, _upDuration));
}
private IEnumerator ChangeScaleCoroutine(float beginScale, float endScale, float duration)
{
float timer = 0f;
while (timer < duration)
{
RectTransform.localScale = Vector3.one * Mathf.Lerp(beginScale, endScale, timer / duration);
timer += Time.fixedDeltaTime;
yield return null;
}
RectTransform.localScale = Vector3.one * endScale;
}
private void OnDisable()
{
RectTransform.localScale = Vector3.one;
}
}
点击按钮时播放音效
UIClickBtnAudioCtr.cs
需在Resources/Audio/Sounds下放置音效资源文件:ClickBtn
AudioSys的代码见:Unity中,基本的音乐音效控制系统
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(Button))]
public class UIClickBtnAudioCtr : MonoBehaviour
{
[SerializeField]
private string _soundPath = "Audio/Click";
private const string DefaultSoundPath = "Audio/Click";
private string SoundPath => (_soundPath == null || _soundPath == string.Empty) ? DefaultSoundPath : _soundPath;
private Button _btn;
private void Start()
{
Init();
}
private void OnDestroy()
{
Destroy();
}
public void Init()
{
_btn = GetComponent<Button>();
_btn.onClick.AddListener(OnClickBtn);
}
public void Destroy()
{
if (_btn != null)
{
_btn.onClick.RemoveListener(OnClickBtn);
}
}
private void OnClickBtn()
{
Audio.AudioSys.Instance.PlaySound(SoundPath);
}
}