Система строительства в Unity2D

Возникла проблема с системой строительства в Unity2D, скрины с объектов инспектора: Код скрипта тайлмапа:
public class BuildingsGrid : MonoBehaviour < public Vector2Int GridSize = new Vector2Int(10, 10); private Building[,] grid; private Building FlyingBuilding; [SerializeField] private Camera mainCamera; private void Awake() < grid = new Building[GridSize.x, GridSize.y]; mainCamera = Camera.main; >public void StartPlacingBuilding(Building buildingPrefab) < if (FlyingBuilding != null) < Destroy(FlyingBuilding.gameObject); >FlyingBuilding = Instantiate(buildingPrefab); > private void Update() < Debug.Log(mainCamera.ScreenToWorldPoint(Input.mousePosition)); Vector2 mouseWorldPosition = mainCamera.ScreenToWorldPoint(Input.mousePosition); if (FlyingBuilding != null) < int x = Mathf.RoundToInt(mouseWorldPosition.x); int y = Mathf.RoundToInt(mouseWorldPosition.y); FlyingBuilding.transform.position = new Vector2(x, y); if (Input.GetMouseButtonDown(0)) FlyingBuilding = null; if (Input.GetMouseButtonDown(1)) Destroy(FlyingBuilding.gameObject); >> >
Код скрипта строения:
public class Building : MonoBehaviour < public Vector2Int Size = Vector2Int.one; private void OnDrawGizmosSelected() < for (int x = 0; x < Size.x; x++) < for (int y = 0; y < Size.y; y++) < Gizmos.color = new Color(0.88f, 0f, 1f, 0.3f); Gizmos.DrawCube(transform.position + new Vector3(x, y, 0), new Vector3(1, 1, 0)); >> > >
Здание выбирается по кнопке, летает за курсором, но возникла проблема с его постановкой. При нажатии на кнопку здание ставится (сразу под кнопкой) и тут же создаётся новое вместо того, чтобы старое просто уничтожалось. Как понял, здесь нужно использовать Ray2D или RaycastHit2D, но мне не хватает навыков (в гугле не забанили, но не нашёл решения). Пытался адаптировать код с гайда где был показан пример для 3D. Заранее спасибо за ответ.
Перспективы применения технологии 3D реального времени в архитектуре и строительстве
Узнайте о том, как компании в области архитектуры и строительства осваивают 3D реального времени, меняя подходы к проектированию, строительству и эксплуатации зданий.

Опыт использования технологий 3D реального времени лидерами отрасли
Прежде чем приступить к обсуждению 3D реального времени, поговорим о том, как ваши коллеги внедряют их в свою деятельность.
Благодаря своим преимуществам, технология 3D реального времени стала завоевывать новые позиции в архитектуре, проектировании, строительстве, энергетике, государственном управлении, здравоохранении, транспорте и во многих других отраслях.
В чем достоинства 3D реального времени?
3D реального времени (RT3D) — это технология компьютерной графики, которая генерирует интерактивный контент быстрее человеческого восприятия. Загляните на эту страницу, чтобы узнать подробные сведения об этой технологии.
Интерактивность — это ключевое преимущество 3D реального времени. В отличие от кинематографа, создающего иллюзию движения без возможности активного участия зрителя в процессе, 3D реального времени погружает зрителя в цифровую реальность, создавая ощущение аутентичности и давая возможность управлять происходящим, аналогично видеоиграм.
Приложения с 3D-графикой реального времени имеют две фундаментальные особенности:
- иммерсивность, благодаря приближению цифровой реальности к аналоговому восприятию реального мира;
- интерактивность, благодаря возможности пользователю точно контролировать происходящее и выбирать точку обзора.
Существует много способов применения технологии 3D реального времени, но основное направление для этих компаний — разработка и выпуск приложений, сочетающих цифровые модели зданий с информацией из других источников, например, метаданных и датчиков. Иногда называемые «цифровыми двойниками», эти модели выглядят и ведут себя аналогично реальному продукту. Эти приложения можно запускать на мобильных устройствах, компьютерах, гарнитурах дополненной (AR) и виртуальной (VR) реальности и на других платформах.
Оцените приложение с 3D-графикой реального времени
Ознакомившись с технологией 3D реального времени, прогуляйтесь по нашему лондонскому офису, воссозданному в 3D реального времени с помощью Unity.
Загрузка может занять пару минут, но уверяем вас, оно того стоит. Пока идет загрузка, вы можете продолжить чтение.
Знакомьтесь с интерьером и не забывайте, что вы можете менять время суток и отдельные элементы дизайна.
- Влияние 3D реального времени на бизнес
- Лучшие способы использования 3D реального времени
- Ценность внедрения 3D реального времени в бизнес
Влияние 3D реального времени на бизнес
Одна из важнейших проблем у компаний из индустрии архитектуры и строительства — повышение эффективности и продуктивности. Исправление недостатков, вызванных недостаточно эффективной организацией работ, отбирает у компаний строительной отрасли около 450 млрд $ в год. Согласно отчету McKinsey & Company 20% строительных проектов сдаются с опозданием и 80% проектов выходят за рамки бюджета. В условиях пандемии 2020 года эти сложности проявляются особенно сильно.
Компании используют 3D реального времени, чтобы упростить решение этих проблем. Исследования показывают, что 3D реального времени открывает следующие возможности.
- Экономия затрат благодаря выявлению недостатков дизайна и проектирования на ранних этапах и последовательному выполнению плана для соблюдения сроков.
- Привлечение новых клиентов путем представления зданий в VR и разработки передовых AR-приложений.
- Ускорение разработки за счет повышения эффективности совместной работы различных специалистов и объединения данных из разного ПО (Revit, Navisworks, Rhino и т. д.) в одной модели.
Снижение текучести кадров благодаря повышению продуктивности и безопасности труда с помощью интерактивных AR/VR-приложений.

