using UnityEditor; using UnityEngine; /// /// Tools > Block World Setup — добавляет все нужные объекты в сцену. /// public static class BlockSetupTool { [MenuItem("Tools/Block World Setup")] public static void Setup() { // ── BlockRegistry ──────────────────────────────────────────────────── var registry = Object.FindObjectOfType(); if (registry == null) { var go = new GameObject("BlockRegistry"); registry = go.AddComponent(); var shader = Shader.Find("Blocks/VoxelLit"); if (shader != null) registry.voxelShader = shader; else Debug.LogWarning("[BlockSetup] Shader 'Blocks/VoxelLit' not found. Assign manually."); Debug.Log("[BlockSetup] Created BlockRegistry."); } // ── WorldManager ────────────────────────────────────────────────────── var wm = Object.FindObjectOfType(); if (wm == null) { var go = new GameObject("WorldManager"); wm = go.AddComponent(); wm.registry = registry; Debug.Log("[BlockSetup] Created WorldManager."); } // ── FlatWorldGenerator ──────────────────────────────────────────────── var gen = Object.FindObjectOfType(); if (gen == null) { var go = new GameObject("FlatWorldGenerator"); gen = go.AddComponent(); Debug.Log("[BlockSetup] Created FlatWorldGenerator."); } // ── BlockPlacer на Player ───────────────────────────────────────────── var player = GameObject.FindWithTag("Player"); if (player != null) { if (player.GetComponent() == null) { var placer = player.AddComponent(); // Назначаем breakMaterial var breakShader = Shader.Find("Blocks/BlockBreak"); if (breakShader != null) placer.breakMaterial = new Material(breakShader); // Layer mask: ищем слой "BlockLayer", иначе напоминаем int layer = LayerMask.NameToLayer("BlockLayer"); if (layer >= 0) placer.blockLayer = 1 << layer; else Debug.LogWarning("[BlockSetup] Layer 'BlockLayer' not found. Создай его и назначь чанкам, затем задай blockLayer в BlockPlacer."); Debug.Log("[BlockSetup] Added BlockPlacer to Player."); } } else { Debug.LogWarning("[BlockSetup] Player not found. Добавь BlockPlacer на объект с тегом 'Player' вручную."); } Selection.activeGameObject = wm.gameObject; EditorUtility.DisplayDialog( "Block World Setup", "Готово!\n\n" + "Что нужно сделать вручную:\n" + "1. BlockRegistry → добавь свои BlockDefinition в список\n" + "2. Создай слой 'BlockLayer' (Project Settings > Tags & Layers)\n" + "3. Назначь слой 'BlockLayer' чанкам (через chunkPrefab или скрипт)\n" + "4. BlockPlacer → назначь breakLayer и crackTexture\n" + "5. Запусти сцену — FlatWorldGenerator сгенерирует мир автоматически", "OK"); } [MenuItem("Tools/Create Block Definition")] static void CreateBlockDefinition() { string folder = "Assets/Blocks/Definitions"; if (!System.IO.Directory.Exists(folder)) System.IO.Directory.CreateDirectory(folder); var def = ScriptableObject.CreateInstance(); def.blockId = "new_block"; def.displayName = "New Block"; string path = AssetDatabase.GenerateUniqueAssetPath($"{folder}/NewBlock.asset"); AssetDatabase.CreateAsset(def, path); AssetDatabase.SaveAssets(); Selection.activeObject = def; Debug.Log($"[BlockSetup] Created BlockDefinition: {path}"); } }