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

107 lines
4.6 KiB
C#
Raw 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;
public class TrailController : MonoBehaviour
{
[Header("Ссылки")]
[Tooltip("Префаб с компонентом TrailSegment")]
public TrailSegment trailSegmentPrefab;
[Tooltip("Дочерний объект с активным Line Renderer (ActiveTrail)")]
public LineRenderer activeLineRenderer;
private BallController ballController;
[Header("Настройки")]
[Tooltip("Как долго будет исчезать шлейф после касания земли (в секундах)")]
public float trailFadeTime = 1.5f;
[Tooltip("Минимальное расстояние между точками шлейфа")]
public float pointsSpacing = 0.1f;
// --- ЛОГИКА ---
// Используем List для сбора точек, так как он более удобен для добавления
private List<Vector3> currentPoints = new List<Vector3>();
private Vector3 lastAddedPointPosition;
private bool wasGrounded = true;
void Start()
{
ballController = GetComponent<BallController>();
if (ballController == null || activeLineRenderer == null || trailSegmentPrefab == null)
{
Debug.LogError("Не установлены все ссылки!", this);
enabled = false;
}
activeLineRenderer.positionCount = 0;
lastAddedPointPosition = transform.position;
}
void Update()
{
bool isCurrentlyGrounded = ballController.IsGrounded;
// --- 1. ЛОГИКА ОКОНЧАНИЯ СЕГМЕНТА (КАСАНИЕ) ---
if (isCurrentlyGrounded && !wasGrounded)
{
// Шарик ТОЛЬКО ЧТО ПРИЗЕМЛИЛСЯ!
int count = activeLineRenderer.positionCount;
// Если есть линия для затухания (больше 1 точки)
if (count > 1)
{
// ГЛАВНЫЙ ФИКС:
// 1. Убеждаемся, что последняя точка списка — это ТОЧНОЕ место приземления.
currentPoints[count - 1] = transform.position;
// 2. Обновляем Line Renderer, чтобы он был отрисован корректно перед сохранением.
activeLineRenderer.SetPositions(currentPoints.ToArray());
// 1. Создаем массив Vector3[] для хранения текущих позиций
Vector3[] positions = new Vector3[count];
// 2. Корректно получаем позиции из LineRenderer
// LineRenderer.GetPositions требует массив в качестве аргумента
activeLineRenderer.GetPositions(positions);
// 3. Создаем сегмент затухания
TrailSegment newSegment = Instantiate(trailSegmentPrefab, Vector3.zero, Quaternion.identity);
newSegment.Initialize(trailFadeTime, positions); // Передаем массив
}
// 4. Очищаем текущие точки и Line Renderer, готовясь к новому взлету.
currentPoints.Clear();
activeLineRenderer.positionCount = 0;
lastAddedPointPosition = transform.position;
}
// --- 2. ЛОГИКА РИСОВАНИЯ (ТОЛЬКО В ВОЗДУХЕ) ---
if (!isCurrentlyGrounded)
{
// Шарик летит.
float distance = Vector3.Distance(transform.position, lastAddedPointPosition);
if (distance >= pointsSpacing)
{
currentPoints.Add(transform.position);
lastAddedPointPosition = transform.position;
}
// Обновляем Line Renderer
if (currentPoints.Count > 0)
{
// Всегда обновляем последнюю точку для плавного следования
currentPoints[currentPoints.Count - 1] = transform.position;
activeLineRenderer.positionCount = currentPoints.Count;
activeLineRenderer.SetPositions(currentPoints.ToArray());
}
}
// Запоминаем состояние для следующего кадра
wasGrounded = isCurrentlyGrounded;
}
}