158 lines
5.9 KiB
C#
158 lines
5.9 KiB
C#
using UnityEngine;
|
||
using UnityEngine.InputSystem;
|
||
using UnityEngine.SceneManagement;
|
||
|
||
namespace _Project.Scripts.PlayerUtils
|
||
{
|
||
public class PlayerUI : MonoBehaviour
|
||
{
|
||
[Header("Настройки Интерфейса")]
|
||
[SerializeField] private bool showHUD = true;
|
||
|
||
[Header("Панель проигрыша (Canvas UI)")]
|
||
[Tooltip("Перетащи сюда панель поражения из Canvas. Если пусто — отрисуется встроенная панель проигрыша.")]
|
||
[SerializeField] private GameObject losePanel;
|
||
|
||
private PlayerMovement movement;
|
||
private PlayerPossession possession;
|
||
private bool isGameOver = false;
|
||
|
||
private void Start()
|
||
{
|
||
movement = Player.Instance.Movement;
|
||
possession = Player.Instance.Possession;
|
||
|
||
if (losePanel != null)
|
||
{
|
||
losePanel.SetActive(false);
|
||
}
|
||
|
||
if (possession != null)
|
||
{
|
||
possession.OnPlayerDied += HandlePlayerDied;
|
||
}
|
||
}
|
||
|
||
private void OnDestroy()
|
||
{
|
||
if (possession != null)
|
||
{
|
||
possession.OnPlayerDied -= HandlePlayerDied;
|
||
}
|
||
}
|
||
|
||
private void HandlePlayerDied()
|
||
{
|
||
isGameOver = true;
|
||
|
||
if (losePanel != null)
|
||
{
|
||
losePanel.SetActive(true);
|
||
}
|
||
}
|
||
|
||
private void Update()
|
||
{
|
||
// Быстрый перезапуск по клавише R после смерти
|
||
if (isGameOver && Keyboard.current != null && Keyboard.current.rKey.wasPressedThisFrame)
|
||
{
|
||
RestartLevel();
|
||
}
|
||
}
|
||
|
||
// Этот метод также можно повесить на кнопку (Button -> OnClick) на твоём Canvas!
|
||
public void RestartLevel()
|
||
{
|
||
Time.timeScale = 1f;
|
||
Time.fixedDeltaTime = 0.02f;
|
||
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
|
||
}
|
||
|
||
private void OnGUI()
|
||
{
|
||
// 1. Если игрок погиб, а кастомная Canvas-панель не назначена — рисуем экран проигрыша
|
||
if (isGameOver)
|
||
{
|
||
if (losePanel == null)
|
||
{
|
||
DrawFallbackLoseScreen();
|
||
}
|
||
return;
|
||
}
|
||
|
||
// 2. Обычный боевой HUD
|
||
if (!showHUD || movement == null) return;
|
||
|
||
float speed = movement.CurrentSpeed;
|
||
float csUnits = speed * 38.5f;
|
||
|
||
GUIStyle style = new GUIStyle { fontSize = 22, fontStyle = FontStyle.Bold };
|
||
|
||
string state = "";
|
||
if (movement.IsSliding) { style.normal.textColor = Color.yellow; state = " [SLIDE]"; }
|
||
else if (!movement.IsGrounded) { style.normal.textColor = Color.green; state = " [AIR]"; }
|
||
else style.normal.textColor = Color.white;
|
||
|
||
GUI.Label(new Rect(30, 30, 600, 40), $"Speed: {speed:F1} m/s ({csUnits:F0} u/s){state}", style);
|
||
|
||
if (possession != null && possession.CurrentProfile != null)
|
||
{
|
||
style.normal.textColor = possession.IsInSpiritForm ? Color.cyan : Color.green;
|
||
string bodyInfo = $"Форма: {possession.CurrentProfile.displayName} | HP: {possession.CurrentHealth:F0}/{possession.MaxHealth:F0}";
|
||
if (!possession.IsInSpiritForm) bodyInfo += " ([Q] Покинуть тело)";
|
||
GUI.Label(new Rect(30, 65, 800, 40), bodyInfo, style);
|
||
|
||
if (possession.AimedEnemy != null)
|
||
{
|
||
if (possession.IsTargetInPossessZone)
|
||
{
|
||
style.normal.textColor = Color.cyan;
|
||
GUI.Label(new Rect(Screen.width / 2f - 160f, Screen.height / 2f + 40f, 450f, 40f),
|
||
$"[E] ВСЕЛИТЬСЯ: {possession.AimedEnemy.enemyClass}", style);
|
||
}
|
||
else
|
||
{
|
||
style.normal.textColor = new Color(1f, 0.5f, 0.5f);
|
||
GUI.Label(new Rect(Screen.width / 2f - 180f, Screen.height / 2f + 40f, 500f, 40f),
|
||
$"ДАЛЕКО — ВОЙДИ В СФЕРУ ({possession.AimedEnemy.enemyClass})", style);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
private void DrawFallbackLoseScreen()
|
||
{
|
||
// Полупрозрачное тёмно-красное/чёрное затемнение на весь экран
|
||
Color prevColor = GUI.color;
|
||
GUI.color = new Color(0.08f, 0.01f, 0.02f, 0.85f);
|
||
GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), Texture2D.whiteTexture);
|
||
GUI.color = prevColor;
|
||
|
||
GUIStyle titleStyle = new GUIStyle
|
||
{
|
||
fontSize = 48,
|
||
fontStyle = FontStyle.Bold,
|
||
alignment = TextAnchor.MiddleCenter
|
||
};
|
||
titleStyle.normal.textColor = new Color(1f, 0.2f, 0.25f);
|
||
|
||
GUIStyle subStyle = new GUIStyle
|
||
{
|
||
fontSize = 22,
|
||
alignment = TextAnchor.MiddleCenter
|
||
};
|
||
subStyle.normal.textColor = new Color(0.85f, 0.85f, 0.85f);
|
||
|
||
float cx = Screen.width / 2f;
|
||
float cy = Screen.height / 2f;
|
||
|
||
GUI.Label(new Rect(cx - 300f, cy - 110f, 600f, 60f), "ДУХ МЩЕНИЯ РАЗВЕЯН", titleStyle);
|
||
GUI.Label(new Rect(cx - 300f, cy - 45f, 600f, 40f), "Вы потеряли последнюю связь с этим миром.", subStyle);
|
||
|
||
if (GUI.Button(new Rect(cx - 150f, cy + 25f, 300f, 50f), "ПЕРЕЗАПУСТИТЬ ЭТАЖ [R]"))
|
||
{
|
||
RestartLevel();
|
||
}
|
||
}
|
||
}
|
||
} |