Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
34 / 11 / 6
Регистрация: 09.01.2018
Сообщений: 189

Архитектура. Кто главный юнити или игра?

26.11.2019, 16:56. Показов 6915. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.

У меня опыт в юнити можно сказать совсем никакой. Все пытаюсь выяснить если не оптимальную, то хотя бы не ущербную архитектуру приложения в Юнити. Сложность заключается в том, что все советы, мануалы и обучение почему-то идут против интуитивной разработки и совершенно игнорируют тот факт, что игра это всегда большее, чем пара объектов, двигающихся на сцене.

Попытаюсь понятнее объяснить.

Как обычно строится приложение. Сначала берется какой-то метод Main, который стартует наше new App(). В этом приложении создаются какие-то объекты - списки, фабрики, локаторы, загрузчики, логгеры и т.п., потом начинается основной цикл, который порождает уже сам процесс игры, игрока, сцены, врагов и т.д. (мелочи типа лези лоад не берем тут в расчет).

А что нам предлагает Юнити? Вот вам сцена, туда добавляются объекты, которые стартуют в случайном порядке, можно порождать другие объекты, но связи между ними нет, искать объекты - табу, ведь это очень напряженный и долгий процесс. У любого здравомыслящего человека возникает вопрос "а как собственно ссылаться на объекты если нельзя их искать и неизвестно кто их порождает", "как эти объекты должны общаться с движком игры" и прочее. Отсюда появляются идеи типа синглтон-менеджеров, что в свою очередь порождает проблемы с очисткой, рестартом, всякие null отсылки, и вообще большие дядьки бьют по рукам и говорят что синглтоны - ЗЛО! И многое другое.

На этом месте человек, пытающийся разобраться как делать то, чего делать нельзя, при этом контролировать то, что контролировать нельзя, впадает во фрустрацию. Как стартовать приложение, создавать объекты, всегда знать о них все, ссылаться на ресурсы игры, отображать информацию в UI, и чтобы это не тормозило и не набивало шишек.

У меня есть свое не до конца сформированное мнение об этом, поэтому я хотел бы услышать ваши идеи, предложения или ссылки на уже готовые жизненные циклы приложения (нет не жизненный цикл GameObject start, update и т.д., а именно всего приложения, когда запускать логгеры, соединения с базой данных, как и когда порождать объекты и как их хранить, чтобы "не искать").
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.11.2019, 16:56
Ответы с готовыми решениями:

Игра на юнити
Привет ,ребята. Кто умеет взламывать онлайн игры? ( не обязательно сам сервак )

Игра с огромным открытым миром и отличной графикой в лайтовом издании Юнити. Решаю роизводительность
Вечер всем добрый! Я слышал, что в ПРО версии Единства работает система... рендеринга той части игры, которую видит игрок... Надеюс, я...

Игра. Игроки по очереди вычеркивают 1 или 2 или 3 клетки, следующие подряд. Проигрывает тот, кто вычеркнет последнюю клетку
Всем привет!! Есть полоска из 11 клеток. Играют 2 игрока, по очереди вычеркивают 1 или 2 или 3 клетки, следующие подряд. Проигрывает тот,...

24
 Аватар для Steroid
296 / 217 / 86
Регистрация: 17.02.2016
Сообщений: 1,276
Записей в блоге: 1
26.11.2019, 17:35
Цитата Сообщение от ezd Посмотреть сообщение
искать объекты - табу
кто такое сказал?

Цитата Сообщение от ezd Посмотреть сообщение
синглтоны - ЗЛО!
с чего такое мнение?

Цитата Сообщение от ezd Посмотреть сообщение
порождает проблемы с очисткой
в C# есть уже готовый GarbageCollector

Цитата Сообщение от ezd Посмотреть сообщение
можно порождать другие объекты, но связи между ними нет
все объекты в сцене стандартно являются GameObjectами

Цитата Сообщение от ezd Посмотреть сообщение
а как собственно ссылаться на объекты если нельзя их искать и неизвестно кто их порождает
все это известно

