using UnityEngine; using UnityEditor; using UnityEngine.UI; using TMPro; public class InventorySceneSetup { [MenuItem("Tools/Create Player")] public static void CreatePlayer() { var go = new GameObject("Player"); var cc = go.AddComponent(); cc.height = 1.8f; cc.radius = 0.5f; cc.center = new Vector3(0, 0.9f, 0); var character = go.AddComponent(); character.walkSpeed = 5f; character.runSpeed = 9f; character.crouchSpeed = 2.5f; character.jumpHeight = 1.5f; character.gravity = -9.81f; GameObject body = GameObject.CreatePrimitive(PrimitiveType.Capsule); body.name = "Body"; body.transform.SetParent(go.transform); body.transform.localPosition = Vector3.zero; GameObject.Destroy(body.GetComponent()); GameObject head = new GameObject("Head"); head.transform.SetParent(go.transform); head.transform.localPosition = new Vector3(0, 0.8f, 0); character.head = head.transform; GameObject camObj = new GameObject("PlayerCamera"); camObj.transform.SetParent(head.transform); camObj.transform.localPosition = new Vector3(0, 0.1f, 0); var cam = camObj.AddComponent(); cam.tag = "MainCamera"; var existingCam = GameObject.FindGameObjectWithTag("MainCamera"); if (existingCam != null && existingCam != camObj) { GameObject.Destroy(existingCam); } go.tag = "Player"; go.transform.position = new Vector3(0, 2, -5); Selection.activeGameObject = go; Debug.Log("[Tools] Создан игрок!"); } [MenuItem("Tools/Create Item Prefab")] public static void CreateItemPrefab() { var itemGO = new GameObject("NewItem"); itemGO.AddComponent(); var sphere = itemGO.AddComponent(); sphere.radius = 0.5f; sphere.isTrigger = true; var visual = GameObject.CreatePrimitive(PrimitiveType.Cube); visual.name = "Visual"; visual.transform.SetParent(itemGO.transform); visual.transform.localPosition = Vector3.zero; visual.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f); GameObject.Destroy(visual.GetComponent()); Selection.activeGameObject = itemGO; Debug.Log("[Tools] Создан префаб предмета!"); } [MenuItem("Tools/Create Test Item in Scene")] public static void CreateTestItem() { // Создаём тестовый предмет в сцене var itemGO = new GameObject("TestItem"); itemGO.transform.position = new Vector3(0, 0.5f, 3); // Визуал var visual = GameObject.CreatePrimitive(PrimitiveType.Cube); visual.name = "Visual"; visual.transform.SetParent(itemGO.transform); visual.transform.localPosition = Vector3.zero; visual.transform.localScale = Vector3.one * 0.3f; GameObject.Destroy(visual.GetComponent()); // Компонент предмета var worldItem = itemGO.AddComponent(); worldItem.useFactory = false; // Тестовые данные var testItem = ScriptableObject.CreateInstance(); testItem.id = "test_item"; testItem.itemName = "Тестовый предмет"; testItem.description = "Просто тестовый предмет"; testItem.type = ItemType.Material; testItem.maxStack = 64; // Используем Setup чтобы инициализировать визуал и включить мгновенный подбор worldItem.Setup(testItem, 5); // Коллайдер для подбора (trigger для обычных коллайдеров) var box = itemGO.AddComponent(); box.isTrigger = true; box.size = Vector3.one; Selection.activeGameObject = itemGO; Debug.Log("[Tools] Создан тестовый предмет! Подойдите к нему игроком."); } [MenuItem("Tools/Setup Inventory Scene")] public static void SetupScene() { var scene = UnityEngine.SceneManagement.SceneManager.GetActiveScene(); var rootObjects = scene.GetRootGameObjects(); foreach (var root in rootObjects) { if (root.GetComponent() != null) { Debug.LogWarning("InventoryManager уже существует!"); return; } } // Создаём GameManager var gameManager = new GameObject("GameManager"); var im = gameManager.AddComponent(); gameManager.AddComponent(); gameManager.AddComponent(); // Создаём Canvas var canvasGO = new GameObject("InventoryCanvas"); var canvas = canvasGO.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; canvas.sortingOrder = 100; canvasGO.AddComponent(); // Ensure EventSystem exists for UI interaction var existingES = GameObject.FindObjectOfType(); if (existingES == null) { var es = new GameObject("EventSystem"); es.AddComponent(); es.AddComponent(); } // Создаём панель инвентаря var inventoryPanel = CreatePanel(canvasGO.transform, "InventoryPanel", new Color(0.15f, 0.15f, 0.15f, 0.95f)); var inventoryRect = inventoryPanel.GetComponent(); SetRect(inventoryRect, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), Vector2.zero, new Vector2(500, 300)); // Заголовок CreateTitle(inventoryPanel.transform, "Инвентарь", new Vector2(0, 130)); // Сетка инвентаря (4x9 = 36 слотов) var inventoryGrid = CreateGrid(inventoryPanel.transform, "InventoryGrid", 9, 4, 50, 4, new Vector2(10, 40)); im.slots = CreateSlots(inventoryGrid, "InventorySlot_", 0, 36); // Создаём хотбар var hotbarPanel = CreatePanel(canvasGO.transform, "HotbarPanel", new Color(0.1f, 0.1f, 0.1f, 0.9f)); var hotbarRect = hotbarPanel.GetComponent(); SetRect(hotbarRect, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(0, 15), new Vector2(460, 60)); var hotbarGrid = CreateGrid(hotbarPanel.transform, "HotbarGrid", 9, 1, 50, 4, new Vector2(10, 10)); im.hotbarSlots = CreateSlots(hotbarGrid, "HotbarSlot_", 0, 9); // Подключаем ссылку на панель im.inventoryPanel = inventoryPanel; im.inventoryCanvas = canvas; // Скрываем панель inventoryPanel.SetActive(false); Debug.Log("[Tools] Инвентарь настроен! (36 слотов + 9 хотбар)"); } static GameObject CreatePanel(Transform parent, string name, Color color) { var panel = new GameObject(name); panel.transform.SetParent(parent, false); panel.AddComponent(); panel.AddComponent().color = color; return panel; } static void SetRect(RectTransform rect, Vector2 anchorMin, Vector2 anchorMax, Vector2 anchoredPosition, Vector2 sizeDelta) { rect.anchorMin = anchorMin; rect.anchorMax = anchorMax; rect.pivot = new Vector2(0.5f, 0.5f); rect.anchoredPosition = anchoredPosition; rect.sizeDelta = sizeDelta; } static void CreateTitle(Transform parent, string text, Vector2 position) { var titleObj = new GameObject("Title"); titleObj.transform.SetParent(parent, false); var rect = titleObj.AddComponent(); rect.anchorMin = new Vector2(0, 1); rect.anchorMax = new Vector2(1, 1); rect.pivot = new Vector2(0.5f, 1); rect.anchoredPosition = position; rect.sizeDelta = new Vector2(-20, 30); var tmp = titleObj.AddComponent(); tmp.text = text; tmp.fontSize = 18; tmp.alignment = TextAlignmentOptions.Center; tmp.color = Color.white; } static Transform CreateGrid(Transform parent, string name, int cols, int rows, float cellSize, float spacing, Vector2 offset) { var gridObj = new GameObject(name); gridObj.transform.SetParent(parent, false); var rect = gridObj.AddComponent(); rect.anchorMin = Vector2.zero; rect.anchorMax = Vector2.one; rect.offsetMin = offset; rect.offsetMax = -offset; var grid = gridObj.AddComponent(); grid.cellSize = new Vector2(cellSize, cellSize); grid.spacing = new Vector2(spacing, spacing); grid.startCorner = GridLayoutGroup.Corner.UpperLeft; grid.startAxis = GridLayoutGroup.Axis.Horizontal; grid.constraint = GridLayoutGroup.Constraint.FixedColumnCount; grid.constraintCount = cols; return gridObj.transform; } static Slot[] CreateSlots(Transform parent, string prefix, int startIndex, int count) { var slots = new Slot[count]; var slotSize = 50f; var emptyColor = new Color(0.25f, 0.25f, 0.25f, 0.8f); for (int i = 0; i < count; i++) { var slotObj = new GameObject(prefix + (startIndex + i)); slotObj.transform.SetParent(parent, false); slotObj.AddComponent().sizeDelta = new Vector2(slotSize, slotSize); var bg = slotObj.AddComponent(); bg.color = emptyColor; var slot = slotObj.AddComponent(); slot.slotIndex = startIndex + i; // Icon var iconObj = new GameObject("Icon"); iconObj.transform.SetParent(slotObj.transform, false); var iconRect = iconObj.AddComponent(); iconRect.anchorMin = Vector2.zero; iconRect.anchorMax = Vector2.one; iconRect.offsetMin = new Vector2(4, 4); iconRect.offsetMax = new Vector2(-4, -4); slot.iconImage = iconObj.AddComponent(); slot.iconImage.preserveAspect = true; slot.iconImage.enabled = false; // Amount panel var amountObj = new GameObject("AmountPanel"); amountObj.transform.SetParent(slotObj.transform, false); var amountRect = amountObj.AddComponent(); amountRect.anchorMin = Vector2.one; amountRect.anchorMax = Vector2.one; amountRect.pivot = new Vector2(1, 0); amountRect.anchoredPosition = new Vector2(-2, 2); amountRect.sizeDelta = new Vector2(22, 22); slot.amountPanel = amountObj; slot.amountPanel.SetActive(false); amountObj.AddComponent().color = new Color(0, 0, 0, 0.7f); var amountTextObj = new GameObject("Text"); amountTextObj.transform.SetParent(amountObj.transform, false); amountTextObj.AddComponent().sizeDelta = new Vector2(20, 20); slot.amountText = amountTextObj.AddComponent(); slot.amountText.fontSize = 14; slot.amountText.alignment = TextAlignmentOptions.Right; slot.amountText.color = Color.white; slot.amountText.fontStyle = FontStyles.Bold; // Drag & Drop var dragDrop = slotObj.AddComponent(); dragDrop.slot = slot; dragDrop.slotIndex = slot.slotIndex; slots[i] = slot; } return slots; } }