Model View Controller, MVC, Модель Вид Контроллер, C#, Unity

preview_player
Показать описание
В этот раз чего-то я немного увлёкся и вместо 15 минут получился ролик на 25. Но мне это приключение было по душе

Лежит по пути Assets/Patterns/MVCExample

Автору на кофе и шаурму
4276 5500 5792 8742 - карта Сбербанка

Если будут вопросы
мой тг @wargy

Таймкоды
00:00 Введение
00:35 MV* Паттерны
01:05 Определение MVC
01:55 Схема ролей MVC
03:22 Пример MVC в жизни
05:13 Немного истории
07:04 UML схема MVC
09:06 Преимущества MVC: связность и комбинаторность
10:23 MVC на примере шахмат
13:01 MVC для сетевых игр
15:08 MVC для игр с автотестами
16:19 Конкретный пример: введение
17:10 Конкретный пример: пишем топорный код
18:10 Конкретный пример: пишем VIEW
18:52 Конкретный пример: пишем MODEL
19:31 Конкретный пример: пишем CONTROLLER
20:30 Конкретный пример: собираем всё вместе
21:30 Когда использовать паттерны MV*-семейства
23:30 Слабости и недостатки MVC
24:30 Финал
Рекомендации по теме
Комментарии
Автор

Маленькое уточнение! В классической модели MVC от Трюгве Реенскауга контроллер НЕ ВЗАИМОДЕЙСТВУЕТ с видом. Обновление вида происходит СТРОГО через модель. В коде на видео у меня контроллер дёргал вид, когда показывал текст об успешной линии. Я это исправил, в гите теперь всё правильно.

(14 страница - две UML диаграммы P11 в правом углу. По ним видно что именно модель шлёт сигнал виду)

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

Также хочется добавить что в MVP и MVVM модель уже не обновляла вид. В MVP появился Passive View который убирал связь модели и вида, в MVVM вообще все перекрутили на датабиндинг

sergeykazantsev
Автор

Кстати ещё хотел отметить юмор, мне очень заходит и помогает в лёгкой форме всё осваивать

yuwrttv
Автор

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

VyacheslavTamplier
Автор

Это лучшее и самое приятное объяснение что я видел на ютубе, подписался :)

Hidzikata
Автор

Спасибо за видос про MVC, жду последующие разборы про остальные паттерны из этого семейства. Хотелось бы в дальнейшем еще увидеть видос про пул объектов

qujmzfd
Автор

Долго искал такое видео, наконец-то у кого-то нормальная размеренная подача и не приходится смотреть на скорости 0.5, так еще и примеры как раз под юнити

thebiggestdick
Автор

Спасибо за видео, желаю набрать скорее побольше подписчиков. Такой качественный контент.

yuwrttv
Автор

Интересная тема, жду следующие видео про mv*

brickman
Автор

Спасибо за информацию. Стало чуть яснее.

apofex
Автор

Топчик. Выросло качество видео и звук по сравнению с прошлыми видео. Простым языком о сложном.

mwhvvbv
Автор

Хорошее видео! Автор крепко пишет код и объясняет. Хотелось бы услышать про MVP - Super view (или active... крч противоположный Passive) и MVVM - зачем такое мучение с биндингами и прочее

forcesoftheevil
Автор

Лучшее видео по MVC на русском, красавчик

veatix
Автор

Тонна благодарностей! Ты большой молодец! Подготовка - понимание - подача! Стакан пенного эля этому господину!!

snxnzxv
Автор

Очень редко пишу комментарии, но вижу, что пока мало просмотров и подписчиков. Подписался и пролайкую видосы. Канал топ - закрывает бреш в нашем ру-язычном геймдев комьюнити. Главное не бросай)

kkolyann
Автор

Имхо модель с барменом, в том виде, в каком она представлена - не слишком удачная...
Ибо клиент может сразу взять меню и протянуть ее бармену и бармен будет взаимодействовать уже с меню (пытаясь понять, во что клиент тыкнул пальцем со словами "дайте две"!). т.е. стрелочки от Вью до Контроллера будут в обе стороны. Плюс в обе стороны будут стрелочки от Холодоса до Бармена. В итоге выстроится цепочка т.к. меню может быть в принципе не нужно.
Так же клиент может сразу подойти к холодильнику и на глазах у бармена достать нужное ему пивко, т.к. у него, скажем, уже оплачены напитки на вечер. т.е. клиент работает непосредственно с моделью, минуя контроллер и вью. Что в коре противоречит концепции мвц.

