Files
butchers-games-test/Assets/Scripts/Toolkit/OHM/UnityToolkit/UI/UIMoveToTarget.cs
T
Boris Nikolaev 5f1e94b653 add project files
2026-08-14 01:58:31 +03:00

85 lines
1.7 KiB
C#

using System.Collections;
using UnityEngine;
using UnityEngine.Events;
using OHM.UnityToolkit;
using OHM.UnityToolkit.Pooling;
namespace OHM.UnityToolkit.UI
{
public class UIMoveToTarget : MonoBehaviour, PooledObjectListener
{
[SerializeField]
private RectTransform rectTransform;
[SerializeField]
public RectTransform target;
[SerializeField]
public float initialDelay;
[SerializeField]
public float animDuration;
[SerializeField]
public AnimationCurve xCurve;
[SerializeField]
public AnimationCurve yCurve;
[SerializeField]
public bool autoStart = true;
[SerializeField]
public bool destroyOnEnd;
public UnityEvent onMoveDone = new UnityEvent();
private void Start()
{
ComponentsUtils.GetRequiredComponent(this, ref rectTransform);
if (autoStart)
{
StartCoroutine(MoveAnim());
}
}
public void StartMove()
{
StartCoroutine(MoveAnim());
}
private IEnumerator MoveAnim()
{
yield return new WaitForEndOfFrame();
yield return new WaitForSeconds(initialDelay);
Vector2 from = rectTransform.anchoredPosition;
var delta = (Vector2)target.localPosition - from;
for (float t = animDuration; t > 0f; t -= Time.deltaTime)
{
float ratio = 1f - t / animDuration;
rectTransform.anchoredPosition = new Vector2(
from.x + xCurve.Evaluate(ratio) * delta.x,
from.y + yCurve.Evaluate(ratio) * delta.y);
yield return new WaitForEndOfFrame();
}
onMoveDone.Invoke();
if (destroyOnEnd)
{
PoolsManager.ReleaseObject(base.gameObject);
}
}
public void OnEnable()
{
StartCoroutine(MoveAnim());
}
public void OnRelease()
{
}
public void OnReset()
{
}
}
}