Unity_lab3/Unity3_lab/Assets/Scripts/TrailSegment.cs
savilokirill@gmail.com 8946e6704d шлейф
более менее работает
2025-11-12 01:57:52 +03:00

96 lines
3.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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