Files
my-project/Assets/Blocks/Scripts/Editor/BlockSetupTool.cs
unknown 087db550f1 bloak
2026-04-16 18:19:23 +05:00

105 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using UnityEditor;
using UnityEngine;
/// <summary>
/// Tools > Block World Setup — добавляет все нужные объекты в сцену.
/// </summary>
public static class BlockSetupTool
{
[MenuItem("Tools/Block World Setup")]
public static void Setup()
{
// ── BlockRegistry ────────────────────────────────────────────────────
var registry = Object.FindObjectOfType<BlockRegistry>();
if (registry == null)
{
var go = new GameObject("BlockRegistry");
registry = go.AddComponent<BlockRegistry>();
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<WorldManager>();
if (wm == null)
{
var go = new GameObject("WorldManager");
wm = go.AddComponent<WorldManager>();
wm.registry = registry;
Debug.Log("[BlockSetup] Created WorldManager.");
}
// ── FlatWorldGenerator ────────────────────────────────────────────────
var gen = Object.FindObjectOfType<FlatWorldGenerator>();
if (gen == null)
{
var go = new GameObject("FlatWorldGenerator");
gen = go.AddComponent<FlatWorldGenerator>();
Debug.Log("[BlockSetup] Created FlatWorldGenerator.");
}
// ── BlockPlacer на Player ─────────────────────────────────────────────
var player = GameObject.FindWithTag("Player");
if (player != null)
{
if (player.GetComponent<BlockPlacer>() == null)
{
var placer = player.AddComponent<BlockPlacer>();
// Назначаем 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<BlockDefinition>();
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}");
}
}