|
34 / 11 / 6
Регистрация: 09.01.2018
Сообщений: 189
|
|
Архитектура. Кто главный юнити или игра?26.11.2019, 16:56. Показов 6915. Ответов 24
Метки нет (Все метки)
Всем привет.
У меня опыт в юнити можно сказать совсем никакой. Все пытаюсь выяснить если не оптимальную, то хотя бы не ущербную архитектуру приложения в Юнити. Сложность заключается в том, что все советы, мануалы и обучение почему-то идут против интуитивной разработки и совершенно игнорируют тот факт, что игра это всегда большее, чем пара объектов, двигающихся на сцене. Попытаюсь понятнее объяснить. Как обычно строится приложение. Сначала берется какой-то метод Main, который стартует наше new App(). В этом приложении создаются какие-то объекты - списки, фабрики, локаторы, загрузчики, логгеры и т.п., потом начинается основной цикл, который порождает уже сам процесс игры, игрока, сцены, врагов и т.д. (мелочи типа лези лоад не берем тут в расчет). А что нам предлагает Юнити? Вот вам сцена, туда добавляются объекты, которые стартуют в случайном порядке, можно порождать другие объекты, но связи между ними нет, искать объекты - табу, ведь это очень напряженный и долгий процесс. У любого здравомыслящего человека возникает вопрос "а как собственно ссылаться на объекты если нельзя их искать и неизвестно кто их порождает", "как эти объекты должны общаться с движком игры" и прочее. Отсюда появляются идеи типа синглтон-менеджеров, что в свою очередь порождает проблемы с очисткой, рестартом, всякие null отсылки, и вообще большие дядьки бьют по рукам и говорят что синглтоны - ЗЛО! И многое другое. На этом месте человек, пытающийся разобраться как делать то, чего делать нельзя, при этом контролировать то, что контролировать нельзя, впадает во фрустрацию. Как стартовать приложение, создавать объекты, всегда знать о них все, ссылаться на ресурсы игры, отображать информацию в UI, и чтобы это не тормозило и не набивало шишек. У меня есть свое не до конца сформированное мнение об этом, поэтому я хотел бы услышать ваши идеи, предложения или ссылки на уже готовые жизненные циклы приложения (нет не жизненный цикл GameObject start, update и т.д., а именно всего приложения, когда запускать логгеры, соединения с базой данных, как и когда порождать объекты и как их хранить, чтобы "не искать").
0
|
|
| 26.11.2019, 16:56 | |
|
Ответы с готовыми решениями:
24
Игра на юнити Игра с огромным открытым миром и отличной графикой в лайтовом издании Юнити. Решаю роизводительность Игра. Игроки по очереди вычеркивают 1 или 2 или 3 клетки, следующие подряд. Проигрывает тот, кто вычеркнет последнюю клетку |
|
|
||||||||
| 26.11.2019, 17:35 | ||||||||
|
просто юнити очень многое упрощает для современныъ "супер разработчиков игр"! для того чтоб понять как работает хотябы функция Update() представь что у тебя есть кружка для чая с ручкой (стандартная) у этой кружки есть вертексы и полигоны в "object space" когда помещаешь "кружку" на сцену например юнити нужно перевести коорбинаты объекта в мировые координаты просчитать освещение также нужно чтобы камера всё это показывала, тоесть и камеры тоже есть параметры как положение, поворот, направление "взгляда" и тд это еще не всё еще очень много разных операций про которые тут можно несколько часов тыкать по клавиатуре всё это произходит КАЖДЫЙ фрейм на всех объектах в сцене скажем юнити дает нам доступ к верхушке айсберга поэтому последнее время появилось очень много разработчиков игр считающих себя крутыми, незнающими даже половины процесса отрисовки графики
0
|
||||||||
|
34 / 11 / 6
Регистрация: 09.01.2018
Сообщений: 189
|
||||
| 26.11.2019, 17:43 [ТС] | ||||
|
Ты явно не понял о чем тема. Попробуй перечитать ещё раз. Я знаю что такое геймобджекты и что такое Update, речь о том, что объекты например должны порождаться всегда только кодом и только так всегда будет ссылка на объект из первоисточника. А дальше уже проистекают вопросы "как этим объектом управлять", будет ли объект Player == GameObject или GameObject (prefab) лишь View, которым управляет некий контроллер (игра или что-то ещё). К сожалению все эти вещи игнорируются мануалами. Если объекты все порождаются, то и сцены за исключением константных объектов, описывающих уровень, практически пустыми должны быть. И многое другое. То есть огромная куча нюансов возникает когда переходишь от этапа "сделать два шарика по мануалу" к этапу "сделать игру".
0
|
||||
|
|
|||||||
| 26.11.2019, 18:27 | |||||||
|
в этом и заключается смысл игрового движка
0
|
|||||||
|
7 / 6 / 1
Регистрация: 06.05.2018
Сообщений: 51
|
||||||||
| 27.11.2019, 01:42 | ||||||||
|
Никто не запрещал искать через gameObject.transform.Find() или даже вот так transform.GetComponentsInChildren<T>() Кроме того вам редко когда нужно знать все обо всем, кэшируйте поиск. Если сильно хочется можно порождать все самому на пустой сцене, некоторые так и делают используя юнити только как рендер. Но мы то игру пишем а не мегафреймворк силами корпорации. Ваша задача в общем случае выстроить взаимодействие объектов. Настоящее адское веселье вас ждет когда пожелаете сериализовать сцену и самый смак - десеарилизовать. Тут даже монстры вроде Newtonsoft.Json по умолчанию падают в экзепшн нульреф луп, а после устранения пищат о депрекейт и так далее.
0
|
||||||||
|
34 / 11 / 6
Регистрация: 09.01.2018
Сообщений: 189
|
|||
| 27.11.2019, 11:44 [ТС] | |||
|
То есть чтобы сохранить гибкость и управляемость вся разработка должна идти совершенно не как в мануалах, а редактор юнити нужен только для создания константных сцен, тестирования, создания префабов и т.д. Вся логика игры должна скрываться в движке игры, но никогда не геймобджектах, в них только то что никогда нигде никак учитывать не надо, типа показ эффектов запуском партиклс. Но поскольку все мануалы игнорируют этот факт, а упираются в "создадим шарик, на него повесим скрипт", получается гигантская пропасть в архитектуре приложения между обучающими материалами и реальными проектами. Вот мне и интересно как строятся реальные приложения. Как там организуется связь между объектами, кто за что отвечает.
0
|
|||
|
|
|||
| 27.11.2019, 12:32 | |||
|
конечно всё нужно делать самому, за тебя никто не будет считать твои ракеты так вот в движке какраз вся логика построения ипреобразования матриц скрывается и доступ у тебя к ней произходит через API для упрощения ТЕБЕ работы с движком смотри обучающие видео и не говори что ты уже КУЧУ материала посмотрел.... ты бы не задавал таких вопросов!
0
|
|||
|
250 / 186 / 68
Регистрация: 04.03.2019
Сообщений: 1,010
|
||
| 27.11.2019, 12:33 | ||
|
ezd, да вы начните делать как умеете и увидите что и как будет лучше после N-итерации.
нет единого мнения как и что делать. да и каждая игра это считай своя уникальная вселенная. да что-то будет общее, но остальное разное. кто на что способен так и делает.
0
|
||
|
34 / 11 / 6
Регистрация: 09.01.2018
Сообщений: 189
|
|||
| 27.11.2019, 12:39 [ТС] | |||
|
Добавлено через 3 минуты
0
|
|||
|
250 / 186 / 68
Регистрация: 04.03.2019
Сообщений: 1,010
|
|
| 27.11.2019, 12:40 | |
|
ezd,
по любому запустится хотя бы одна сцена. вот на ней и городите игровой цикл("свой движок"). не хотите пользоваться методами unity Update/Start/Awake/etc - не пользуйтесь. уберите их и сами контролируйте в gameLoop все обьекты.
0
|
|
|
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,110
|
|
| 27.11.2019, 13:03 | |
|
ezd, возможно, будет более конструктивно, если вы сформулируете конкретные вопросы по отдельным интересующим вас проблемам. Вроде, как лучше сделать "такую" штуку?
0
|
|
|
|
||
| 27.11.2019, 13:07 | ||
|
С одной стороны, конечно общие принципы и паттерны никто не отменял, но с другой стороны Unity вносит свои ограничения, которые сильно влияют на архитектуру. Есть разные подходы - от создания врапперов поверх юнити и дальнейшая работа в привычных парадигмах, до забития на все паттерны и развешивания скриптов на gameobject-ы как к тому подталкивает сам движок. Однако большинство все таки работают где-то посередине. Для начала я вам советую посмотреть на такой паттерн как EventBus (или просто Bus, шина сообщений и т.д.). Пример реализации - есть здесь https://www.cyberforum.ru/blog... g5507.html Там же есть пример приложения, в которой части более-менее независимы друг от друга, благодаря шине сообщений. Помимо Bus, есть также подходы, связанные с внедрением зависимостей (см например Zenject), а также реактивное программирование (правда оно скорее о другом, не о связанности) - например UniRx. Если будут более конкретные вопросы - спрашивайте. На конкретику отвечу.
1
|
||
|
7 / 6 / 1
Регистрация: 06.05.2018
Сообщений: 51
|
|||||||
| 27.11.2019, 13:30 | |||||||
|
Ставите ваш скрипт в настройках (не помню где) самым первым на исполнение, профит, юнити вынуждена приостановить инициализацию остальных скриптов пока не запустит указанный. Это вопрос архитектуры.
0
|
|||||||
|
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,110
|
|
| 27.11.2019, 14:25 | |
|
ezd, у меня опыт в юнити нулевой. Относительное серьёзное знакомство с игровыми движками ограничено ковырянием в Сталкере. Там, например, то же вся логика на lua-скриптах, децентрализована и разнесена по разным объектам. Игра - это список и состояние всех объектов включая состояние скриптовой логики. Централизованная логика завязана на главного героя, игрок это то же объект игры. UI, в основном, отображает состояние главного героя, так что никаких заморочек с добыванием информации для отображения нет. Хотя, может и не в кассу я со своим примером...
0
|
|
|
34 / 11 / 6
Регистрация: 09.01.2018
Сообщений: 189
|
||
| 07.12.2019, 21:23 [ТС] | ||
|
Есть пара вопросов. 1) Можно ли как-то в этом подходе реализовать передачу дополнительной информации типа отправителя и чего-то ещё? Или все дополнительные данные должны быть сохранены в какой-то определенный объект типа StateBus.MessageType - где MessageType это объект или массив определенных объектов? 2) Как может получить сообщение код, не являющийся MonoBehavior (не имеет Update)? По логике кто должен это сообщить игре? П.С. Долго отвечал, потому что времени не было.
0
|
||
|
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
|
|
| 07.12.2019, 21:31 | |
|
1. Завести структуру/класс, где одно из полей sender, ну или расширить класс мессенджера)
2. Создать менеджер, который будет в апдейте все проверять и отсылать сообщения не MonoBehavior классам, как вариант.
0
|
|
|
34 / 11 / 6
Регистрация: 09.01.2018
Сообщений: 189
|
|||
| 07.12.2019, 22:18 [ТС] | |||
Он должен знать кому отправлять и что - получается связанность. Чтобы ее не было - надо делать подписчиков... и тут мы пришли к тому с чего начали Я в принципе против подписчиков и провайдеров ничего не имею, но идея же вроде от этого подхода отказаться. И в принципе в рамках юнити когда и так есть Update - такой вариант подходит.
0
|
|||
|
|
|||||||||
| 10.12.2019, 11:12 | |||||||||
|
А затем создать событие или состояние:
Но передавать сообщения в объекты данных - немного неправильно. Если реализовывать MVC-like pattern, то должен быть контроллер, который передает данные из View в DataDomain. И этот контроллер обычно является MonoBehaviour и он же и ловит сообщения шины. Поэтому реально нет необходимости ловить шину из доменного объекта.
0
|
|||||||||
|
34 / 11 / 6
Регистрация: 09.01.2018
Сообщений: 189
|
|||
| 10.12.2019, 16:14 [ТС] | |||
|
Я вот как раз думаю об MVC, только я себе представляю View=монобех, а контроллер должен ловить всякие нажатия клавиш и давать всякие команды в модель. Модель должна изменять себя под действием команд и View должен быть как-то подписан на изменения в модели чтобы перечитывать изменения в ней и обновлять себя (это решается обсервером). Но проблема в том что на эту модель должны подписываться и другие компоненты игры типа на события "апгрейд завершен" или "юнит построен". Такие сообщения как мне кажется не должны ловиться во всех View (монобех) в игре каждый кадр. Поэтому я себе представляю это опять же через подписку на события.
0
|
|||
| 10.12.2019, 16:14 | |
|
Помогаю со студенческими работами здесь
20
Теоретическая механика. Статика: определить реакцию в точках, найти главный вектор и главный момент активных сил. Главный раздел или BOOTMGR is missing Архитектура программы: как лучше реализовать иерархию классов? (игра "Тамагочи") Какой сделать главный класс и/или какая правильная структура? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|