68 lines
2.7 KiB
C#
68 lines
2.7 KiB
C#
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<BallController>();
|
||
|
||
if (player != null)
|
||
{
|
||
player.GameOver(); // Вызываем метод проигрыша, который мы добавили выше
|
||
}
|
||
}
|
||
} |