53 lines
2.5 KiB
C#
53 lines
2.5 KiB
C#
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;
|
||
}
|
||
}
|
||
} |