Skip to content

About

🌍 World Generator for Unity

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

26 Commits

Folders and files

Repository files navigation

Русский English

🌍 World Generator for Unity

GitHub stars GitHub followers GitHub last commit GitHub release Unity License MIT

Мощный инструмент для продвинутого размещения префабов в 3D-пространстве
Создавай сложные сцены с интеллектуальной генерацией

World Generator Interface

✨ Что умеет?

Фича Что даёт
🎯 Умное размещение Автообнаружение поверхностей, избегание препятствий, проверка потолков/полов.
📐 Диапазон углов поверхности Спавн строго на полу, стенах или потолках — настраивается парой min/max.
🌳 Кластеризация Естественные группы объектов с настраиваемой плотностью и размером.
🔦 Гибкие лучи Обычные и сферические лучи, настраиваемые точки испускания, визуализация.
📊 Полная отладка Статистика эффективности, визуализация лучей, советы по оптимизации.
🎲 Случайные вариации Масштаб, вращение, вертикальный офсет - каждый объект уникален.
⚡ Реалтайм генерация Нажал кнопку - сразу видишь результат.
Clustering Demo

🚀 Установка

📦 Через .unitypackage (самый простой)
  1. Заходи в Releases.
  2. Качаешь .unitypackage последней версии.
  3. В Unity: Assets > Import Package > Custom Package... → выбираешь файл → Import.

Отличный вариант, если хочешь стабильную версию и не париться с гитом.

🔗 Через Git URL (для обновлений)
  1. В Unity открываешь Package Manager (Window > Package Manager).
  2. Нажимаешь + → "Add package from git URL...".
  3. Вставляешь: https://github.com/NeonShadowYT/WorldGenerator.git
  4. Жмёшь "Add".

Так всегда будешь на самой свежей версии.

📁 Ручная установка (из ZIP)
  1. Качаешь репозиторий как ZIP (Code > Download ZIP).
  2. Разархивируешь.
  3. Папку Assets из архива перетаскиваешь в свой проект.
  4. Перезапускаешь Unity.

Смотри, чтобы не перезаписать свои файлы с такими же именами.

📖 Как пользоваться?

⚡ Быстрый старт

  1. Создай пустой GameObject и добавь компонент World Generation.
  2. Добавь префабы в список и настрой параметры.
  3. Нажми 🎲 Сгенерировать в инспекторе.
  4. Наблюдай за процессом в реальном времени.
Main Settings

⚙️ Основные настройки

Параметр Что делает
Population Целевое количество объектов для спавна.
Dimensions Размеры зоны спавна (X,Z - площадь, Y - высота проверки).
Prefabs Список префабов для случайного выбора.
Scale Range Диапазон случайного масштаба (0.8–1.2 = 80%–120%).
Rotation Range Случайное вращение вокруг оси Y.
Vertical Offset Корректировка высоты посадки.
Surface Angle Range Диапазон допустимых углов наклона поверхности (X — минимум, Y — максимум).
Clustering Settings

🌳 Кластеризация

  • Создаёт естественные группы объектов.
  • Настраиваемое количество и размер кластеров.
  • Контроль минимального расстояния между группами.
  • Случайное распределение внутри кластеров.

📐 Правила размещения

  • Collision Mask - слои валидных поверхностей.
  • Avoid Mask - слои препятствий.
  • Align To Surface - автовыравнивание по нормали.
  • Avoidance Radius - радиус проверки препятствий.
  • Surface Angle Range - диапазон допустимых углов наклона поверхности (градусы, X = min, Y = max). Y = 0 — проверка отключена.

🎯 Пресеты углов поверхности

Цель спавна Surface Angle Range Что спавнится
Полы, пологие склоны (0, 45) Деревья, кусты, камни, трава
Стены и сильные уклоны (60, 90) Факелы, картины, гнёзда
Потолки (150, 180) Пещерные сталактиты, лампы, лианы
Любая поверхность (0, 180) Универсальный декор
Только горизонталь (строго) (0, 5) Ковры, платформы, тайлы

Угол считается от вертикали: 0° = пол, 90° = стена, 180° = потолок.

📊 Проверка стабильности

  • Edge Check Radius - радиус проверки ровности поверхности.
  • Max Height Difference - допустимая разница высот.
  • Stability Check Rays - количество проверочных лучей.
  • Min Success Percentage - требуемый процент успешных проверок.
Debug Visualization

🔦 Система лучей

  • Типы лучей - обычные и сферические.
  • Точки испускания - верх, боковые стороны, объём.
  • Случайное отклонение - для сложных поверхностей.
  • Визуализация лучей - в реальном времени, прямо в редакторе.
