using UnityEngine; [RequireComponent(typeof(Rigidbody))] // Убедимся, что Rigidbody всегда есть public class MovingPlatform : MonoBehaviour { [Header("Настройки Платформы")] public Vector3 startPoint; // Начальная точка (будет установлена автоматически) public Vector3 endPoint; // Конечная точка, куда платформа будет двигаться [SerializeField] private float speed = 2f; // Скорость движения private Rigidbody rb; private bool movingToEnd = true; void Awake() { rb = GetComponent(); // Киннематический Rigidbody - лучший способ двигать платформы для физики rb.isKinematic = true; rb.useGravity = false; } void Start() { rb.isKinematic = true; rb.useGravity = false; // Устанавливаем текущую позицию как начальную точку startPoint = rb.position; previousPosition = rb.position; // Инициализируем предыдущую позицию } void FixedUpdate() { MovePlatform(); previousPosition = rb.position; } private void MovePlatform() { // Определяем целевую позицию Vector3 target = movingToEnd ? endPoint : startPoint; // Перемещаем платформу к целевой точке с заданной скоростью // Используем rb.MovePosition() для корректного физического перемещения Vector3 newPosition = Vector3.MoveTowards(rb.position, target, speed * Time.fixedDeltaTime); rb.MovePosition(newPosition); // Проверяем, достигли ли мы цели // (Используем rb.position) if (rb.position == target) { // Меняем направление движения movingToEnd = !movingToEnd; } } private Vector3 previousPosition; // *** НОВЫЙ МЕТОД: Возвращает фактическую скорость платформы *** public Vector3 GetVelocity() { // Скорость = (Текущая позиция - Предыдущая позиция) / Время return (rb.position - previousPosition) / Time.fixedDeltaTime; } }