587 lines
27 KiB
C#
587 lines
27 KiB
C#
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
using UnityEngine.EventSystems;
|
||
using UnityEngine.InputSystem.UI;
|
||
using UnityEngine.Rendering.Universal;
|
||
using UnityEditor;
|
||
using UnityEditor.SceneManagement;
|
||
using UnityEngine.SceneManagement;
|
||
|
||
public static class MainMenuSceneBuilder
|
||
{
|
||
private static DefaultControls.Resources uiResources;
|
||
private static Font standardFont;
|
||
private static Font handwrittenFont;
|
||
|
||
[MenuItem("Tools/Build Main Menu Scene")]
|
||
public static string BuildScene()
|
||
{
|
||
standardFont = Resources.GetBuiltinResource<Font>("LegacyRuntime.ttf");
|
||
if (standardFont == null)
|
||
standardFont = Resources.GetBuiltinResource<Font>("Arial.ttf");
|
||
|
||
// Загрузка рукописного шрифта для названия Synthesia
|
||
handwrittenFont = AssetDatabase.LoadAssetAtPath<Font>("Assets/Fonts/SegoeScriptBold.ttf");
|
||
if (handwrittenFont == null)
|
||
handwrittenFont = AssetDatabase.LoadAssetAtPath<Font>("Assets/Fonts/Inkfree.ttf");
|
||
if (handwrittenFont == null)
|
||
handwrittenFont = AssetDatabase.LoadAssetAtPath<Font>("Assets/Fonts/MonotypeCorsiva.ttf");
|
||
if (handwrittenFont == null)
|
||
handwrittenFont = standardFont;
|
||
|
||
uiResources = new DefaultControls.Resources
|
||
{
|
||
standard = AssetDatabase.GetBuiltinExtraResource<Sprite>("UI/Skin/UISprite.psd"),
|
||
background = AssetDatabase.GetBuiltinExtraResource<Sprite>("UI/Skin/Background.psd"),
|
||
knob = AssetDatabase.GetBuiltinExtraResource<Sprite>("UI/Skin/Knob.psd"),
|
||
checkmark = AssetDatabase.GetBuiltinExtraResource<Sprite>("UI/Skin/Checkmark.psd"),
|
||
dropdown = AssetDatabase.GetBuiltinExtraResource<Sprite>("UI/Skin/DropdownArrow.psd"),
|
||
mask = AssetDatabase.GetBuiltinExtraResource<Sprite>("UI/Skin/UIMask.psd")
|
||
};
|
||
|
||
// Создаем новую пустую сцену
|
||
Scene newScene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
|
||
|
||
// 1. Камера (Абсолютно черный фон)
|
||
GameObject camGo = new GameObject("Main Camera");
|
||
Camera cam = camGo.AddComponent<Camera>();
|
||
cam.clearFlags = CameraClearFlags.SolidColor;
|
||
cam.backgroundColor = Color.black;
|
||
camGo.AddComponent<UniversalAdditionalCameraData>();
|
||
camGo.AddComponent<AudioListener>();
|
||
camGo.tag = "MainCamera";
|
||
camGo.transform.position = new Vector3(0, 0, -10);
|
||
|
||
// 2. EventSystem
|
||
GameObject eventSysGo = new GameObject("EventSystem");
|
||
eventSysGo.AddComponent<EventSystem>();
|
||
eventSysGo.AddComponent<InputSystemUIInputModule>();
|
||
|
||
// 3. Canvas (1920x1080)
|
||
GameObject canvasGo = new GameObject("Canvas");
|
||
Canvas canvas = canvasGo.AddComponent<Canvas>();
|
||
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
|
||
canvas.pixelPerfect = true;
|
||
|
||
CanvasScaler scaler = canvasGo.AddComponent<CanvasScaler>();
|
||
scaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
|
||
scaler.referenceResolution = new Vector2(1920, 1080);
|
||
scaler.screenMatchMode = CanvasScaler.ScreenMatchMode.MatchWidthOrHeight;
|
||
scaler.matchWidthOrHeight = 0.5f;
|
||
|
||
canvasGo.AddComponent<GraphicRaycaster>();
|
||
|
||
// 4. Менеджер Главного Меню
|
||
GameObject managerGo = new GameObject("MainMenuManager");
|
||
MainMenuManager manager = managerGo.AddComponent<MainMenuManager>();
|
||
|
||
// 5. Задний фон: Чистый глубокий черный цвет
|
||
CreateImage("Background_Black", canvasGo.transform,
|
||
Color.black,
|
||
Vector2.zero, Vector2.one, Vector2.zero, Vector2.zero);
|
||
|
||
// ==========================================
|
||
// 6. АНИМИРОВАННЫЕ ЖЕЛТЫЕ ВОЛНЫ ЭХОЛОКАЦИИ В ПРАВОМ НИЖНЕМ УГЛУ
|
||
// ==========================================
|
||
GameObject radarRoot = CreateEmptyRect("Corner_Echolocation_Radar", canvasGo.transform,
|
||
new Vector2(1f, 0f), new Vector2(1f, 0f),
|
||
new Vector2(280f, 280f), new Vector2(-140f, 140f));
|
||
|
||
MenuEcholocationRadar echoRadar = radarRoot.AddComponent<MenuEcholocationRadar>();
|
||
echoRadar.maxSimultaneousWaves = 3;
|
||
echoRadar.waveMaxRadius = 1800f; // Расходится на весь экран
|
||
echoRadar.waveSpeed = 180f;
|
||
echoRadar.waveSpawnInterval = 2.4f;
|
||
echoRadar.initialThickness = 110f;
|
||
echoRadar.maxThickness = 360f;
|
||
echoRadar.waveBaseColor = new Color(1.00f, 0.82f, 0.18f, 0.40f); // Теплая янтарная дымка
|
||
echoRadar.waveCoreColor = new Color(1.00f, 0.94f, 0.50f, 0.65f); // Мягкое золотистое ядро
|
||
echoRadar.beaconColor = new Color(1.00f, 0.88f, 0.20f, 0.85f);
|
||
|
||
// Без лишних рамок/квадратов в углу — только чистые волны эхолокации
|
||
echoRadar.radarBeaconDot = null;
|
||
echoRadar.radarReticle = null;
|
||
|
||
// ==========================================
|
||
// 7. НАЗВАНИЕ ИГРЫ: "Synthesia" В ЦЕНТРЕ (РУКОПИСНЫЙ ШРИФТ)
|
||
// ==========================================
|
||
GameObject headerContainer = CreateEmptyRect("Header_Container", canvasGo.transform,
|
||
new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f),
|
||
new Vector2(1100f, 200f), new Vector2(0f, 210f));
|
||
|
||
GameObject titleObj = CreateTextWithFont("Title_Synthesia", headerContainer.transform,
|
||
"Synthesia",
|
||
handwrittenFont,
|
||
110, FontStyle.Bold, TextAnchor.MiddleCenter,
|
||
new Color(1.0f, 1.0f, 1.0f, 1.0f),
|
||
Vector2.zero, Vector2.one, Vector2.zero, Vector2.zero);
|
||
|
||
// Теплый желтый ореол свечения
|
||
Outline titleGlow = titleObj.AddComponent<Outline>();
|
||
titleGlow.effectColor = new Color(1.00f, 0.85f, 0.10f, 0.50f);
|
||
titleGlow.effectDistance = new Vector2(2.5f, -2.5f);
|
||
|
||
Shadow titleShadow = titleObj.AddComponent<Shadow>();
|
||
titleShadow.effectColor = new Color(0.12f, 0.10f, 0.00f, 0.80f);
|
||
titleShadow.effectDistance = new Vector2(4f, -4f);
|
||
|
||
// ==========================================
|
||
// 8. КНОПКИ В ЦЕНТРЕ (БОЛЬШИЕ, ЯРКИЕ ЖЕЛТЫЕ, ОЧЕВИДНО НЕ ЧЕРНЫЕ)
|
||
// ==========================================
|
||
GameObject mainMenuPanel = CreateEmptyRect("MainMenuPanel", canvasGo.transform,
|
||
new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f),
|
||
new Vector2(620f, 380f), new Vector2(0f, -110f));
|
||
|
||
VerticalLayoutGroup menuLayout = mainMenuPanel.AddComponent<VerticalLayoutGroup>();
|
||
menuLayout.childAlignment = TextAnchor.MiddleCenter;
|
||
menuLayout.spacing = 24f;
|
||
menuLayout.childControlWidth = true;
|
||
menuLayout.childControlHeight = true;
|
||
menuLayout.childForceExpandWidth = true;
|
||
menuLayout.childForceExpandHeight = false;
|
||
|
||
// Яркий золотисто-желтый цвет кнопок с глубоким черным текстом (очевидно не черные)
|
||
Color yellowBtnNormal = new Color(0.95f, 0.78f, 0.12f, 1.00f);
|
||
Color yellowBtnHover = new Color(1.00f, 0.90f, 0.35f, 1.00f);
|
||
Color yellowBtnPress = new Color(0.78f, 0.62f, 0.08f, 1.00f);
|
||
Color blackBtnText = new Color(0.06f, 0.06f, 0.06f, 1.00f);
|
||
|
||
// Кнопка 1: "ИГРАТЬ"
|
||
Button playBtn = CreateBigMenuButton("Button_Play", mainMenuPanel.transform,
|
||
"ИГРАТЬ",
|
||
yellowBtnNormal,
|
||
yellowBtnHover,
|
||
yellowBtnPress,
|
||
blackBtnText,
|
||
90f, 34);
|
||
|
||
// Кнопка 2: "НАСТРОЙКИ"
|
||
Button settingsBtn = CreateBigMenuButton("Button_Settings", mainMenuPanel.transform,
|
||
"НАСТРОЙКИ",
|
||
yellowBtnNormal,
|
||
yellowBtnHover,
|
||
yellowBtnPress,
|
||
blackBtnText,
|
||
90f, 34);
|
||
|
||
// Кнопка 3: "ВЫХОД"
|
||
Button quitBtn = CreateBigMenuButton("Button_Quit", mainMenuPanel.transform,
|
||
"ВЫХОД",
|
||
yellowBtnNormal,
|
||
yellowBtnHover,
|
||
yellowBtnPress,
|
||
blackBtnText,
|
||
90f, 34);
|
||
|
||
// ==========================================
|
||
// 9. ПАНЕЛЬ НАСТРОЕК (В ЧЕРНО-ЖЕЛТОМ СТИЛЕ)
|
||
// ==========================================
|
||
GameObject settingsPanel = CreateEmptyRect("SettingsPanel", canvasGo.transform,
|
||
Vector2.zero, Vector2.one, Vector2.zero, Vector2.zero);
|
||
|
||
// Затемняющий фон
|
||
CreateImage("Backdrop_Dim", settingsPanel.transform,
|
||
new Color(0.0f, 0.0f, 0.0f, 0.92f),
|
||
Vector2.zero, Vector2.one, Vector2.zero, Vector2.zero);
|
||
|
||
// Модальное окно настроек
|
||
GameObject settingsCard = CreateImage("Settings_Card", settingsPanel.transform,
|
||
new Color(0.04f, 0.04f, 0.04f, 0.98f),
|
||
new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f),
|
||
new Vector2(920f, 740f), Vector2.zero);
|
||
|
||
Outline panelOutline = settingsCard.AddComponent<Outline>();
|
||
panelOutline.effectColor = new Color(1.00f, 0.85f, 0.10f, 0.55f);
|
||
panelOutline.effectDistance = new Vector2(2f, -2f);
|
||
|
||
CreateText("Settings_Header", settingsCard.transform,
|
||
"НАСТРОЙКИ",
|
||
28, FontStyle.Bold, TextAnchor.MiddleCenter,
|
||
new Color(1.00f, 0.85f, 0.10f, 1.0f),
|
||
new Vector2(0.05f, 0.90f), new Vector2(0.95f, 0.98f), Vector2.zero, Vector2.zero);
|
||
|
||
CreateImage("Settings_Divider", settingsCard.transform,
|
||
new Color(1.00f, 0.85f, 0.10f, 0.40f),
|
||
new Vector2(0.05f, 0.89f), new Vector2(0.95f, 0.895f), Vector2.zero, Vector2.zero);
|
||
|
||
// Контейнер списка настроек
|
||
GameObject settingsList = CreateEmptyRect("Settings_List", settingsCard.transform,
|
||
new Vector2(0.06f, 0.14f), new Vector2(0.94f, 0.87f), Vector2.zero, Vector2.zero);
|
||
|
||
VerticalLayoutGroup settingsLayout = settingsList.AddComponent<VerticalLayoutGroup>();
|
||
settingsLayout.spacing = 15f;
|
||
settingsLayout.childAlignment = TextAnchor.UpperCenter;
|
||
settingsLayout.childControlWidth = true;
|
||
settingsLayout.childControlHeight = false;
|
||
settingsLayout.childForceExpandWidth = true;
|
||
settingsLayout.childForceExpandHeight = false;
|
||
|
||
// --- Раздел: Звук ---
|
||
CreateCategoryHeader("HEADER_AUDIO", settingsList.transform, "— ЗВУК И ЭХОЛОКАЦИЯ —");
|
||
|
||
var volumeRow = CreateSliderRow("Row_Volume", settingsList.transform, "Громкость звука", 0f, 1f, 1f, "%");
|
||
Slider volSlider = volumeRow.slider;
|
||
Text volText = volumeRow.valueText;
|
||
|
||
Toggle muteToggle = CreateToggleRow("Row_Mute", settingsList.transform, "Отключить звук (Mute)");
|
||
|
||
// --- Раздел: Графика ---
|
||
CreateCategoryHeader("HEADER_GRAPHICS", settingsList.transform, "— ГРАФИКА —");
|
||
|
||
Dropdown qualityDropdown = CreateDropdownRow("Row_Quality", settingsList.transform, "Качество графики");
|
||
Toggle fullscreenToggle = CreateToggleRow("Row_Fullscreen", settingsList.transform, "Полноэкранный режим");
|
||
Dropdown resolutionDropdown = CreateDropdownRow("Row_Resolution", settingsList.transform, "Разрешение экрана");
|
||
|
||
// --- Раздел: Управление ---
|
||
CreateCategoryHeader("HEADER_CONTROLS", settingsList.transform, "— УПРАВЛЕНИЕ —");
|
||
|
||
var sensRow = CreateSliderRow("Row_Sensitivity", settingsList.transform, "Чувствительность мыши", 0.2f, 3.0f, 1.0f, "x");
|
||
Slider sensSlider = sensRow.slider;
|
||
Text sensText = sensRow.valueText;
|
||
|
||
// Нижняя строка кнопок в панели настроек
|
||
GameObject bottomButtonsRow = CreateEmptyRect("Settings_BottomButtons", settingsCard.transform,
|
||
new Vector2(0.06f, 0.03f), new Vector2(0.94f, 0.12f), Vector2.zero, Vector2.zero);
|
||
|
||
HorizontalLayoutGroup bottomLayout = bottomButtonsRow.AddComponent<HorizontalLayoutGroup>();
|
||
bottomLayout.spacing = 30f;
|
||
bottomLayout.childAlignment = TextAnchor.MiddleCenter;
|
||
bottomLayout.childControlWidth = true;
|
||
bottomLayout.childControlHeight = true;
|
||
bottomLayout.childForceExpandWidth = true;
|
||
bottomLayout.childForceExpandHeight = true;
|
||
|
||
Button resetBtn = CreateBigMenuButton("Button_ResetDefaults", bottomButtonsRow.transform,
|
||
"Сброс",
|
||
new Color(0.35f, 0.15f, 0.15f, 1.0f),
|
||
new Color(0.50f, 0.20f, 0.20f, 1.0f),
|
||
new Color(0.65f, 0.25f, 0.25f, 1.0f),
|
||
Color.white,
|
||
50f, 18);
|
||
|
||
Button backBtn = CreateBigMenuButton("Button_Back", bottomButtonsRow.transform,
|
||
"Применить и выйти",
|
||
new Color(0.95f, 0.78f, 0.12f, 1.0f),
|
||
new Color(1.00f, 0.90f, 0.35f, 1.0f),
|
||
new Color(0.78f, 0.62f, 0.08f, 1.0f),
|
||
new Color(0.06f, 0.06f, 0.06f, 1.0f),
|
||
50f, 18);
|
||
|
||
// ==========================================
|
||
// 10. ПАНЕЛЬ ЗАГРУЗКИ (LOADING PANEL)
|
||
// ==========================================
|
||
GameObject loadingPanel = CreateImage("LoadingPanel", canvasGo.transform,
|
||
new Color(0f, 0f, 0f, 0.98f),
|
||
Vector2.zero, Vector2.one, Vector2.zero, Vector2.zero);
|
||
|
||
GameObject loadingContainer = CreateEmptyRect("Loading_Container", loadingPanel.transform,
|
||
new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f),
|
||
new Vector2(640f, 220f), Vector2.zero);
|
||
|
||
CreateTextWithFont("Loading_Title", loadingContainer.transform,
|
||
"Synthesia",
|
||
handwrittenFont,
|
||
52, FontStyle.Bold, TextAnchor.MiddleCenter,
|
||
new Color(1.00f, 0.85f, 0.10f, 1.0f),
|
||
new Vector2(0f, 0.65f), new Vector2(1f, 1f), Vector2.zero, Vector2.zero);
|
||
|
||
GameObject sliderObj = DefaultControls.CreateSlider(uiResources);
|
||
sliderObj.name = "Loading_ProgressBar";
|
||
sliderObj.transform.SetParent(loadingContainer.transform, false);
|
||
RectTransform sliderRt = sliderObj.GetComponent<RectTransform>();
|
||
sliderRt.anchorMin = new Vector2(0.05f, 0.38f);
|
||
sliderRt.anchorMax = new Vector2(0.95f, 0.52f);
|
||
sliderRt.offsetMin = Vector2.zero;
|
||
sliderRt.offsetMax = Vector2.zero;
|
||
|
||
Slider loadingSlider = sliderObj.GetComponent<Slider>();
|
||
loadingSlider.interactable = false;
|
||
Transform fillTransform = sliderObj.transform.Find("Fill Area/Fill");
|
||
if (fillTransform != null)
|
||
{
|
||
Image fillImg = fillTransform.GetComponent<Image>();
|
||
if (fillImg != null) fillImg.color = new Color(1.00f, 0.85f, 0.10f, 1f);
|
||
}
|
||
|
||
GameObject loadingPercent = CreateText("Loading_Text", loadingContainer.transform,
|
||
"Загрузка...",
|
||
18, FontStyle.Normal, TextAnchor.MiddleCenter,
|
||
new Color(0.95f, 0.95f, 0.95f, 0.9f),
|
||
new Vector2(0f, 0f), new Vector2(1f, 0.30f), Vector2.zero, Vector2.zero);
|
||
Text loadingText = loadingPercent.GetComponent<Text>();
|
||
|
||
// ==========================================
|
||
// 11. ПРИВЯЗКА К MAINMENUMANAGER
|
||
// ==========================================
|
||
manager.headerContainer = headerContainer;
|
||
manager.mainMenuPanel = mainMenuPanel;
|
||
manager.settingsPanel = settingsPanel;
|
||
manager.loadingPanel = loadingPanel;
|
||
manager.loadingSlider = loadingSlider;
|
||
manager.loadingText = loadingText;
|
||
manager.volumeSlider = volSlider;
|
||
manager.volumeValueText = volText;
|
||
manager.muteToggle = muteToggle;
|
||
manager.qualityDropdown = qualityDropdown;
|
||
manager.fullscreenToggle = fullscreenToggle;
|
||
manager.resolutionDropdown = resolutionDropdown;
|
||
manager.sensitivitySlider = sensSlider;
|
||
manager.sensitivityValueText = sensText;
|
||
manager.gameSceneName = "SampleScene";
|
||
|
||
// Привязываем кнопки через UnityEvent
|
||
UnityEditor.Events.UnityEventTools.AddPersistentListener(playBtn.onClick, manager.PlayGame);
|
||
UnityEditor.Events.UnityEventTools.AddPersistentListener(settingsBtn.onClick, manager.OpenSettings);
|
||
UnityEditor.Events.UnityEventTools.AddPersistentListener(quitBtn.onClick, manager.QuitGame);
|
||
UnityEditor.Events.UnityEventTools.AddPersistentListener(resetBtn.onClick, manager.ResetToDefaults);
|
||
UnityEditor.Events.UnityEventTools.AddPersistentListener(backBtn.onClick, manager.CloseSettings);
|
||
|
||
// По умолчанию активны главное меню и радар
|
||
settingsPanel.SetActive(false);
|
||
loadingPanel.SetActive(false);
|
||
mainMenuPanel.SetActive(true);
|
||
headerContainer.SetActive(true);
|
||
|
||
// Сохраняем сцену MainMenu
|
||
string scenePath = "Assets/Scenes/MainMenu.unity";
|
||
EditorSceneManager.SaveScene(newScene, scenePath);
|
||
Debug.Log("[MainMenuSceneBuilder] Сцена Synthesia MainMenu успешно создана: " + scenePath);
|
||
|
||
// Добавляем в Build Settings при необходимости
|
||
EnsureSceneInBuildSettings(scenePath, 0);
|
||
|
||
return "SUCCESS: Minimalist Black & Yellow MainMenu 'Synthesia' successfully built!";
|
||
}
|
||
|
||
private static void EnsureSceneInBuildSettings(string scenePath, int targetIndex)
|
||
{
|
||
List<EditorBuildSettingsScene> list = new List<EditorBuildSettingsScene>(EditorBuildSettings.scenes);
|
||
for (int i = 0; i < list.Count; i++)
|
||
{
|
||
if (list[i].path == scenePath)
|
||
{
|
||
if (i != targetIndex && targetIndex < list.Count)
|
||
{
|
||
var item = list[i];
|
||
list.RemoveAt(i);
|
||
list.Insert(targetIndex, item);
|
||
EditorBuildSettings.scenes = list.ToArray();
|
||
}
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (targetIndex >= 0 && targetIndex <= list.Count)
|
||
list.Insert(targetIndex, new EditorBuildSettingsScene(scenePath, true));
|
||
else
|
||
list.Add(new EditorBuildSettingsScene(scenePath, true));
|
||
|
||
EditorBuildSettings.scenes = list.ToArray();
|
||
}
|
||
|
||
#region Хелперы UI
|
||
|
||
private static GameObject CreateEmptyRect(string name, Transform parent, Vector2 anchorMin, Vector2 anchorMax, Vector2 sizeDelta, Vector2 anchoredPosition)
|
||
{
|
||
GameObject go = new GameObject(name, typeof(RectTransform));
|
||
go.transform.SetParent(parent, false);
|
||
RectTransform rt = go.GetComponent<RectTransform>();
|
||
rt.anchorMin = anchorMin;
|
||
rt.anchorMax = anchorMax;
|
||
rt.sizeDelta = sizeDelta;
|
||
rt.anchoredPosition = anchoredPosition;
|
||
return go;
|
||
}
|
||
|
||
private static GameObject CreateImage(string name, Transform parent, Color color, Vector2 anchorMin, Vector2 anchorMax, Vector2 sizeDelta, Vector2 anchoredPosition)
|
||
{
|
||
GameObject go = CreateEmptyRect(name, parent, anchorMin, anchorMax, sizeDelta, anchoredPosition);
|
||
Image img = go.AddComponent<Image>();
|
||
img.color = color;
|
||
return go;
|
||
}
|
||
|
||
private static GameObject CreateText(string name, Transform parent, string text, int fontSize, FontStyle style, TextAnchor alignment, Color color, Vector2 anchorMin, Vector2 anchorMax, Vector2 sizeDelta, Vector2 anchoredPosition)
|
||
{
|
||
return CreateTextWithFont(name, parent, text, standardFont, fontSize, style, alignment, color, anchorMin, anchorMax, sizeDelta, anchoredPosition);
|
||
}
|
||
|
||
private static GameObject CreateTextWithFont(string name, Transform parent, string text, Font font, int fontSize, FontStyle style, TextAnchor alignment, Color color, Vector2 anchorMin, Vector2 anchorMax, Vector2 sizeDelta, Vector2 anchoredPosition)
|
||
{
|
||
GameObject go = CreateEmptyRect(name, parent, anchorMin, anchorMax, sizeDelta, anchoredPosition);
|
||
Text t = go.AddComponent<Text>();
|
||
t.font = font != null ? font : standardFont;
|
||
t.text = text;
|
||
t.fontSize = fontSize;
|
||
t.fontStyle = style;
|
||
t.alignment = alignment;
|
||
t.color = color;
|
||
t.horizontalOverflow = HorizontalWrapMode.Overflow;
|
||
t.verticalOverflow = VerticalWrapMode.Overflow;
|
||
return go;
|
||
}
|
||
|
||
private static Button CreateBigMenuButton(string name, Transform parent, string label, Color normalColor, Color highlightedColor, Color pressedColor, Color textColor, float height, int fontSize)
|
||
{
|
||
GameObject btnObj = DefaultControls.CreateButton(uiResources);
|
||
btnObj.name = name;
|
||
btnObj.transform.SetParent(parent, false);
|
||
|
||
RectTransform rt = btnObj.GetComponent<RectTransform>();
|
||
if (rt != null)
|
||
{
|
||
rt.sizeDelta = new Vector2(rt.sizeDelta.x, height);
|
||
}
|
||
|
||
LayoutElement layout = btnObj.AddComponent<LayoutElement>();
|
||
layout.minHeight = height;
|
||
layout.preferredHeight = height;
|
||
|
||
Image img = btnObj.GetComponent<Image>();
|
||
img.color = normalColor;
|
||
img.type = Image.Type.Sliced;
|
||
|
||
// Выразительная окантовка кнопки
|
||
Outline btnOutline = btnObj.AddComponent<Outline>();
|
||
btnOutline.effectColor = new Color(1.00f, 0.95f, 0.60f, 0.70f);
|
||
btnOutline.effectDistance = new Vector2(2f, -2f);
|
||
|
||
Shadow btnShadow = btnObj.AddComponent<Shadow>();
|
||
btnShadow.effectColor = new Color(0.00f, 0.00f, 0.00f, 0.50f);
|
||
btnShadow.effectDistance = new Vector2(3f, -3f);
|
||
|
||
Button btn = btnObj.GetComponent<Button>();
|
||
ColorBlock colors = btn.colors;
|
||
colors.normalColor = normalColor;
|
||
colors.highlightedColor = highlightedColor;
|
||
colors.pressedColor = pressedColor;
|
||
colors.selectedColor = highlightedColor;
|
||
colors.colorMultiplier = 1f;
|
||
colors.fadeDuration = 0.12f;
|
||
btn.colors = colors;
|
||
|
||
Text text = btnObj.GetComponentInChildren<Text>();
|
||
if (text != null)
|
||
{
|
||
text.font = standardFont;
|
||
text.text = label;
|
||
text.fontSize = fontSize;
|
||
text.fontStyle = FontStyle.Bold;
|
||
text.color = textColor;
|
||
text.alignment = TextAnchor.MiddleCenter;
|
||
text.horizontalOverflow = HorizontalWrapMode.Overflow;
|
||
text.verticalOverflow = VerticalWrapMode.Overflow;
|
||
}
|
||
|
||
return btn;
|
||
}
|
||
|
||
private static void CreateCategoryHeader(string name, Transform parent, string text)
|
||
{
|
||
GameObject go = CreateEmptyRect(name, parent, Vector2.zero, Vector2.one, new Vector2(0f, 32f), Vector2.zero);
|
||
LayoutElement layout = go.AddComponent<LayoutElement>();
|
||
layout.minHeight = 32f;
|
||
layout.preferredHeight = 32f;
|
||
|
||
Text t = go.AddComponent<Text>();
|
||
t.font = standardFont;
|
||
t.text = text;
|
||
t.fontSize = 16;
|
||
t.fontStyle = FontStyle.Bold;
|
||
t.alignment = TextAnchor.MiddleLeft;
|
||
t.color = new Color(1.00f, 0.85f, 0.10f, 0.95f);
|
||
}
|
||
|
||
private static (Slider slider, Text valueText) CreateSliderRow(string name, Transform parent, string label, float min, float max, float def, string unitSuffix)
|
||
{
|
||
GameObject row = CreateEmptyRect(name, parent, Vector2.zero, Vector2.one, new Vector2(0f, 44f), Vector2.zero);
|
||
LayoutElement layout = row.AddComponent<LayoutElement>();
|
||
layout.minHeight = 44f;
|
||
layout.preferredHeight = 44f;
|
||
|
||
CreateText("Label", row.transform, label, 16, FontStyle.Normal, TextAnchor.MiddleLeft,
|
||
new Color(0.92f, 0.92f, 0.92f, 1f), new Vector2(0f, 0f), new Vector2(0.40f, 1f), Vector2.zero, Vector2.zero);
|
||
|
||
GameObject sliderObj = DefaultControls.CreateSlider(uiResources);
|
||
sliderObj.name = "Slider";
|
||
sliderObj.transform.SetParent(row.transform, false);
|
||
RectTransform sliderRt = sliderObj.GetComponent<RectTransform>();
|
||
sliderRt.anchorMin = new Vector2(0.42f, 0.20f);
|
||
sliderRt.anchorMax = new Vector2(0.82f, 0.80f);
|
||
sliderRt.offsetMin = Vector2.zero;
|
||
sliderRt.offsetMax = Vector2.zero;
|
||
|
||
Slider slider = sliderObj.GetComponent<Slider>();
|
||
slider.minValue = min;
|
||
slider.maxValue = max;
|
||
slider.value = def;
|
||
|
||
Transform fill = sliderObj.transform.Find("Fill Area/Fill");
|
||
if (fill != null)
|
||
{
|
||
var img = fill.GetComponent<Image>();
|
||
if (img != null) img.color = new Color(1.00f, 0.85f, 0.10f, 1f);
|
||
}
|
||
|
||
GameObject valueTextObj = CreateText("ValueText", row.transform,
|
||
unitSuffix == "%" ? $"{Mathf.RoundToInt(def * 100)}%" : $"{def:F1}{unitSuffix}",
|
||
15, FontStyle.Bold, TextAnchor.MiddleRight,
|
||
new Color(1.00f, 0.85f, 0.10f, 1f), new Vector2(0.84f, 0f), new Vector2(1f, 1f), Vector2.zero, Vector2.zero);
|
||
|
||
return (slider, valueTextObj.GetComponent<Text>());
|
||
}
|
||
|
||
private static Toggle CreateToggleRow(string name, Transform parent, string label)
|
||
{
|
||
GameObject row = CreateEmptyRect(name, parent, Vector2.zero, Vector2.one, new Vector2(0f, 40f), Vector2.zero);
|
||
LayoutElement layout = row.AddComponent<LayoutElement>();
|
||
layout.minHeight = 40f;
|
||
layout.preferredHeight = 40f;
|
||
|
||
CreateText("Label", row.transform, label, 16, FontStyle.Normal, TextAnchor.MiddleLeft,
|
||
new Color(0.92f, 0.92f, 0.92f, 1f), new Vector2(0f, 0f), new Vector2(0.70f, 1f), Vector2.zero, Vector2.zero);
|
||
|
||
GameObject toggleObj = DefaultControls.CreateToggle(uiResources);
|
||
toggleObj.name = "Toggle";
|
||
toggleObj.transform.SetParent(row.transform, false);
|
||
RectTransform rt = toggleObj.GetComponent<RectTransform>();
|
||
rt.anchorMin = new Vector2(0.85f, 0.15f);
|
||
rt.anchorMax = new Vector2(1f, 0.85f);
|
||
rt.offsetMin = Vector2.zero;
|
||
rt.offsetMax = Vector2.zero;
|
||
|
||
Text defaultLabel = toggleObj.GetComponentInChildren<Text>();
|
||
if (defaultLabel != null) Object.DestroyImmediate(defaultLabel.gameObject);
|
||
|
||
return toggleObj.GetComponent<Toggle>();
|
||
}
|
||
|
||
private static Dropdown CreateDropdownRow(string name, Transform parent, string label)
|
||
{
|
||
GameObject row = CreateEmptyRect(name, parent, Vector2.zero, Vector2.one, new Vector2(0f, 44f), Vector2.zero);
|
||
LayoutElement layout = row.AddComponent<LayoutElement>();
|
||
layout.minHeight = 44f;
|
||
layout.preferredHeight = 44f;
|
||
|
||
CreateText("Label", row.transform, label, 16, FontStyle.Normal, TextAnchor.MiddleLeft,
|
||
new Color(0.92f, 0.92f, 0.92f, 1f), new Vector2(0f, 0f), new Vector2(0.40f, 1f), Vector2.zero, Vector2.zero);
|
||
|
||
GameObject ddObj = DefaultControls.CreateDropdown(uiResources);
|
||
ddObj.name = "Dropdown";
|
||
ddObj.transform.SetParent(row.transform, false);
|
||
RectTransform rt = ddObj.GetComponent<RectTransform>();
|
||
rt.anchorMin = new Vector2(0.42f, 0.10f);
|
||
rt.anchorMax = new Vector2(1f, 0.90f);
|
||
rt.offsetMin = Vector2.zero;
|
||
rt.offsetMax = Vector2.zero;
|
||
|
||
Image img = ddObj.GetComponent<Image>();
|
||
if (img != null) img.color = new Color(0.12f, 0.12f, 0.12f, 1f);
|
||
|
||
return ddObj.GetComponent<Dropdown>();
|
||
}
|
||
|
||
#endregion
|
||
}
|