Debug Statistics

📊 Отладка и статистика

  • Статистика эффективности размещения.
  • Визуализация всех типов лучей.
  • Детальная информация об ошибках.
  • Советы по оптимизации настроек.

🛠️ Архитектура проекта

Assets/NeonImperium/WorldGenerations/
├── Runtime/
│   ├── Core/
│   │   ├── WorldGeneration.cs               # MonoBehaviour-фасад, Editor + Runtime пайплайны
│   │   ├── GenerationSettings.cs            # SpawnSettings + DebugRaySettings
│   │   ├── PlacementData.cs                 # Structs/enums: PlacementData, PlacementPoint, DebugRay
│   │   ├── GenerationSnapshot.cs            # Save/load слепок (FNV-1a + JsonUtility)
│   │   └── WorldGenerationExtension.cs      # Базовый класс user-расширений
│   │
│   ├── Interfaces/
│   │   ├── IPlacementValidator.cs           # Single + batch валидация
│   │   ├── IPointGenerator.cs               # Стратегия генерации кандидатов
│   │   ├── IPhysicsService.cs               # Абстракция физики (тестируемость)
│   │   ├── IDebugLogger.cs                  # Абстракция логгера лучей
│   │   └── ISpawnZone.cs                    # + BoxSpawnZone, PolygonSpawnZone, SpawnZoneBuilder
│   │
│   ├── Placement/
│   │   ├── PlacementValidator.cs            # Ray/Sphere-cast, все проверки, batch-путь
│   │   ├── PlacementJobs.cs                 # Persistent NativeArray<RaycastCommand>
│   │   ├── PointGenerator.cs                # RandomPointGenerator + ClusterPointGenerator
│   │   ├── SpatialHash.cs                   # O(1) проверка minDistance (3×3×3 ячеек)
│   │   └── PolygonTriangulator.cs           # Ear-clipping, IsConvex — без аллокаций
│   │
│   ├── Zones/
│   │   ├── SpawnZoneTypes.cs                # BoxSpawnZoneSettings, PolygonVertex, PolygonSpawnZoneSettings
│   │   └── SpawnZoneDefaults.cs             # Editor-only демо-зоны (Hexagon + Triangle)
│   │
│   ├── Services/
│   │   ├── PhysicsService.cs                # IPhysicsService → Physics.*
│   │   ├── DebugLogger.cs                   # Кольцевой буфер DebugRay (256+)
│   │   ├── ObjectInstantiator.cs            # Батчинг по 20/кадр, reuse-existing
│   │   ├── RuntimeSpawnQueueService.cs      # Awaitable-очередь с приоритетами
│   │   ├── NavMeshRegenerationService.cs    # Reflection к NavMeshSurface (без hard-dep)
│   │   └── RuntimeNavMeshBuilder.cs         # NavMeshBuilder.CollectSources + UpdateNavMeshDataAsync
│   │
│   └── Utils/
│       ├── FastRandom.cs                    # Xorshift128 PRNG, bias-free int/float
│       └── MinMaxRangeAttributes.cs         # [MinMaxRange], [MinMaxRangeInt]
│
└── Editor/
    ├── WorldGenerationView.cs               # CustomEditor, OnSceneGUI, RegenerateAll
    ├── SectionDrawer.cs                     # 8 foldout-секций инспектора
    ├── ActionButtonsDrawer.cs               # Generate/Clear/Preview/RegenerateAll
    ├── DebugInfoDrawer.cs                   # Статистика, причины отказов, советы
    ├── EditorStyleManager.cs                # GUIStyle + цветной header-texture
    ├── EditorFoldoutState.cs                # Static-состояние foldout'ов
    ├── EditorGenerationDriver.cs            # EditorApplication.update-тик
    ├── SpawnZoneSceneEditor.cs              # Handles: move/size/insert/delete + snap
    ├── MinMaxRangeDrawers.cs                # Кастомные PropertyDrawer
    └── WorldGenerationGizmos.cs             # Gizmos: зоны, лучи, кластеры

🧩 Ключевые подсистемы