Лучшие способы использования 3D реального времени
Возможности применения технологии 3D реального времени безграничны — от дизайна и подготовки к строительству до работ на площадке и других видов деятельности после сдачи объекта. Освоившие эту технологию архитектурно-строительные компании используют ее очень широко — согласно исследованию, проведенному компанией Forrester Consulting по поручению Unity и опубликованному в марте 2020 года, в среднем на протяжении жизненного цикла проекта насчитывается более четырех различных вариантов использования.
Некоторые примеры из жизненного цикла постройки здания
Дизайн и проектирование
Распространенные варианты применения использования: анализ проекта в иммерсивной среде, визуализация дизайна, проектирование конструкций, контроль реализации проекта, сбор отзывов от участников и т. д.
Реальные примеры 3D реального времени: компания SHoP Architects внедрила создание приложений с 3D-графикой реального времени и тем самым сократила временные затраты на оптимизацию больших проектов с нескольких дней до нескольких минут.
Планирование и моделирование строительства
Распространенные варианты применения использования: планирование и координация строительных работ, выявление конфликтов, AR-сопровождение на площадке в масштабе 1:1, составление смет, координация BIM, сопровождение на площадке, контроль и обеспечение качества, составление документации и т. д.
Реальные примеры 3D реального времени: Mortenson создала инструмент, моделирующий дизайн больничных помещений в VR для повышения эффективности ухода за пациентами и работы сотрудников, а также для снижения затрат.
Обучение и сопровождение деятельности
Распространенные варианты применения: инструктаж по технике безопасности в VR, AR-сопровождение, дистанционное обслуживание, цифровые двойники с графикой реального времени, визуализация данных и т.д.
Реальные примеры 3D реального времени: Skanska ускорила обучение технике безопасности на строительной площадке, внедрив VR-приложение на основе Unity в стандартную программу инструктажа по технике безопасности.
Продажи и маркетинг
Распространенные варианты применения: виртуальные мероприятия, фотореалистичный рендеринг, деморолики, иммерсивное сопровождение процесса приобретения недвижимости, приложения для отображения объектов недвижимости в смешанной реальности и т. д.
Реальные примеры 3D реального времени: SmartPixel разработала интерактивное приложение для Maestria Condominiums, чтобы потенциальные клиенты могли ознакомиться со своими будущими владениями.
Ценность внедрения 3D реального времени в бизнес
3D реального времени позволяет решить целый ряд проблем всего жизненного цикла объектов, повышая эффективность их дизайна, строительства и эксплуатации. Исследование, проведенное Forrester Consulting, выявило следующее.
В большинстве случаев компании уже используют 3D реального времени во многих аспектах бизнеса. [Они] замечают, что чем шире внедряется технология 3D реального времени, тем теснее интегрируются процессы, благодаря созданию интерактивной среды для сотрудничества и коммуникации.
В самом деле, 90% компаний, использующих 3D реального времени, считают эту технологию ценной для координации усилий различных отделов. Этому есть причина: модель в виртуальной среде позволяет использовать ее самыми разными способами в самых разных аспектах.
Это значит, что виртуальные модели, созданные на этапе дизайна, также могут быть полезны строителям в форме AR-приложений с масштабом отображения 1:1, а также специалистам по эксплуатации в форме приложений для обслуживания с высоким качеством графики и интерактивностью. Такая синергия ускоряет строительство, повышает эффективность, минимизируя отставание от графика и выход за рамки бюджета.
Воплощение 3D-приложений в жизнь
Компании могут использовать всю мощь 3D реального времени благодаря Unity, ведущей платформе разработки 3D-контента с графикой реального времени, и аналогичному ПО. Иногда называемые игровыми движками, поскольку технология пришла из мира игр, эти платформы предлагают мощный инструментарий как для создания интерактивного цифрового контента, так и для его развертывания на различных платформах, включая мобильные устройства, компьютеры и HMD-гарнитуры.
Рассмотрим процесс разработки и потребления контента с 3D-графикой реального времени.
- Кто создает приложения с 3D-графикой реального времени?
- Как создаются приложения с 3D-графикой реального времени?
- Как публикуются приложения с 3D-графикой реального времени?

