113 lines
3.6 KiB
C#
113 lines
3.6 KiB
C#
using UnityEngine;
|
||
using UnityEngine.InputSystem;
|
||
|
||
/// <summary>
|
||
/// Финальный терминал аварийной эвакуации на 2-м уровне.
|
||
/// При взаимодействии по клавише [E] запускает процедуру открытия эвакуационного шлюза и победный экран.
|
||
/// </summary>
|
||
public class FinalExitTerminal : MonoBehaviour
|
||
{
|
||
[Header("Настройки")]
|
||
public float interactionDistance = 3.5f;
|
||
public Light statusLight;
|
||
public MeshRenderer screenRenderer;
|
||
|
||
private bool isActivated = false;
|
||
private static Transform cachedPlayer;
|
||
|
||
private void Start()
|
||
{
|
||
LocatePlayer();
|
||
if (statusLight != null)
|
||
{
|
||
statusLight.color = new Color(1f, 0.4f, 0.1f); // Оранжевый аварийный
|
||
}
|
||
|
||
var col = GetComponent<Collider>();
|
||
if (col == null)
|
||
{
|
||
var sc = gameObject.AddComponent<SphereCollider>();
|
||
sc.isTrigger = true;
|
||
sc.radius = interactionDistance;
|
||
}
|
||
}
|
||
|
||
private Transform LocatePlayer()
|
||
{
|
||
if (cachedPlayer != null) return cachedPlayer;
|
||
var pm = Object.FindAnyObjectByType<PlayerMovement>();
|
||
if (pm != null) { cachedPlayer = pm.transform; return cachedPlayer; }
|
||
var pTag = GameObject.FindWithTag("Player");
|
||
if (pTag != null) { cachedPlayer = pTag.transform; return cachedPlayer; }
|
||
return null;
|
||
}
|
||
|
||
private void Update()
|
||
{
|
||
if (isActivated) return;
|
||
if (Time.timeScale == 0f) return;
|
||
|
||
Transform player = LocatePlayer();
|
||
if (player == null) return;
|
||
|
||
float dist = Vector3.Distance(transform.position, player.position);
|
||
if (dist <= interactionDistance)
|
||
{
|
||
var keyboard = Keyboard.current;
|
||
if (keyboard != null && (keyboard.eKey.wasPressedThisFrame || keyboard.enterKey.wasPressedThisFrame))
|
||
{
|
||
ActivateExit();
|
||
}
|
||
}
|
||
}
|
||
|
||
private void OnTriggerStay(Collider other)
|
||
{
|
||
if (isActivated) return;
|
||
if (Time.timeScale == 0f) return;
|
||
|
||
if (other.CompareTag("Player") || other.GetComponentInParent<PlayerMovement>() != null)
|
||
{
|
||
var keyboard = Keyboard.current;
|
||
if (keyboard != null && (keyboard.eKey.wasPressedThisFrame || keyboard.enterKey.wasPressedThisFrame))
|
||
{
|
||
ActivateExit();
|
||
}
|
||
}
|
||
}
|
||
|
||
public void ActivateExit()
|
||
{
|
||
if (isActivated) return;
|
||
|
||
// Проверяем, жив ли босс
|
||
var boss = Object.FindAnyObjectByType<TitanBossAI>();
|
||
if (boss != null && boss.CurrentState != TitanBossAI.BossState.Dead)
|
||
{
|
||
GameAudioSynthesizer.PlayErrorCode();
|
||
Debug.Log("<color=red>[FinalExit] ОШИБКА: Шлюз заблокирован протоколом карантина! Устраните Альфа-Мутанта.</color>");
|
||
return;
|
||
}
|
||
|
||
isActivated = true;
|
||
|
||
if (statusLight != null)
|
||
{
|
||
statusLight.color = new Color(0.2f, 1f, 0.4f); // Зеленый
|
||
statusLight.intensity = 4.0f;
|
||
}
|
||
|
||
GameAudioSynthesizer.PlaySuccessChime();
|
||
|
||
var victoryUI = Object.FindAnyObjectByType<FinalVictoryUI>(FindObjectsInactive.Include);
|
||
if (victoryUI != null)
|
||
{
|
||
victoryUI.ShowVictoryScreen();
|
||
}
|
||
else
|
||
{
|
||
Debug.Log("<color=green>[FinalExit] Эвакуационный шлюз открыт! Игра завершена!</color>");
|
||
}
|
||
}
|
||
}
|