В примере с баром Вью должно быть не меню, а непосредственно пивко в стакане. А за место холодоса можно взять бочку с пивным краном. Тогда трио Бармен-Бочка-Пиво, хоть как то похоже на мвц в чистом виде...
А то, что дает пример автор в видео, как раз таки и порождает те самые тысячи прочтений МВЦ с десятками разнообразных стрелочек в разные стороны, которые мы часто видим в интернете.

Lucioa
Автор

Хотелось бы услышать твое мнение по поводу того как правильно организовать взаимосвязь между Игрок, Уровень, Модули, UI, GameManager. Иметь какуето строгую типизацию и синглетон, либо же делать это все самостоятельными сущностями

themesdaly
Автор

Спасибо за твои видео!

У меня есть вопрос, Если мы например делаем игрока по паттерну mvc, m - PlayerModel имеет поля и методы по обработке этих полей, c - PlayerController получает Input-ы и связывает m и v, v - ViewPlayer отвечает за анимации игрока и все с этим связанное, то куда нам запихнуть логику передвижения? Если ее запихнуть в PlayerModel или PlayerController, то им придется наследовать Monobehaviour, чтобы реализовать это. В ViewPlayer мне кажется засовывать не очень хорошей идеей, тк это нарушит srp. Как мне кажется лучше всего передвижение сделать отдельным компонентом (пусть это будет MovementController), но тогда не понятно, как должно происходить его взаимодействие с остальными элементами и где должны храниться данные связанные с перемещением (например float _speed, должен быть в PlayerModel или MovementController)?

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

Или MVC паттерн плохо подходит для таких вещей? Тогда какой software design pattern нужно использовать?

P.s Я скачал проект с гат-хаба и там небольшая ошибочка: когда Is 3 Line Logic == true, работает CentralLineController, а не AllLinesController. те Controller-а поменяны местами.
P.p.s Я посмотрел ролик про mvp и почти тоже самое можно сказать и про него, хотя с ним и проще, тк думаю можно OnCollision-ы засунуть в View, тк это своеобразный Input.

golodnenkiy
Автор

Слишком холиварная тема)

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

Но некоторые не менее серьезные программисты считают, что MVC хорош в юнити, но многие его понимают не верно и его нужно уметь готовить. Так например, люди думают, что модель - это просто набор данных без логики (то есть тупо совокупность публичных полей), а все доменная логика содержится в контроллерах, но это так называемый Simple или Anemic domain model, который в DDD считают не очень хорошей практикой, в терминах DDD модель - это совокупность приватных полей и методов, которые их обрабатывают, то есть ООП здорового человека. А контроллер в таком случае становится очень тонким, он не содержит доменной логики приложения и играет лишь роль некой прослойки, для более гибкой разработки, в простых проектах, можно даже не делать контроллеров.

Еще одно не понимание связанное с MVC в юнити, это то, что за view принимают лишь графический интерфейс, хотя по факту view - это все что отображается на экране, то есть game object'ы, на которых есть модели, спрайты и аниматоры, это тоже view. В таком случае у нас даже может быть модель, независимая от движка, и перенос проекта на другой движок сводится лишь к написанию новых view'шек для отображения объектов на этом движке, но такие вещи это уже оверинжинеринг, как по мне.

Такой MVC вполне уже можно использовать в юнити, но нужно ли? Посмотрите на другие движки, типа Unreal, Godot и других, компонентный подход там вполне справляется. Да в юнити у нас убогий компонентный подход, без конструкторов даже и невозможностью нормально резолвить сервисы из коробки (привет FindObjectOfType() и синглтоны). Но DI частично это проблему решает.

hatiko
Автор

Спасибо за видео.
Получается на UML Controller не должен иметь связи с View и Controller не должен в себе иметь переменной View совсем?
То есть Сontroller -> Model -> View получается?

1. Контроллер получает нажатие клавиши, берёт данные с Модели и их изменяет;
2. Модель получает\обновляет данные и отправляет их на Вид?
3. Вид изменять визуал игры;

Потому что из кода на github и текста ниже получается так, нет?

И еще вопрос: Я хочу начать вести мини блог на LinkendIn и написать о MVC, как я его разобрал и понял. Могу ли я ссылаться на это видео? Ссылку на видео я конечно же прикреплю.

mikki
Автор

мне кажется ссылка модели на вью лишняя, там скорее должен быть ивент, на который подписан контроллер (который этот вью и заставит рисовать по факту), что полностью убирает прямые связи между вью и моделью (в чём собственно и прикол паттерна вроде как)

nightyonetwothree
welcome to shbcf.ru