Кто создает приложения с 3D-графикой реального времени?
Сегодня ведущие разработчики приложений с 3D-графикой реального времени имеют техническое образование, например, инженеры ПО или разработчики AR/VR. Дело в том, что подавляющее большинство корпоративных приложений, созданных по этой технологии, требуют собственных разработок и опыта программирования. В Unity используется язык C#.
Но при этом число пользователей 3D реального времени растет, поскольку Unity и другие компании повышают доступность 3D реального времени для специалистов других областей, что в свою очередь упрощает масштабирование собственных разработок.
Вот несколько вариантов повышения доступности технологии 3D реального времени для людей, не знакомых с программированием.
- Визуальное программирование: среды с графическим интерфейсом на основе концепции графов, например, Bolt, позволяют художникам, дизайнерам и другим специалистам реализовать логику без единой строчки кода.
- Развитие продуктов: новые продукты, например, Unity Reflect, упрощают процесс переноса 3D-моделей в среду с графикой реального времени до нескольких щелчков мышью.
- Готовые решения: по мере увеличения спроса на иммерсивные интерактивные приложения, многие независимые разработчики ПО воспользовались технологией для разработки специализированных решений, исключающих необходимость программирования. Например, мощная платформа Interact упрощает разработку сложных VR приложений на основе моделей CAD.
Предоставление услуг: для сотрудников нетехнического профиля могут быть созданы собственные решения, учитывающие их интересы. Другой пример: расширяемость платформ, аналогичных Unity, позволяет компаниям адаптировать интерфейс и открыть специалистам нетехнического профиля все возможности 3D реального времени без необходимости в программировании.

Как создаются приложения с 3D-графикой реального времени?
Как правило разработка 3D-приложения с графикой реального времени для архитектуры и строительства начинается с обработки имеющегося контента. Импортированная 3D-геометрия и метаданные могут быть в разных форматах, например:
- Модели из систем автоматизированного проектирования (САПР, CAD), например, AutoCAD, Alias, VRED, CATIA, Creo и Siemens PLM;
- меши из приложений для 3D-моделирования и визуализации, включая Autodesk 3ds Max, Rhino, SketchUp и Blender;
- данные из реальных окружений, например, модели или облака точек, полученные методами фотограмметрии и лидарного сканирования окружений и продуктов;
- информационные модели строений (BIM) из Autodesk Revit, Navisworks и аналогичных программ;
- материалы из систем BIM, например, Autodesk Revit.
Для обеспечения производительности при максимальном качестве визуализации на различных платформах 3D-контент обычно требует оптимизации. Этот процесс позволяет сделать из сложных проектов модели, удобные для визуализации и совместимые с процессом разработки приложений с графикой реального времени, поддерживающие нужную степень интерактивности на телефонах и VR-гарнитурах. Компании могут использовать простые и эффективные решения, например, Unity Reflect, которое автоматизирует подготовку данных для графики реального времени, или инструменты, дающие контроль над всеми аспектами процесса, например, Pixyz.
После подготовки ассетов к 3D реального времени можно приступать к разработке приложения. Создание сцен можно ускорить с помощью 3D-моделей, объектов, окружений (то есть виртуального мира) и других ресурсов из Unity Asset Store. Unity ускоряет итерацию и настройку компонентов, например, анимации, звука, видео, кат-сцен, окружений, освещения, пользовательского интерфейса, визуальных эффектов и многое другое. В любой момент разработки пользователь может оценить результаты своей работы в среде реального времени: визуализация происходит мгновенно, не заставляя ждать результатов рендеринга.
Для сложных корпоративных приложений Unity предлагает дополнительную гибкость благодаря следующим компонентам.
- Искусственный интеллект (ИИ): Unity предлагает богатый набор инструментов для машинного обучения (МО) и средства интеграции с множеством платформ для ИИ и МО, что особенно полезно для обучения и проверки систем интеллекта на примере моделей окружений.
- Проектирование систем:Prespective, другой партнер Unity в области проверенных решений, предлагает мощную платформу проектирования систем для интеграции Unity с внешними системами управления, включая программируемые логические контроллеры или программные эмуляции систем управления и внешние математические модели, например, единицы функционального моделирования (FMU) или MATLAB.
Интеграция в предприятие: мощный интерфейс программирования приложений Unity (API), встроенные сетевые функции и интеграция в сторонние сетевые стеки — это надежная и отказоустойчивая система внедрения функций дистанционной совместной работы, интеграции с системами «интернета вещей» (IoT) для цифровых двойников или любыми другими сетевыми приложениями.

