using UnityEngine; using UnityEditor; using UnityEngine.UI; using UnityEngine.EventSystems; using TMPro; /// /// Tools > Setup Complete Scene — создаёт всё до запуска игры (editor-time). /// Canvas инвентаря помещается внутрь Player. /// InventoryManager получает все ссылки сразу. /// public static class InventorySceneSetup { [MenuItem("Tools/Setup Complete Scene")] public static void SetupCompleteScene() { if (Object.FindObjectOfType() != null) { EditorUtility.DisplayDialog( "Сцена уже настроена", "InventoryManager уже существует. Удалите существующие объекты сцены перед повторной настройкой.", "OK"); return; } // ── EventSystem ─────────────────────────────────────────────────────── if (Object.FindObjectOfType() == null) { var esGO = new GameObject("EventSystem"); esGO.AddComponent(); esGO.AddComponent(); } // ── InventoryEvents ─────────────────────────────────────────────────── new GameObject("InventoryEvents").AddComponent(); // ── InventoryManager ────────────────────────────────────────────────── var imGO = new GameObject("InventoryManager"); var im = imGO.AddComponent(); imGO.AddComponent(); // ── Player ──────────────────────────────────────────────────────────── var player = CreatePlayerGO(); // ── InventoryCanvas (дочерний объект Player) ────────────────────────── var canvasGO = new GameObject("InventoryCanvas"); canvasGO.transform.SetParent(player.transform, false); var canvas = canvasGO.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; canvas.sortingOrder = 100; canvasGO.AddComponent(); var uiBuilder = canvasGO.AddComponent(); // Строим весь UI прямо сейчас, до запуска игры uiBuilder.BuildInventoryUI(); // Назначаем ссылки в InventoryManager im.slots = uiBuilder.GetInventorySlots(); im.hotbarSlots = uiBuilder.GetHotbarSlots(); im.inventoryPanel = uiBuilder.inventoryPanelRect != null ? uiBuilder.inventoryPanelRect.gameObject : null; im.inventoryCanvas = canvas; // Скрыть панель инвентаря по умолчанию if (im.inventoryPanel != null) im.inventoryPanel.SetActive(false); // ── PlayerInput (дочерний объект Player) ────────────────────────────── var piGO = new GameObject("PlayerInput"); piGO.transform.SetParent(player.transform, false); var pi = piGO.AddComponent(); var inputActions = AssetDatabase.LoadAssetAtPath( "Assets/Input/PlayerControls.inputactions"); if (inputActions != null) pi.actions = inputActions; else Debug.LogWarning("[Setup] Назначьте Assets/Input/PlayerControls.inputactions на компонент PlayerInput вручную."); // ── HandEquipSystem ─────────────────────────────────────────────────── player.AddComponent(); Selection.activeGameObject = player; Debug.Log("[Setup] Готово! Назначьте кость руки (handBone) в HandEquipSystem на Player."); } // ── Вспомогательные методы ──────────────────────────────────────────────── static GameObject CreatePlayerGO() { 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 ch = go.AddComponent(); ch.walkSpeed = 5f; ch.runSpeed = 9f; ch.crouchSpeed = 2.5f; ch.jumpHeight = 1.5f; ch.gravity = -9.81f; // Визуальная капсула var body = GameObject.CreatePrimitive(PrimitiveType.Capsule); body.name = "Body"; body.transform.SetParent(go.transform, false); Object.DestroyImmediate(body.GetComponent()); // Голова var head = new GameObject("Head"); head.transform.SetParent(go.transform, false); head.transform.localPosition = new Vector3(0, 0.8f, 0); ch.head = head.transform; // Камера var camObj = new GameObject("PlayerCamera"); camObj.transform.SetParent(head.transform, false); camObj.transform.localPosition = new Vector3(0, 0.1f, 0); var cam = camObj.AddComponent(); cam.tag = "MainCamera"; cam.nearClipPlane = 0.05f; var oldCam = GameObject.FindWithTag("MainCamera"); if (oldCam != null && oldCam != camObj) Object.DestroyImmediate(oldCam); go.tag = "Player"; go.transform.position = new Vector3(0, 2, -5); return go; } }