просто юнити очень многое упрощает для современныъ "супер разработчиков игр"!

для того чтоб понять как работает хотябы функция Update()

представь что у тебя есть кружка для чая с ручкой (стандартная)
у этой кружки есть вертексы
и полигоны
в "object space"
когда помещаешь "кружку" на сцену например юнити
нужно перевести коорбинаты объекта в мировые координаты
просчитать освещение
также нужно чтобы камера всё это показывала, тоесть и камеры тоже есть параметры как положение, поворот, направление "взгляда" и тд

это еще не всё еще очень много разных операций про которые тут можно несколько часов тыкать по клавиатуре
всё это произходит КАЖДЫЙ фрейм на всех объектах в сцене

скажем юнити дает нам доступ к верхушке айсберга

поэтому последнее время появилось очень много разработчиков игр считающих себя крутыми, незнающими даже половины процесса отрисовки графики

Цитата Сообщение от ezd Посмотреть сообщение
как и когда порождать объекты и как их хранить
как душе будет угодно

Цитата Сообщение от ezd Посмотреть сообщение
именно всего приложения
читай документацию
0
34 / 11 / 6
Регистрация: 09.01.2018
Сообщений: 189
26.11.2019, 17:43  [ТС]
Цитата Сообщение от Steroid Посмотреть сообщение
кто такое сказал?
Цитата Сообщение от Steroid Посмотреть сообщение
с чего такое мнение?
На этом месте я должен найти все ссылки где говорится об этом? Давайте не будем тратить время на это, я уверен, что все кто читает что-то по теме, неоднократно встречались с этим, вплоть до "лично указывать камеру, потому что иначе камера.мэйн будет искаться движком, а это дооооолго". Просто сойдемся на том, что такие мнения есть.

Цитата Сообщение от Steroid Посмотреть сообщение
в C# есть уже готовый GarbageCollector
Не в коллекторе дело, а в очистке синглотона и обнулении всяких данных vs restart -> new Game()

Ты явно не понял о чем тема. Попробуй перечитать ещё раз. Я знаю что такое геймобджекты и что такое Update, речь о том, что объекты например должны порождаться всегда только кодом и только так всегда будет ссылка на объект из первоисточника. А дальше уже проистекают вопросы "как этим объектом управлять", будет ли объект Player == GameObject или GameObject (prefab) лишь View, которым управляет некий контроллер (игра или что-то ещё). К сожалению все эти вещи игнорируются мануалами. Если объекты все порождаются, то и сцены за исключением константных объектов, описывающих уровень, практически пустыми должны быть. И многое другое. То есть огромная куча нюансов возникает когда переходишь от этапа "сделать два шарика по мануалу" к этапу "сделать игру".
0
 Аватар для Steroid
296 / 217 / 86
Регистрация: 17.02.2016
Сообщений: 1,276
Записей в блоге: 1
26.11.2019, 18:27
Цитата Сообщение от ezd Посмотреть сообщение
То есть огромная куча нюансов возникает когда переходишь от этапа "сделать два шарика по мануалу" к этапу "сделать игру".
ну это немного труднее чем "два тапка обо....ть"

Цитата Сообщение от ezd Посмотреть сообщение
речь о том, что объекты например должны порождаться всегда только кодом
а чем вы хотете? силой мысли?
Цитата Сообщение от ezd Посмотреть сообщение
будет ли объект Player == GameObject или GameObject (prefab) лишь View
глубокое заблуждение

Цитата Сообщение от ezd Посмотреть сообщение
"как этим объектом управлять"
с помошью АПИ

Цитата Сообщение от ezd Посмотреть сообщение
Если объекты все порождаются, то и сцены за исключением константных объектов, описывающих уровень, практически пустыми должны быть
непонял, хотя зависит от того что вам нужно для игры

Цитата Сообщение от ezd Посмотреть сообщение
которым управляет некий контроллер (игра или что-то ещё)
Engine при помощи АПИ специально созданого для облегчения управления движком
в этом и заключается смысл игрового движка
0
7 / 6 / 1
Регистрация: 06.05.2018
Сообщений: 51
27.11.2019, 01:42
Цитата Сообщение от ezd Посмотреть сообщение
идут против интуитивной разработки
Правильное слово тут - привычной.