Как публикуются приложения с 3D-графикой реального времени?
Ценность 3D реального времени, как среды потребления, кроется в ее способности создавать параллельную реальность. Наш мир трехмерен — мы передвигаемся, думаем и воспринимаем в трехмерном пространстве. По сравнению со статичным контентом, например, изображениями и видео, расширенный эффект присутствия в моделируемом виртуальной средой пространстве дает ряд преимуществ, например, улучшение процесса решения проблем, повышенное усвоение знаний, улучшение вовлеченности и понимания и многое другое.
Unity предлагает богатый набор моделей взаимодействия, позволяющий в реальном времени взаимодействовать с работающими приложениями на мобильном устройстве, в браузере, в AR-гарнитуре, с полным погружением в VR-окружение и многое другое. 3D реального времени также можно встроить в существующий контент, например, в мобильное приложение или в страницу интернет-магазина.
Потребителями контента с 3D-графикой реального времени могут выступать как участники проекта, например, специалист на площадке, проходящий обучение технике безопасности в VR-гарнитуре, так и сторонняя аудитория, например, потенциальные покупатели со всего света, осматривающие объекты еще до того, как они построены. Это могут быть приложения как для отдельных пользователей, например, для архитекторов, выполняющих анализ проекта в реальном времени, так и для групп, например, для совместного выявления проблем дизайна до начала строительных работ, который проводит коллектив дизайнеров и строителей для снижения необходимости в запросах на внесение изменений, ускорения строительства и сокращения затрат.
Строительство базы / расстановка объектов [RTS]
Итак, строительство базы в стратегии. Параметры, которые участвуют в этом процессе могут самые разные. Возможно золото или минералы, доступность энергии и прочее. В каждом проекте может быть что-то индивидуальное, однако, общее для всех это само строительство, то есть, расстановка объектов в определенной области. Что нам нужно сделать? Во-первых, у нас есть набор иконок, каждый обозначает некую постройку. При клике по иконке, получаем заготовку постройки, которую можно двигать по плоскости XZ. Во-вторых, нужно сделать так, чтобы новые здания нельзя было создать там где уже есть постройка и там, где запрещено строить что-либо.
Данный вариант подходит только для 3D, для двухмерного проекта надо переделывать рэйкаст и плоскость движения объектов.
Подготовка. Создание самих строений, модельки зданий. Как они будут анимированы и прочее — не важно, главное моделька должны быть под коллайдером, это необходимо не только для строительства, но и для создания карты навигации ботов. Например:
![Строительство базы / расстановка объектов [RTS]](https://null-code.ru/uploads/posts/2015-08/1439256060_1.png)
Коллайдер должен закрывать весь объект.
После создания основного строения — делаем его копию и заменяем материал. То есть, задача создать предварительный просмотр будущей постройки. В любой стратегии, мы перетаскиваем сначала макет постройки, обычно их делает полупрозрачными. Поскольку это макет, то на нем мы убираем анимацию если есть и подбираем внешний вид, например:

Точно также, объект должен закрываться коллайдером, но в режиме Is Trigger. При этом коллайдер макета можно сделать чуть-чуть больше чем у оригинала, на +0.1 допустим, это повысит чувствительность и гарантирует, чтобы невозможно было создать один объект поверх другого. У всех макетов должен быть установлен слой Ignore Raycast! Дополнительно на модельку вешаем Rigidbody и выключаем гравитацию. Плюс, вешаем небольшой скрипт MaskControl:
using UnityEngine; using System.Collections; public class MaskControl : MonoBehaviour < public string respawnTag = "Respawn"; void Start() < DragAndDrop.isOn = true; >void OnTriggerStay(Collider coll) < if(coll.tag != respawnTag) < DragAndDrop.isOn = false; >> void OnTriggerExit(Collider coll) < if(coll.tag != respawnTag) < DragAndDrop.isOn = true; >> >
Задача этого скрипта в том, чтобы определять где можно установить объект, а где нет. В переменной respawnTag мы указываем тег, который разрешает установку. Допустим если сделать плоскость с тегом, то здание можно строить только в этой области, а если объект наткнется на другие строения то автоматически заблокируется. В общем всё как и обычной стратегии.
Далее, имена строений. Оригинальные префабы зданий именуются вот так id_xxx, то бишь — номер, нижние подчеркивание, имя. Префабы макетов, именуются точно также, номера оригинала и макета — должны совпадать, а имена могут различаться.
Теперь вешаем на пустой объект скрипт DragAndDrop:
using UnityEngine; using System.Collections; using System; public class DragAndDrop : MonoBehaviour < public Transform[] original; public Transform[] mask; public float shift = 0.01f; public string respawnTag = "Respawn"; public static bool isOn; private Transform original_tmp; private Transform mask_tmp; private Vector3 curPos; void Start() < isOn = false; >public void SetMask(int id) < foreach(Transform obj in original) < string name = obj.name.Split(new char[] , StringSplitOptions.RemoveEmptyEntries)[0]; if(id.ToString() == name) < original_tmp = Instantiate(obj); original_tmp.gameObject.SetActive(false); >> foreach(Transform obj in mask) < string name = obj.name.Split(new char[] , StringSplitOptions.RemoveEmptyEntries)[0]; if(id.ToString() == name) < mask_tmp = Instantiate(obj); >> > void Update() < RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit)) < curPos = hit.point + hit.normal * shift; >if(mask_tmp) < mask_tmp.position = curPos; if(Input.GetAxis("Mouse ScrollWheel") >0) < mask_tmp.localEulerAngles += new Vector3(0, 45, 0); >if(Input.GetAxis("Mouse ScrollWheel") < 0) < mask_tmp.localEulerAngles -= new Vector3(0, 45, 0); >if(Input.GetMouseButtonDown(0) && isOn) < original_tmp.gameObject.SetActive(true); original_tmp.position = mask_tmp.position; original_tmp.localEulerAngles = mask_tmp.localEulerAngles; original_tmp = null; isOn = false; Destroy(mask_tmp.gameObject); >else if(Input.GetMouseButtonDown(1)) < Destroy(original_tmp.gameObject); Destroy(mask_tmp.gameObject); >> > >
original — массив всех префабов с оригинальными моделями построек.
mask — массив всех префабов макетов.
shift — сдвиг по оси Y для модельки.
respawnTag — тег плоскости на которой разрешено строительство.
На сцену нужно добавить несколько UI элементов, точнее иконки, GameObject > UI > Image. Создаем нужное количество иконок, размещаем как нужно. Затем, на каждую иконку надо добавить компонент Event Trigger, выбрать в нем функцию Pointer Click а потом перетащить в активное поле объект со скриптом DragAndDrop и меню выбрать функцию скрипта — SetMask и указываем номер макета. Например:

