using UnityEngine; using System.Collections.Generic; [RequireComponent(typeof(LineRenderer))] public class TrailSegment : MonoBehaviour { private LineRenderer lineRenderer; private Material lineMaterial; private float maxLifetime = 0f; private float elapsedTime = 0f; // Сохраняем полный массив точек, переданный при инициализации private Vector3[] originalPoints; private int initialPointCount = 0; void Awake() { lineRenderer = GetComponent(); lineMaterial = lineRenderer.material; } public void Initialize(float lifetime, Vector3[] points) { maxLifetime = lifetime; elapsedTime = 0f; originalPoints = points; // Сохраняем полный массив initialPointCount = points.Length; lineRenderer.positionCount = initialPointCount; lineRenderer.SetPositions(originalPoints); Color color = lineMaterial.color; color.a = 1f; lineMaterial.color = color; transform.SetParent(null); } void Update() { elapsedTime += Time.deltaTime; // Нормализованное время (от 0.0 до 1.0) float normalizedTime = elapsedTime / maxLifetime; if (normalizedTime >= 1f) { Destroy(gameObject); return; } // --- 1. ЛОГИКА УМЕНЬШЕНИЯ ДЛИНЫ (ШРИНКИНГ) --- // Количество точек, которые нужно ОТБРОСИТЬ с НАЧАЛА (P0) // normalizedTime 0.0 -> 0 точек, 1.0 -> 100% точек int pointsToRemoveFromStart = Mathf.FloorToInt(initialPointCount * normalizedTime); // Количество оставшихся точек int remainingCount = initialPointCount - pointsToRemoveFromStart; if (remainingCount <= 0) { Destroy(gameObject); return; } // Создаем временный массив для оставшихся точек Vector3[] remainingPositions = new Vector3[remainingCount]; // Копируем оставшуюся часть массива (сдвигаем его): // Копируем из originalPoints, начиная с индекса pointsToRemoveFromStart, // в remainingPositions, начиная с индекса 0, // копируем remainingCount элементов. System.Array.Copy( originalPoints, pointsToRemoveFromStart, remainingPositions, 0, remainingCount ); // Обновляем Line Renderer новым, сдвинутым массивом lineRenderer.positionCount = remainingCount; lineRenderer.SetPositions(remainingPositions); // --- 2. ПЛАВНОЕ ЗАТУХАНИЕ --- // Дополнительно уменьшаем прозрачность, чтобы сделать исчезновение более плавным float remainingPercentage = 1f - normalizedTime; Color color = lineMaterial.color; color.a = remainingPercentage; lineMaterial.color = color; } }