Подсистема Что делает
PlacementValidator Ray/Sphere-cast по поверхностям, проверки угла, устойчивости, потолка, пола, avoidance, NavMesh. Single + Batch (RaycastCommand) пути.
PointGenerator Две стратегии: RandomPointGenerator (равномерно по зоне) и ClusterPointGenerator (кластеры с проверкой поверхностей через батч-джоб).
SpatialHash Пространственный хэш для O(1) проверки minDistanceBetweenObjects. Работает с math.hash(int3) или FNV-fallback.
PlacementJobs Persistent NativeArray<RaycastCommand> — без аллокаций в горячем цикле, авто-fallback на CPU при Sphere-кастах.
SpawnZoneBuilder Строит список зон: Box (main + extraBoxes) или Polygon (невыпуклые 3D-объёмы).
PolygonTriangulator Ear-clipping + выпуклость за O(n²), стек-аллокация при n ≤ 64.
ObjectInstantiator Батчинг по 20 объектов/кадр, Awaitable.NextFrameAsync, режим reuseExisting (SetActive вместо Destroy).
RuntimeSpawnQueueService Глобальная очередь WorldGeneration с сортировкой по priority.
NavMeshRegenerationService Reflection → Unity.AI.Navigation.NavMeshSurface.BuildNavMesh(); работает без hard-dependency.
RuntimeNavMeshBuilder NavMeshBuilder.UpdateNavMeshDataAsync — не блокирует главный поток.
FastRandom Детерминированный Xorshift128: ~5× быстрее System.Random, без боксинга.
GenerationSnapshot FNV-1a хэш зон + JsonUtility сериализация для save/load и воспроизводимости.

⚙️ Runtime-пайплайн

Awake / Generate()
  → EnsureModulesInitialized()
  → GeneratePlacementPointsBatch()
        ├─ CanUseJobValidation ? Job-путь (RaycastCommand.ScheduleBatch)
        └─ иначе CPU-путь (Validate + SpatialHash.Insert)
  → CreateObjectsFromPlacementData()  ← ObjectInstantiator.InstantiateBatchAsync
  → TryRuntimeNavMeshRegenerationAsync()
  → CallGenerationCompleteExtensions()
  → OnGenerationComplete?.Invoke()

🎨 Editor-пайплайн

OnInspectorGUI
  → SectionDrawer × 8          (все настройки, foldout'ы)
  → ActionButtonsDrawer        (Generate / Preview / RegenerateAll)
  → DebugInfoDrawer            (статистика + советы)

OnSceneGUI
  → SpawnZoneSceneEditor.DrawForSpawner()
        • Move центр зоны (FreeMoveHandle)
        • Move вершины полигона
        • Slider вертикального размера
        • Insert / Delete (Ctrl-снап)
  → DrawPreview()              (до 500 сфер: зелёные/красные)

EditorGenerationDriver
  → EditorApplication.update → WorldGeneration.EditorTick()
  → SceneView.duringSceneGui → Repaint при генерации

⚡ Требования

  • Unity 2022.3+ (рекомендуется 2023.1+)
  • Базовые знания LayerMask в Unity

🐛 Проблемы и решения

🌱 Объекты спавнятся в воздухе

Почему: Неправильно настроен Collision Mask или Vertical Offset.

Как починить: Проверь, что Collision Mask включает слои поверхности, а Vertical Offset скорректирован под размер объектов.

🧱 Объекты накладываются друг на друга

Почему: Слишком маленький Avoidance Radius или отключена кластеризация.

Как починить: Увеличь Avoidance Radius или включи кластеризацию с настройкой минимального расстояния.

📐 Объекты спавнятся под неправильным углом

Почему: Surface Angle Range не соответствует рельефу сцены.

Как починить:

  • Полы, склоны до 45° → поставь (0, 45).
  • Стены и обрывы → (60, 90).
  • Потолки, навесы → (150, 180).
  • Хочешь любую поверхность → (0, 180).
  • Отключить проверку → установи максимум 0.

Открой 📊 Дебаг информацию — в причинах отказов появится 📐 Угол поверхности вне диапазона, если настройка мешает.

🔦 Лучи не видны

Почему: Отключена визуализация или ошибка в настройках Debug.

Как починить: Включи Show Rays в настройках отладки и проверь, что генерация активна.

⭐ Поддержи проект

Если тебе пригодился этот инструмент - поставь звёздочку на GitHub. Это помогает другим разработчикам находить полезные проекты.

GitHub stars GitHub followers

🔧 Другие мои инструменты

Инструмент Что делает
Icon Creator Создание иконок из 3D‑моделей прямо в редакторе.
Neon Imperium Открытый сайт для Starve Neon - HTML/CSS/JS, можно изучать и использовать.

Starve Neon

📸 Присоединяйся к сообществу

YouTube Twitch Discord Telegram

Создано с ❤️ для тех, кто строит миры

About

🌍 World Generator for Unity

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages