Souljack/Assets/_Project/Scripts/PlayerUtils/PlayerUI.cs

158 lines
5.9 KiB
C#
Raw 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;
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();
}
}
}
}