Kursach_StealthAction/Assets/Scripts/FinalExitTerminal.cs
2026-10-23 15:44:09 +03:00

113 lines
3.6 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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>");
}
}
}