Цитата Сообщение от ezd Посмотреть сообщение
Как обычно строится приложение. Сначала берется какой-то метод Main, ...
За вас как раз это делает игровой двиг юнити.

Цитата Сообщение от ezd Посмотреть сообщение
стартуют в случайном порядке,
Порядок старта скриптов можно задать.

Цитата Сообщение от ezd Посмотреть сообщение
можно порождать другие объекты, но связи между ними нет,
Вот тут не понял.

Цитата Сообщение от ezd Посмотреть сообщение
искать объекты - табу, ведь это очень напряженный и долгий процесс.
Искать с помощью статик метода GameObject.Find действительно нехорошо.
Никто не запрещал искать через gameObject.transform.Find()
или даже вот так transform.GetComponentsInChildren<T>()
Кроме того вам редко когда нужно знать все обо всем, кэшируйте поиск.
Если сильно хочется можно порождать все самому на пустой сцене, некоторые так и делают используя юнити только как рендер.

Цитата Сообщение от ezd Посмотреть сообщение
говорят что синглтоны - ЗЛО!
Для корпоративного джуниор безусловно.
Но мы то игру пишем а не мегафреймворк силами корпорации.

Цитата Сообщение от ezd Посмотреть сообщение
Как стартовать приложение, создавать объекты, всегда знать о них все, ссылаться на ресурсы игры
когда запускать логгеры, соединения с базой данных, как и когда порождать объекты и как их хранить, чтобы "не искать").
Приложение стартует само.
Ваша задача в общем случае выстроить взаимодействие объектов.

Настоящее адское веселье вас ждет когда пожелаете сериализовать сцену и самый смак - десеарилизовать.
Тут даже монстры вроде Newtonsoft.Json по умолчанию падают в экзепшн нульреф луп, а после устранения пищат о депрекейт и так далее.
0
34 / 11 / 6
Регистрация: 09.01.2018
Сообщений: 189
27.11.2019, 11:44  [ТС]
Цитата Сообщение от Kharr Посмотреть сообщение
За вас как раз это делает игровой двиг юнити.
Это здорово конечно, но от необходимо инициализировать окружение игры типа базы данных, локализация и прочее это не избавляет, и это надо когда-то делать.

Цитата Сообщение от Kharr Посмотреть сообщение
Вот тут не понял.
Всякие мануалы и пособия рассказывают типа сделаем ракетницу: "создаем геймобджект, в него пихаем скрипт, который будет создавать ракету" и получается что один геймобджект в котором висит скрипт порождает другой объект. А движок игры ничего об этом не знает. Все действия будто проходят где-то вне его. А если мы решили посчитать, допустим сколько игроки навыпускали ракет? Надо либо чтобы каждый игрок куда-то все сохранял (опять синглтон какой-то?) или ракеты должен создавать не любой скрипт на геймобджекте, а движок игры и сам считать, который может быть вообще на сцене не представлен.

То есть чтобы сохранить гибкость и управляемость вся разработка должна идти совершенно не как в мануалах, а редактор юнити нужен только для создания константных сцен, тестирования, создания префабов и т.д. Вся логика игры должна скрываться в движке игры, но никогда не геймобджектах, в них только то что никогда нигде никак учитывать не надо, типа показ эффектов запуском партиклс.

Но поскольку все мануалы игнорируют этот факт, а упираются в "создадим шарик, на него повесим скрипт", получается гигантская пропасть в архитектуре приложения между обучающими материалами и реальными проектами. Вот мне и интересно как строятся реальные приложения. Как там организуется связь между объектами, кто за что отвечает.
0
 Аватар для Steroid
