83 lines
3.0 KiB
C#
83 lines
3.0 KiB
C#
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);
|
|
}
|
|
}
|
|
} |