Souljack/Assets/_Project/Scripts/LevelGenerating/RoomGenerationRegistry.cs

53 lines
2.5 KiB
C#
Raw Permalink 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 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<ThemeEntry> themes = new List<ThemeEntry>();
private readonly List<IRoomGenerator> _generators = new List<IRoomGenerator>();
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;
}
}
}