296 / 217 / 86
Регистрация: 17.02.2016
Сообщений: 1,276
Записей в блоге: 1
27.11.2019, 12:32
Цитата Сообщение от ezd Посмотреть сообщение
Всякие мануалы и пособия рассказывают типа сделаем ракетницу: "создаем геймобджект, в него пихаем скрипт, который будет создавать ракету" и получается что один геймобджект в котором висит скрипт порождает другой объект. А движок игры ничего об этом не знает. Все действия будто проходят где-то вне его. А если мы решили посчитать, допустим сколько игроки навыпускали ракет? Надо либо чтобы каждый игрок куда-то все сохранял (опять синглтон какой-то?) или ракеты должен создавать не любой скрипт на геймобджекте, а движок игры и сам считать, который может быть вообще на сцене не представлен.
братан "ты как с луны свалился"
конечно всё нужно делать самому, за тебя никто не будет считать твои ракеты

Цитата Сообщение от ezd Посмотреть сообщение
Вся логика игры должна скрываться в движке игры, но никогда не геймобджектах,
ты про API слышал когданибудь?
так вот в движке какраз вся логика построения ипреобразования матриц скрывается и доступ у тебя к ней произходит через API для упрощения ТЕБЕ работы с движком

смотри обучающие видео и не говори что ты уже КУЧУ материала посмотрел.... ты бы не задавал таких вопросов!
0
250 / 186 / 68
Регистрация: 04.03.2019
Сообщений: 1,010
27.11.2019, 12:33
ezd, да вы начните делать как умеете и увидите что и как будет лучше после N-итерации.
нет единого мнения как и что делать. да и каждая игра это считай своя уникальная вселенная. да что-то будет общее, но остальное разное.
кто на что способен так и делает.

Цитата Сообщение от ezd Посмотреть сообщение
обучающими материалами
дают нам понимание как работает Юнити. а не как вы хотите архитектуру создать.
0
34 / 11 / 6
Регистрация: 09.01.2018
Сообщений: 189
27.11.2019, 12:39  [ТС]
Цитата Сообщение от Steroid Посмотреть сообщение
так вот в движке какраз вся логика построения ипреобразования матриц скрывается и доступ у тебя к ней произходит через API для упрощения ТЕБЕ работы с движком
Ох. Юнити это скорее фреймворк, а движок игры, включающий ее логику, это class MySuperPuperGame. Меня интересует как строить логику такой программы для эффективного взаимодействия с Unity.

Добавлено через 3 минуты
Цитата Сообщение от MuaddibFremen Посмотреть сообщение
ezd, да вы начните делать как умеете и увидите что и как будет лучше после N-итерации.
нет единого мнения как и что делать. да и каждая игра это считай своя уникальная вселенная. да что-то будет общее, но остальное разное.
кто на что способен так и делает.
Мне кажется можно эволюционировать чуть быстрее, узнавая чужой опыт, а не идти по всем граблям самостоятельно
0
250 / 186 / 68
Регистрация: 04.03.2019
Сообщений: 1,010
27.11.2019, 12:40
ezd,
по любому запустится хотя бы одна сцена.
вот на ней и городите игровой цикл("свой движок").
не хотите пользоваться методами unity Update/Start/Awake/etc - не пользуйтесь. уберите их и сами контролируйте в gameLoop все обьекты.
0
 Аватар для Steroid
296 / 217 / 86
Регистрация: 17.02.2016
Сообщений: 1,276
Записей в блоге: 1
27.11.2019, 12:44
логика движка и логика игры 2 разные вещи
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,110
27.11.2019, 13:03
ezd, возможно, будет более конструктивно, если вы сформулируете конкретные вопросы по отдельным интересующим вас проблемам. Вроде, как лучше сделать "такую" штуку?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
27.11.2019, 13:07
Цитата Сообщение от ezd Посмотреть сообщение
Архитектура. Кто главный юнити или игра?
Я понимаю ваш вопрос. И он не простой.
С одной стороны, конечно общие принципы и паттерны никто не отменял, но с другой стороны 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
Цитата Сообщение от ezd Посмотреть сообщение
необходимо инициализировать окружение игры типа базы данных,
Юнити по крайней мере 5.6, из коробки не имеет мультитрида, а значит все исполняется последовательно, даже если это корутины.
Ставите ваш скрипт в настройках (не помню где) самым первым на исполнение, профит, юнити вынуждена приостановить инициализацию остальных скриптов пока не запустит указанный.

