Files
Travel_Run/Assets/Scripts/Flow/FlowIntroRouteMotion.cs
T
2026-07-06 16:15:20 +09:00

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;
}
}