using UnityEngine; namespace RR.Game2D.Entities.Platforms { public class TrajectoryPlatform : MonoBehaviour { [Header("Настройки движения платформы")] [SerializeField] private float moveSpeed = 1f; [SerializeField] private Vector3[] coordinates; [SerializeField] private bool loop = true; [Header("Прикрепление игрока")] [SerializeField] private bool attachPlayer = true; [Header("Задержка перед началом движения (в секундах)")] [SerializeField] private float startDelay = 0; private int _currentTargetIndex; private float _delayTimer; private bool _started; private void Start() { _delayTimer = Mathf.Max(0f, startDelay); _started = _delayTimer <= 0f; } private void FixedUpdate() { if (coordinates == null || coordinates.Length == 0) return; // Если ещё идёт задержка старта, уменьшаем таймер и ожидаем if (!_started) { _delayTimer -= Time.fixedDeltaTime; if (_delayTimer <= 0f) { _started = true; } else { return; // пока не стартовали, не двигаемся } } // Определяем целевую точку Vector3 targetPoint = coordinates[_currentTargetIndex]; // Двигаем платформу к целевой точке transform.position = Vector3.MoveTowards(transform.position, targetPoint, moveSpeed * Time.fixedDeltaTime); // Проверяем, достигли ли целевой точки if (!(Vector3.Distance(transform.position, targetPoint) < 0.01f)) return; if (loop) { // Режим зацикливания: переходим к следующей точке по кругу _currentTargetIndex = (_currentTargetIndex + 1) % coordinates.Length; if (_currentTargetIndex == 0) _started = false; } else { _currentTargetIndex++; if (_currentTargetIndex < coordinates.Length) return; transform.position = coordinates[0]; _currentTargetIndex = 0; } } private void OnCollisionEnter2D(Collision2D other) { if (!attachPlayer) return; if (!other.gameObject.CompareTag("Player")) return; other.transform.SetParent(transform); } private void OnCollisionExit2D(Collision2D other) { if (!attachPlayer) return; if (!other.gameObject.CompareTag("Player")) return; other.transform.SetParent(null); } } }