Но всё это делается мгновенно, картинка сразу заменяется другой. И это не красиво.
Как сделать плавный переход между спрайтами кнопки?
Пробовал вариант c DOTween - но там тоже есть свои "проблемы". Нужно согласовывать анимации.
Скрытый текст:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using DG.Tweening;
public class DOTweenButtonController : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler
{
[SerializeField] private Sprite onPointerEnterButtonSprite;
[SerializeField] private Sprite onPointerExitButtonSprite;
[SerializeField] private Sprite onPointerDownButtonSprite;
private Image buttonImage;
private Sprite originalButtonSprite;
private Color originalButtonColor;
private bool isAnimating;
private void Awake()
{
buttonImage = GetComponent<Image>();
originalButtonSprite = buttonImage.sprite;
originalButtonColor = buttonImage.color;
}
public void OnPointerEnter(PointerEventData eventData)
{
if (!isAnimating)
{
isAnimating = true;
buttonImage.DOFade(0f, 0.5f).OnComplete(() =>
{
buttonImage.sprite = onPointerEnterButtonSprite;
buttonImage.DOFade(1f, 0.5f).OnComplete(() => isAnimating = false);
});
}
}
public void OnPointerExit(PointerEventData eventData)
{
if (!isAnimating)
{
isAnimating = true;
buttonImage.DOFade(0f, 0.5f).OnComplete(() =>
{
buttonImage.sprite = onPointerExitButtonSprite;
buttonImage.DOFade(1f, 0.5f).OnComplete(() => isAnimating = false);
});
}
}
public void OnPointerDown(PointerEventData eventData)
{
if (!isAnimating)
{
isAnimating = true;
buttonImage.DOFade(0f, 0.5f).OnComplete(() =>
{
buttonImage.sprite = onPointerDownButtonSprite;
buttonImage.DOFade(1f, 0.5f).OnComplete(() => isAnimating = false);
});
}
}
public void OnPointerUp(PointerEventData eventData)
{
if (!isAnimating)
{
isAnimating = true;
buttonImage.DOFade(0f, 0.5f).OnComplete(() =>
{
buttonImage.sprite = onPointerExitButtonSprite;
buttonImage.DOFade(1f, 0.5f).OnComplete(() => isAnimating = false);
});
}
}
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("Mouse click");
}
}
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using DG.Tweening;
public class DOTweenButtonController : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler
{
[SerializeField] private Sprite onPointerEnterButtonSprite;
[SerializeField] private Sprite onPointerExitButtonSprite;
[SerializeField] private Sprite onPointerDownButtonSprite;
private Image buttonImage;
private Sprite originalButtonSprite;
private Color originalButtonColor;
private bool isAnimating;
private void Awake()
{
buttonImage = GetComponent<Image>();
originalButtonSprite = buttonImage.sprite;
originalButtonColor = buttonImage.color;
}
public void OnPointerEnter(PointerEventData eventData)
{
if (!isAnimating)
{
isAnimating = true;
buttonImage.DOFade(0f, 0.5f).OnComplete(() =>
{
buttonImage.sprite = onPointerEnterButtonSprite;
buttonImage.DOFade(1f, 0.5f).OnComplete(() => isAnimating = false);
});
}
}
public void OnPointerExit(PointerEventData eventData)
{
if (!isAnimating)
{
isAnimating = true;
buttonImage.DOFade(0f, 0.5f).OnComplete(() =>
{
buttonImage.sprite = onPointerExitButtonSprite;
buttonImage.DOFade(1f, 0.5f).OnComplete(() => isAnimating = false);
});
}
}
public void OnPointerDown(PointerEventData eventData)
{
if (!isAnimating)
{
isAnimating = true;
buttonImage.DOFade(0f, 0.5f).OnComplete(() =>
{
buttonImage.sprite = onPointerDownButtonSprite;
buttonImage.DOFade(1f, 0.5f).OnComplete(() => isAnimating = false);
});
}
}
public void OnPointerUp(PointerEventData eventData)
{
if (!isAnimating)
{
isAnimating = true;
buttonImage.DOFade(0f, 0.5f).OnComplete(() =>
{
buttonImage.sprite = onPointerExitButtonSprite;
buttonImage.DOFade(1f, 0.5f).OnComplete(() => isAnimating = false);
});
}
}
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("Mouse click");
}
}