using UnityEngine; using UnityEngine.UI; using TMPro; public class Notepad : MonoBehaviour { public AppLayer appLayer; private TextMeshProUGUI titleText; private TMP_InputField inputField; void Awake() { BuildUI(); } void Start() { if (appLayer != null) { appLayer.sizeDelta = new Vector2(600, 400); appLayer.appMinSize = new Vector2(300, 200); appLayer.color = new Color(31, 31, 31); } } void BuildUI() { // Главный контейнер GameObject mainV = new GameObject("MainV", typeof(RectTransform), typeof(VerticalLayoutGroup)); mainV.transform.SetParent(transform, false); Stretch(mainV.GetComponent()); var vGroup = mainV.GetComponent(); vGroup.childControlWidth = true; vGroup.childControlHeight = true; vGroup.childForceExpandHeight = false; // --- ВЕРХ: Заголовок (Высота 20) --- GameObject header = new GameObject("Header", typeof(RectTransform), typeof(Image)); header.transform.SetParent(mainV.transform, false); header.GetComponent().color = new Color(0.8f, 0.8f, 0.8f); header.AddComponent().preferredHeight = 20; titleText = CreateTMPText("Новый текстовый документ.txt", header.transform, 12, Color.black); titleText.alignment = TextAlignmentOptions.Left; titleText.rectTransform.offsetMin = new Vector2(5, 0); // --- ЦЕНТР: Поле ввода (Занимает всё остальное) --- GameObject scrollGo = new GameObject("TextScroll", typeof(RectTransform), typeof(ScrollRect), typeof(Image)); scrollGo.transform.SetParent(mainV.transform, false); scrollGo.AddComponent().flexibleHeight = 1; // Поле ввода TMP GameObject inputGo = new GameObject("InputField", typeof(RectTransform), typeof(TMP_InputField)); inputGo.transform.SetParent(scrollGo.transform, false); Stretch(inputGo.GetComponent()); inputField = inputGo.GetComponent(); inputField.lineType = TMP_InputField.LineType.MultiLineNewline; // Текстовая область внутри InputField GameObject textArea = new GameObject("TextArea", typeof(RectTransform), typeof(RectMask2D)); textArea.transform.SetParent(inputGo.transform, false); Stretch(textArea.GetComponent()); textArea.GetComponent().offsetMin = new Vector2(5, 5); GameObject textDisplay = new GameObject("Text", typeof(RectTransform), typeof(TextMeshProUGUI)); textDisplay.transform.SetParent(textArea.transform, false); Stretch(textDisplay.GetComponent()); var t = textDisplay.GetComponent(); t.color = Color.black; t.fontSize = 14; inputField.textViewport = textArea.GetComponent(); inputField.textComponent = t; } // Метод для открытия файла public void OpenFile(string fileName, string content) { if (titleText != null) titleText.text = fileName; if (inputField != null) inputField.text = content; // Делаем окно активным через AppLayer if (appLayer != null) appLayer.Show(); } // Вспомогательные методы TextMeshProUGUI CreateTMPText(string content, Transform parent, int size, Color col) { GameObject go = new GameObject("Text", typeof(RectTransform), typeof(TextMeshProUGUI)); go.transform.SetParent(parent, false); Stretch(go.GetComponent()); var t = go.GetComponent(); t.text = content; t.fontSize = size; t.color = col; t.font = TMP_Settings.defaultFontAsset; return t; } void Stretch(RectTransform rt) { rt.anchorMin = Vector2.zero; rt.anchorMax = Vector2.one; rt.offsetMin = Vector2.zero; rt.offsetMax = Vector2.zero; } }