Цитата Сообщение от ezd Посмотреть сообщение
А движок игры ничего об этом не знает. ... А если мы решили посчитать, допустим сколько игроки навыпускали ракет?
Знает. Вы же дергаете для порождения его АПИ Createinstance. а раз вы его дергаете то можно и посчитать легко.
Это вопрос архитектуры.

Цитата Сообщение от ezd Посмотреть сообщение
редактор юнити нужен только для создания константных сцен, тестирования, создания префабов
Логично, а еще там в инспекторе в делегатах можно выбрать "разрешить скрипт в редакторе" или непосредственно в скрипте прописать атрибут.

Цитата Сообщение от ezd Посмотреть сообщение
и т.д. Вся логика игры должна скрываться в движке игры.
Движок не может учесть всех пожеланий игростроя, потому он лишь обслуживает АПИ управления сценой и объектами и поддерживает для них внутренние коннекторы типа апдейт физиксапдейт старт итп.

Цитата Сообщение от ezd Посмотреть сообщение
мануалы ... упираются в "создадим шарик, на него повесим скрипт", получается гигантская пропасть в архитектуре приложения между обучающими материалами и реальными проектами.
Согласен. Ютуб переполнен поделками начинающих и нужно потратить время на то чтобы отыскать поначалу что-то стоящее.

Цитата Сообщение от ezd Посмотреть сообщение
Вот мне и интересно как строятся реальные приложения. Как там организуется связь между объектами, кто за что отвечает.
Как бог на душу положит, и это очень сладко, поскольку мы можем пробовать разные архитектуры .
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  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Я понимаю ваш вопрос. И он не простой.
С одной стороны, конечно общие принципы и паттерны никто не отменял, но с другой стороны Unity вносит свои ограничения, которые сильно влияют на архитектуру. Есть разные подходы - от создания врапперов поверх юнити и дальнейшая работа в привычных парадигмах, до забития на все паттерны и развешивания скриптов на gameobject-ы как к тому подталкивает сам движок. Однако большинство все таки работают где-то посередине.
Для начала я вам советую посмотреть на такой паттерн как EventBus (или просто Bus, шина сообщений и т.д.).
Пример реализации - есть здесь https://www.cyberforum.ru/blog... g5507.html
Там же есть пример приложения, в которой части более-менее независимы друг от друга, благодаря шине сообщений.
Помимо Bus, есть также подходы, связанные с внедрением зависимостей (см например Zenject), а также реактивное программирование (правда оно скорее о другом, не о связанности) - например UniRx.
Если будут более конкретные вопросы - спрашивайте. На конкретику отвечу.
Спасибо. Интересный подход.

Есть пара вопросов.

1) Можно ли как-то в этом подходе реализовать передачу дополнительной информации типа отправителя и чего-то ещё? Или все дополнительные данные должны быть сохранены в какой-то определенный объект типа StateBus.MessageType - где MessageType это объект или массив определенных объектов?

2) Как может получить сообщение код, не являющийся MonoBehavior (не имеет Update)? По логике кто должен это сообщить игре?

П.С. Долго отвечал, потому что времени не было.
0
 Аватар для 1max1
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  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
1. Завести структуру/класс, где одно из полей sender, ну или расширить класс мессенджера)
И этот класс должен быть StateBus.ЭТОТ_КЛАСС или как?

