using System; using System.Collections.Generic; using System.Linq; using UnityEngine; namespace _Project.Scripts.LevelGenerating { // ===================================================================== // Для каждой комнаты выбирает тему (по роли комнаты) и генератор, затем запускает его. // // Как добавить особый генератор (например, для лифта): // 1. Написать класс, реализующий IRoomGenerator, с Supports(room) => room.rt == RoomType.Lift. // 2. Добавить его в Awake() ДО ThemedRoomGenerator: берётся первый подходящий. // // НЕ ЗАБЫТЬ: материалы и освещение однозначно определяются темой и ролью комнаты, поэтому // в файл сохранения их можно не класть. Сохранять нужно только случайные решения (предметы). // ===================================================================== public class RoomGeneratorRegistry : MonoBehaviour { [SerializeField] private RoomTheme defaultTheme; // если для роли тема не задана [SerializeField] private List themes = new List(); private readonly List _generators = new List(); void Awake() { // сюда добавлять специальные генераторы, универсальный всегда последний _generators.Add(new ThemedRoomGenerator()); } public void Run(ShellResult shell, FloorData floor) { foreach (var view in shell.Views) { var theme = ResolveTheme(view.Data.rt); var generator = _generators.FirstOrDefault(g => g.Supports(view.Data)); if (generator == null) { Debug.LogWarning($"{view.name}: нет подходящего генератора"); continue; } generator.Generate(view, floor, theme); } } private RoomTheme ResolveTheme(RoomType type) { var entry = themes.FirstOrDefault(e => e.type == type); return entry != null && entry.theme != null ? entry.theme : defaultTheme; } } }