103 lines
2.6 KiB
C#
103 lines
2.6 KiB
C#
using UnityEngine;
|
|
|
|
public class FlowIntroRouteMotion : MonoBehaviour
|
|
{
|
|
public Vector2[] points;
|
|
public Vector2 offset;
|
|
public float duration = 7.5f;
|
|
|
|
private RectTransform rectTransform;
|
|
private Vector3 baseScale = Vector3.one;
|
|
|
|
private void Awake()
|
|
{
|
|
rectTransform = GetComponent<RectTransform>();
|
|
if(rectTransform != null)
|
|
{
|
|
baseScale = rectTransform.localScale;
|
|
}
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
if(rectTransform == null)
|
|
{
|
|
rectTransform = GetComponent<RectTransform>();
|
|
}
|
|
|
|
if(rectTransform != null)
|
|
{
|
|
baseScale = rectTransform.localScale;
|
|
}
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if(rectTransform == null || points == null || points.Length < 2 || duration <= 0f)
|
|
{
|
|
return;
|
|
}
|
|
|
|
float totalLength = GetTotalLength();
|
|
if(totalLength <= 0f)
|
|
{
|
|
return;
|
|
}
|
|
|
|
float distance = Mathf.Repeat(Time.unscaledTime / duration, 1f) * totalLength;
|
|
Vector2 position = points[0];
|
|
Vector2 direction = Vector2.right;
|
|
|
|
for(int i = 0; i < points.Length - 1; i++)
|
|
{
|
|
Vector2 from = points[i];
|
|
Vector2 to = points[i + 1];
|
|
Vector2 delta = to - from;
|
|
float segmentLength = delta.magnitude;
|
|
|
|
if(distance <= segmentLength)
|
|
{
|
|
float t = segmentLength > 0f ? distance / segmentLength : 0f;
|
|
position = Vector2.Lerp(from, to, t);
|
|
direction = delta.normalized;
|
|
break;
|
|
}
|
|
|
|
distance -= segmentLength;
|
|
}
|
|
|
|
rectTransform.anchoredPosition = position + offset;
|
|
|
|
if(direction.sqrMagnitude > 0.0001f)
|
|
{
|
|
Vector2 displayDirection = direction;
|
|
Vector3 displayScale = baseScale;
|
|
|
|
if(displayDirection.x < 0f)
|
|
{
|
|
displayDirection.x = -displayDirection.x;
|
|
displayScale.x = -Mathf.Abs(baseScale.x);
|
|
}
|
|
else
|
|
{
|
|
displayScale.x = Mathf.Abs(baseScale.x);
|
|
}
|
|
|
|
rectTransform.localScale = displayScale;
|
|
rectTransform.localRotation = Quaternion.Euler(0f, 0f, Mathf.Atan2(displayDirection.y, displayDirection.x) * Mathf.Rad2Deg - 12f);
|
|
}
|
|
}
|
|
|
|
private float GetTotalLength()
|
|
{
|
|
float totalLength = 0f;
|
|
|
|
for(int i = 0; i < points.Length - 1; i++)
|
|
{
|
|
totalLength += Vector2.Distance(points[i], points[i + 1]);
|
|
}
|
|
|
|
return totalLength;
|
|
}
|
|
}
|