То есть, суть в том, что каждая иконка соответствует конкретной модели, поэтому мы назначаем номера. В игре, кликаем на иконку — отправляем номер в скрипт — он находит соответствующую модель. Так это работает.
ЛКМ по иконке — получить макет здания. Повторный ЛКМ — установить здание. ПКМ — отмена. Колесико мыши — вращать.
Скачать проект по теме:
Система строительства зданий [Unity 3D] [Tutorial]
![]()
Делаем систему для строительства зданий по сетке в Unity 3D. Она подойдёт для строительства зданий в вашей стратегии, сити билдере, ферме, а если применить фантазию то можно сделать из неё например инвентарь сеткой, как в сталкере или resident evil, или ещё что-нибудь необычное и интересное 0:00 — Введение 0:31 — Настраиваем здание и скрипт Building 6:39 — Начинаем писать BuildingGrid 14:17 — Проверки на границы 17:54 — Ещё два типа зданий 20:42 — Проверка пересечений 24:04 — Заключение Готовый проект — https://github.com/emeraldpowder/BuildingSystem Patreon канала — https://www.patreon.com/emeraldpowder Наш Discord — https://discord.gg/4kd654Z На этом канале регулярно появляются новые видео, которые позволят тебе научиться создавать игры, или подарят новые идеи и вдохновение, если ты уже умеешь. Подписывайся! Остались какие-то вопросы, пожелания, или идеи для других видео? Смело пиши в комментарии под видео
Показать больше
Войдите , чтобы оставлять комментарии.