using UnityEngine; using System.Collections; public class SpikeTrap : MonoBehaviour { [Header("Настройки Движения")] [SerializeField] private float spikeHeight = 1.5f; // Насколько шипы вылезают вверх [SerializeField] private float moveSpeed = 2f; // Скорость выдвижения [SerializeField] private float waitUpTime = 2f; // Сколько ждать наверху [SerializeField] private float waitDownTime = 2f; // Сколько ждать внизу [SerializeField] private float startDelay = 0f; // Задержка старта (для рассинхрона) private Vector3 hiddenPos; // Спрятанная позиция private Vector3 activePos; // Позиция атаки void Start() { // Запоминаем локальные позиции. // Важно использовать localPosition, чтобы шипы ездили ВМЕСТЕ с платформой hiddenPos = transform.localPosition; activePos = hiddenPos + Vector3.up * spikeHeight; StartCoroutine(SpikeRoutine()); } private IEnumerator SpikeRoutine() { // Начальная задержка yield return new WaitForSeconds(startDelay); while (true) { // 1. Движение ВВЕРХ (Атака) while (Vector3.Distance(transform.localPosition, activePos) > 0.01f) { transform.localPosition = Vector3.MoveTowards(transform.localPosition, activePos, moveSpeed * Time.deltaTime); yield return null; } transform.localPosition = activePos; // Ждем наверху yield return new WaitForSeconds(waitUpTime); // 2. Движение ВНИЗ (Спрятаться) while (Vector3.Distance(transform.localPosition, hiddenPos) > 0.01f) { transform.localPosition = Vector3.MoveTowards(transform.localPosition, hiddenPos, moveSpeed * Time.deltaTime); yield return null; } transform.localPosition = hiddenPos; // Ждем внизу yield return new WaitForSeconds(waitDownTime); } } // Логика убийства private void OnCollisionEnter(Collision collision) { // Проверяем, есть ли у объекта скрипт BallController BallController player = collision.gameObject.GetComponent(); if (player != null) { player.GameOver(); // Вызываем метод проигрыша, который мы добавили выше } } }