按钮:
public class BtnScaleTool : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
    [FormerlySerializedAs("_downScale")] [SerializeField, Header("按下时缩小至多少?"), Range(0, 1)]
    private float downScale = 0.95f;

    [FormerlySerializedAs("_downDuration")] [SerializeField, Header("缩放变化持续时间:按下过程")]
    private float downDuration = 0.1f;

    [FormerlySerializedAs("_upDuration")] [SerializeField, Header("缩放变化持续时间:抬起过程")]
    private float upDuration = 0.1f;

    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;
    }
}
UI放大缩小动画(基于DoTween)
using DG.Tweening;
using DG.Tweening.Core;
using DG.Tweening.Plugins.Options;
using UnityEngine;

public class TelescopicTool : MonoBehaviour
{
    [SerializeField,Range(1f, 2f),Header("放大倍数")] private float magnification = 1.2f;
    [SerializeField,Range(0f, 5f),Header("伸缩持续时间")] private float magnificationSpeed = 0.6f;
    private Vector3 _minScale;
    private Vector3 _maxScale;
    private bool _flag;
    private TweenerCore<Vector3, Vector3, VectorOptions> _tween;
    
    private void OnEnable()
    {
        _flag = true;
        _minScale = transform.localScale;
        _maxScale = _minScale * magnification;
        StartCartoon();
    }
    /// <summary>
    /// 缩放动画
    /// </summary>
    private void StartCartoon()
    {
        if (!_flag)
        {
            return;
        }

        _tween = transform.DOScale(_maxScale,magnificationSpeed)
            .SetEase(Ease.Linear)
            .OnComplete(() =>
            {
                transform.DOScale(_minScale, magnificationSpeed)
                    .SetEase(Ease.Linear)
                    .OnComplete(StartCartoon);
            });
    }
    
    private void OnDisable()
    {
        _tween?.Kill();
        _flag = false;
        transform.localScale = _minScale;
    }
}

旋转:

using DG.Tweening;
using DG.Tweening.Core;
using DG.Tweening.Plugins.Options;
using UnityEngine;


public class RotationLooper : MonoBehaviour
{
    private TweenerCore<Quaternion, Vector3, QuaternionOptions> _loops;
    private readonly Vector3 _clockwiseEndValue = new Vector3(0, 0, -360);
    private readonly Vector3 _counterClockwiseEndValue = new Vector3(0, 0, 360);

    [Header("顺时针")][SerializeField] private bool isClockwise = true;
    [Header("匀速")][SerializeField] private bool isUniformSpeed = true;
    [SerializeField] private float rotationDuration = 1f;

    private void OnEnable()
    {
        Vector3 endValue = isClockwise ? _clockwiseEndValue : _counterClockwiseEndValue;
        _loops = transform.DORotate(endValue, rotationDuration, RotateMode.FastBeyond360)
            .SetLoops(-1)
            .SetEase(isUniformSpeed ? Ease.Linear : Ease.OutQuad);
    }

    private void OnDisable()
    {
        _loops.Kill();
        transform.localRotation = Quaternion.identity;
    }
}

呼吸:

using DG.Tweening;
using UnityEngine;
using UnityEngine.UI;

public class FadeBreathingEffect : MonoBehaviour
{
    [Header("最小透明度")][SerializeField] [Range(0f, 1f)]private float _minAlpha = 0.3f; // 最小透明度
    [Header("渐隐渐现周期")][SerializeField] private float _duration = 1.5f; // 渐隐渐现周期
    
    private Image _image;
    private CanvasGroup _canvasGroup;
    private SpriteRenderer _spriteRenderer;
    private Renderer _renderer;
    private Tweener _tweener;
    
    private void OnEnable()
    {
        _image = GetComponent<Image>();
        _canvasGroup = GetComponent<CanvasGroup>();
        _spriteRenderer = GetComponent<SpriteRenderer>();
        _renderer = GetComponent<Renderer>();
        ApplyFadeEffect();
    }
    
    private void ApplyFadeEffect()
    {
        if (_canvasGroup != null)
        {
            _tweener = DOTween.To(() => _canvasGroup.alpha, x => _canvasGroup.alpha = x, _minAlpha, _duration)
                .SetLoops(-1, LoopType.Yoyo)
                .SetEase(Ease.InOutSine);
        }else if (_image != null)
        {
            _tweener = DOTween.To(() => _image.color.a, x =>
                {
                    var color = _image.color;
                    color.a = x;
                    _image.color = color;
                }, _minAlpha, _duration)
                .SetLoops(-1, LoopType.Yoyo)
                .SetEase(Ease.InOutSine);
        }
        else if (_spriteRenderer != null)
        {
            _tweener = DOTween.To(() => _spriteRenderer.color.a, x =>
            {
                Color color = _spriteRenderer.color;
                color.a = x;
                _spriteRenderer.color = color;
            }, _minAlpha, _duration)
                .SetLoops(-1, LoopType.Yoyo)
                .SetEase(Ease.InOutSine);
        }
        else if (_renderer != null)
        {
            Material material = _renderer.material;
            _tweener = DOTween.To(() => material.color.a, x =>
            {
                Color color = material.color;
                color.a = x;
                material.color = color;
            }, _minAlpha, _duration)
                .SetLoops(-1, LoopType.Yoyo)
                .SetEase(Ease.InOutSine);
        }
    }
    
    private void OnDisable()
    {
        _tweener.Kill();
        ResetAlpha();
    }
    
    private void ResetAlpha()
    {
        if (_canvasGroup != null)
        {
            _canvasGroup.alpha = 1f;
        }
        else if (_spriteRenderer != null)
        {
            Color color = _spriteRenderer.color;
            color.a = 1f;
            _spriteRenderer.color = color;
        }
        else if (_renderer != null)
        {
            Material material = _renderer.material;
            Color color = material.color;
            color.a = 1f;
            material.color = color;
        }
    }
}

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