Разработка инструментов для быстрой расстановки объектов графики в сцене
Дизайнер уровней для VR-проекта расставляет 300 объектов вручную через стандартный Unity Transform gizmo. Каждый объект — позиция, ротация, масштаб руками. На одну комнату уходит два дня. Это не проблема художника — это проблема отсутствия инструмента. Кастомный Editor Tool снижает это время до нескольких часов, и разрабатывается один раз на весь проект.
Что входит в кастомный placement tool
В Unity Editor Tools API (доступен с 2021.2 через EditorTool базовый класс) позволяет создать инструмент с полностью кастомным Handles-интерфейсом в Scene View. Для расстановки объектов в VR-сценах типичный набор функций:
Snap to surface. Объект ставится на любую поверхность сцены через Physics.Raycast из точки курсора — пол, стены, наклонные плоскости. Без этого каждый объект нужно вручную поднимать или опускать по Y, чтобы он не провалился в пол и не висел в воздухе. Реализуется через HandleUtility.GUIPointToWorldRay() + Physics.Raycast() в OnToolGUI() с последующим Undo.RecordObject() для поддержки Ctrl+Z.
Randomized placement. Щелчок левой кнопкой выбирает случайный префаб из набора, случайную ротацию в заданном диапазоне, случайный масштаб. Для organic-looking сцен — кусты, камни, мусор — инструмент делает то, что вручную занимало бы часы.
Grid and radial distribution. Выбрал площадь — инструмент расставил объекты по сетке или окружности с заданным шагом и случайным jitter. Полезно для регулярных структур: забор, колонны, лампы.
Alignment helpers. Выравнивание выбранных объектов по X/Y/Z, распределение с равным интервалом между крайними объектами. Стандартный Unity Align Tools этого не умеет в нужном виде.
Реализация через EditorWindow и EditorTool
Для сложных инструментов с UI — EditorWindow + SceneView.duringSceneGui callback. Окно содержит список префабов (рисуется через GUILayout с превью через AssetPreview.GetAssetPreview()), настройки рандомизации, кнопки включения режимов.
Важный момент для VR-проектов: инструмент должен учитывать VR-специфику расстановки. Объекты в VR видны со всех сторон — нужна функция автоматической проверки «не пересекается ли объект с другими» через Physics.OverlapBox() или Physics.OverlapSphere(). Пересечение выделяется красным highlight через Handles.DrawWireCube() прямо в Scene View — дизайнер видит конфликты немедленно.
Serialization состояния инструмента — через EditorPrefs для простых настроек или ScriptableObject для сохранения пресетов расстановки между сессиями. Команда из 3 человек может шарить пресеты через VCS.
Кейс: инструмент расстановки NPC в VR-escape room
Для одного проекта — escape room на 8 комнат — потребовался инструмент расстановки интерактивных объектов с автоматическим назначением InteractionZone компонента. Клик по поверхности — объект ставится, к нему автоматически добавляется XRGrabInteractable, настраивается InteractionLayerMask по типу объекта (grabbable, pressable, turnable), выставляется colliderOffset под VR-захват.
Без инструмента настройка одного интерактивного объекта занимала 5–7 минут ручной работы в Inspector. С инструментом — 15 секунд. Восемь комнат с 40–60 объектами каждая: разница в неделю работы.
| Тип инструмента | Ориентировочные сроки разработки |
|---|---|
| Базовый snap-to-surface placer | 2–3 рабочих дня |
| Placer с рандомизацией и пресетами | 4–7 рабочих дней |
| Полноценный level-dressing toolkit | 2–4 недели |
Стоимость определяется после анализа workflow команды и требований к функциональности инструмента.