Цитата Сообщение от 1max1 Посмотреть сообщение
2. Создать менеджер, который будет в апдейте все проверять и отсылать сообщения не MonoBehavior классам, как вариант.
И этот менеджер будет MessageBus со всеми вытекающими последствиями? Он должен знать кому отправлять и что - получается связанность. Чтобы ее не было - надо делать подписчиков... и тут мы пришли к тому с чего начали Я в принципе против подписчиков и провайдеров ничего не имею, но идея же вроде от этого подхода отказаться. И в принципе в рамках юнити когда и так есть Update - такой вариант подходит.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
10.12.2019, 11:12
Цитата Сообщение от ezd Посмотреть сообщение
1) Можно ли как-то в этом подходе реализовать передачу дополнительной информации типа отправителя и чего-то ещё? Или все дополнительные данные должны быть сохранены в какой-то определенный объект типа StateBus.MessageType - где MessageType это объект или массив определенных объектов?
Нужно определить свой класс MyClass, в котором перечислены все необходимые поля.
А затем создать событие или состояние:
C#
1
Bus.Event<MyClass> или Bus.State<MyClass>
Цитата Сообщение от ezd Посмотреть сообщение
2) Как может получить сообщение код, не являющийся MonoBehavior (не имеет Update)? По логике кто должен это сообщить игре?
В выложенной версии Bus получать сообщения могут только MonoBehaviour (хотя я реально пользуюсь немного другой версией - там возможно подписать любой объект).
Но передавать сообщения в объекты данных - немного неправильно. Если реализовывать MVC-like pattern, то должен быть контроллер, который передает данные из View в DataDomain. И этот контроллер обычно является MonoBehaviour и он же и ловит сообщения шины. Поэтому реально нет необходимости ловить шину из доменного объекта.

Цитата Сообщение от ezd Посмотреть сообщение
Он должен знать кому отправлять и что - получается связанность
Опишите конкретную проблему, которую вы решаете. Шина сообщений позволяет разрывать связность. Если у вас это не так - значит вы что-то делаете неправильно.
0
34 / 11 / 6
Регистрация: 09.01.2018
Сообщений: 189
10.12.2019, 16:14  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
В выложенной версии Bus получать сообщения могут только MonoBehaviour (хотя я реально пользуюсь немного другой версией - там возможно подписать любой объект).
Нуу... "получать", а точнее проверять может кто угодно, так как это статический глобальный объект. Основная загвоздка в том, чтобы этот кто-то получил управление, чтобы иметь возможность проверить. В монобехе сам юнити передает управление каждый кадр, а если это не монобех, то кто-то другой должен вызвать.

Цитата Сообщение от Storm23 Посмотреть сообщение
Но передавать сообщения в объекты данных - немного неправильно.
EventArgs же, не? Я так понял StateBus.MyType и есть EventArgs только с собственной сигнатурой, а не общей.

Я вот как раз думаю об MVC, только я себе представляю View=монобех, а контроллер должен ловить всякие нажатия клавиш и давать всякие команды в модель. Модель должна изменять себя под действием команд и View должен быть как-то подписан на изменения в модели чтобы перечитывать изменения в ней и обновлять себя (это решается обсервером). Но проблема в том что на эту модель должны подписываться и другие компоненты игры типа на события "апгрейд завершен" или "юнит построен". Такие сообщения как мне кажется не должны ловиться во всех View (монобех) в игре каждый кадр. Поэтому я себе представляю это опять же через подписку на события.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.12.2019, 16:14
Помогаю со студенческими работами здесь

Кто поможет переписать программу с графикой PascalABC на FreePascal? Или подскажите почему игра плохо работает
Вот код на PascalABC. Помогите переделать под Free или Turbo Pascal. И почему программа на ABC не до конца работает? program z4; uses...

Теоретическая механика. Статика: определить реакцию в точках, найти главный вектор и главный момент активных сил.
Помогите решить задачку.

Главный раздел или BOOTMGR is missing
Поставил новенькую шиндовс 7 на SSD(Локальный диск C) и после перезагрузки обнаружил удивительное. Если я загружаюсь с SSD,на которую...

Архитектура программы: как лучше реализовать иерархию классов? (игра "Тамагочи")
Здравствуйте! Пишу игру тамагочи на с++ ооп. Есть класса Critter (основная). Походными классами од Critter являются Dog , Cat, Hamster. ...

Какой сделать главный класс и/или какая правильная структура?
Написал авторизацию и регистрацию без классов. Все работает как положено. Переделываю через классы: Какой сделать главный класс...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru