Kursach_StealthAction/Assets/Scripts/Editor/SetupHealthBarHUD.cs
2026-10-19 20:14:24 +03:00

141 lines
6.3 KiB
C#

using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public static class SetupHealthBarHUD
{
[MenuItem("Tools/Setup Health Bar HUD")]
public static void Setup()
{
var existingCanvas = GameObject.Find("HUD_Canvas");
if (existingCanvas != null)
{
Object.DestroyImmediate(existingCanvas);
}
// Canvas
GameObject canvasGo = new GameObject("HUD_Canvas");
Canvas canvas = canvasGo.AddComponent<Canvas>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
CanvasScaler scaler = canvasGo.AddComponent<CanvasScaler>();
scaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
scaler.referenceResolution = new Vector2(1920, 1080);
scaler.matchWidthOrHeight = 0.5f;
canvasGo.AddComponent<GraphicRaycaster>();
// EventSystem
if (Object.FindAnyObjectByType<EventSystem>() == null)
{
GameObject esGo = new GameObject("EventSystem");
esGo.AddComponent<EventSystem>();
esGo.AddComponent<UnityEngine.InputSystem.UI.InputSystemUIInputModule>();
Undo.RegisterCreatedObjectUndo(esGo, "Create EventSystem");
}
// HealthBar Root Container (Top-Right)
GameObject hbContainer = new GameObject("HealthBar", typeof(RectTransform));
hbContainer.transform.SetParent(canvasGo.transform, false);
RectTransform hbRect = hbContainer.GetComponent<RectTransform>();
hbRect.anchorMin = new Vector2(1f, 1f);
hbRect.anchorMax = new Vector2(1f, 1f);
hbRect.pivot = new Vector2(1f, 1f);
hbRect.anchoredPosition = new Vector2(-40f, -40f);
hbRect.sizeDelta = new Vector2(280f, 36f);
// Background
GameObject bgGo = new GameObject("Background", typeof(RectTransform), typeof(Image));
bgGo.transform.SetParent(hbContainer.transform, false);
RectTransform bgRect = bgGo.GetComponent<RectTransform>();
bgRect.anchorMin = Vector2.zero;
bgRect.anchorMax = Vector2.one;
bgRect.offsetMin = Vector2.zero;
bgRect.offsetMax = Vector2.zero;
Image bgImg = bgGo.GetComponent<Image>();
bgImg.color = new Color(0.08f, 0.08f, 0.08f, 0.85f);
// Health Fill (Filled Image)
GameObject fillGo = new GameObject("HealthFill", typeof(RectTransform), typeof(Image));
fillGo.transform.SetParent(hbContainer.transform, false);
RectTransform fillRect = fillGo.GetComponent<RectTransform>();
fillRect.anchorMin = Vector2.zero;
fillRect.anchorMax = Vector2.one;
fillRect.offsetMin = new Vector2(4f, 4f);
fillRect.offsetMax = new Vector2(-4f, -4f);
Image fillImg = fillGo.GetComponent<Image>();
fillImg.type = Image.Type.Filled;
fillImg.fillMethod = Image.FillMethod.Horizontal;
fillImg.fillOrigin = (int)Image.OriginHorizontal.Left;
fillImg.fillAmount = 1f;
fillImg.color = new Color(0.2f, 0.85f, 0.3f, 1f);
// Text (Current / Max HP)
GameObject textGo = new GameObject("Text_HP", typeof(RectTransform), typeof(Text));
textGo.transform.SetParent(hbContainer.transform, false);
RectTransform textRect = textGo.GetComponent<RectTransform>();
textRect.anchorMin = Vector2.zero;
textRect.anchorMax = Vector2.one;
textRect.offsetMin = Vector2.zero;
textRect.offsetMax = Vector2.zero;
Text hpText = textGo.GetComponent<Text>();
hpText.text = "100 / 100";
hpText.alignment = TextAnchor.MiddleCenter;
hpText.fontSize = 20;
hpText.fontStyle = FontStyle.Bold;
hpText.color = Color.white;
Font defaultFont = Resources.GetBuiltinResource<Font>("LegacyRuntime.ttf");
if (defaultFont == null) defaultFont = Resources.GetBuiltinResource<Font>("Arial.ttf");
hpText.font = defaultFont;
// PlayerHealthUI
PlayerHealthUI uiComp = hbContainer.AddComponent<PlayerHealthUI>();
uiComp.healthFillImage = fillImg;
uiComp.healthText = hpText;
uiComp.playerHealth = Object.FindAnyObjectByType<PlayerHealth>();
// Crosshair / Center Cursor (Center of Screen)
GameObject crosshairGo = new GameObject("Crosshair", typeof(RectTransform));
crosshairGo.transform.SetParent(canvasGo.transform, false);
RectTransform crosshairRect = crosshairGo.GetComponent<RectTransform>();
crosshairRect.anchorMin = new Vector2(0.5f, 0.5f);
crosshairRect.anchorMax = new Vector2(0.5f, 0.5f);
crosshairRect.pivot = new Vector2(0.5f, 0.5f);
crosshairRect.anchoredPosition = Vector2.zero;
crosshairRect.sizeDelta = new Vector2(8f, 8f);
// Outline
GameObject chOutlineGo = new GameObject("Outline", typeof(RectTransform), typeof(Image));
chOutlineGo.transform.SetParent(crosshairGo.transform, false);
RectTransform chOutlineRect = chOutlineGo.GetComponent<RectTransform>();
chOutlineRect.anchorMin = Vector2.zero;
chOutlineRect.anchorMax = Vector2.one;
chOutlineRect.offsetMin = new Vector2(-1f, -1f);
chOutlineRect.offsetMax = new Vector2(1f, 1f);
Image chOutlineImg = chOutlineGo.GetComponent<Image>();
chOutlineImg.color = new Color(0f, 0f, 0f, 0.7f);
// Center Dot
GameObject chDotGo = new GameObject("Dot", typeof(RectTransform), typeof(Image));
chDotGo.transform.SetParent(crosshairGo.transform, false);
RectTransform chDotRect = chDotGo.GetComponent<RectTransform>();
chDotRect.anchorMin = Vector2.zero;
chDotRect.anchorMax = Vector2.one;
chDotRect.offsetMin = Vector2.zero;
chDotRect.offsetMax = Vector2.zero;
Image chDotImg = chDotGo.GetComponent<Image>();
chDotImg.color = new Color(1f, 1f, 1f, 0.95f);
// CrosshairUI component
CrosshairUI chScript = crosshairGo.AddComponent<CrosshairUI>();
chScript.dotImage = chDotImg;
chScript.outlineImage = chOutlineImg;
Undo.RegisterCreatedObjectUndo(canvasGo, "Create HUD_Canvas with HealthBar and Crosshair");
UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(canvasGo.scene);
Debug.Log("HUD HealthBar и прицел в центре экрана успешно созданы!");
}
}