96 lines
3.3 KiB
C#
96 lines
3.3 KiB
C#
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<LineRenderer>();
|
||
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;
|
||
}
|
||
} |