Паттерн Command, Команда, Unity, C#, gamedev
ฝัง
- เผยแพร่เมื่อ 3 ก.ค. 2024
- Один из самых непростых паттернов на моём канале. Встречайте, паттерн Command!
Напишите пожалуйста, насколько вас раздражает звук ибо мне показалось что фильтр шумоподавления неестественно искажает голос и ухудшает восприятие. На этом ролике я полностью фильтр отключил
ссылка на гитхаб на проект
github.com/Haywaar/ShawarmaFight - проект с шаурмой
github.com/Haywaar/PatternDem... - пример с игрой-паззлом
Лежит по пути Assets/Patterns/Command/GoodExample
Автору на кофе и шаурму
4276 5500 5792 8742 - карта Сбербанка
Если будут вопросы
мой тг @wargy
моя почта kazancev.s215@gmail.com
Тайминги:
00:00 Введение
00:30 Определение
02:22 Структура паттерна Command
04:48 Пример из жизни
08:05 UML-схема
09:08 Command на практике: введение - игра-паззл
09:59 Command на практике: плохое решение
12:12 Command на практике: хорошее решение
12:30 Command на практике: хорошее решение - внедряем Command
13:53 Command на практике: хорошее решение - внедряем Client
14:25 Command на практике: хорошее решение - внедряем Invoker
15:21 Command на практике: хорошее решение - подводим итоге
16:10 Command в игре ShawarmaFight
16:54 Command - стоит ли он того?
17:30 Command в геймдеве
19:07 Финал - เกม
Ты святой. Если я когда-либо выйду в область игровой индустрии со своим детищем, я укажу тебя в титрах как того, кому я особенно благодарен за помощь
Найс! Отличное объяснение моего любимого паттерна!
Спасибо за шикарный контент!)
Хорооош)
крутая подача много полезной инфы, понятно абсолютно все, спасибо что такие каналы существуют, единственное могу посоветовать повесить мягкие треугольники что бы убрать эхо, а так большое спасибо тебе Сергей за твои видео
Я очень долго жил в почти пустой комнате, отчего такое эхо и было. Но теперь я как многие начинающие ютуберы буду вещать в шкаф забитый одеждой, эхо больше не будет беспокоить)
@@sergeykazantsev1655 это очень радует)
Приятно наблюдать за развитием качественного канала. Думал что за броситься, но нет пока держаться.Очень сильно помогли с SOLID
крайне редко пишу комментарии, но это видео и канал в целом - самое настоящее сокровище, таких подробных объяснений днем с огнем не сыщешь, один только пример чего стоит, после которого, кстати, в голове все стало на свои места)
огромное спасибо за ваш труд, Сергей
Спасибо большое!!!! Как раз летом буду делать головломку с программированием действий, ох как же меня выручили 😅
Несколько месяцев опасался этого паттерна и постоянно городил костыли как раз через enum'ы. А стоило всего лишь пару дней посидеть и разбираться, столько нервов потом сэкономил..
Ролик классный, спасибо огромное)
Я фронтендер. Пыталась понять, так зачем же нужен этот паттерн. Глянула несколько видео, но именно благодаря твоему видео я поняла, что к чему. У тебя отличное объяснение и наглядный пример!
Примеры из других видео словно слишком неестественные и использование паттерна там кажется неоправданным.
Благодарю за видео! У тебя отлично получается!
Кайф, спасибо за видео!)
О, супер, спасибо за видос! Когда-то у меня дойдут руки до ртс, там этот паттерн распробую на полную)
Top
Хорошо постарались. С головоломкой отличный пример вышел. Я в неё почему-то сыграть захотел
Надо только посложнее уровни сгенерить )
@@sergeykazantsev1655 и добавить лимит на количество ходов
повезло наткнуться на канал, надеюсь, вы наберёте побольше аудитории и люди станут писать код грамотнее!
спасибо!
Нравится практическая направленность канала. Но, пардон за моё брюзжание. Заметил грубую ошибку в подаче материала: если что-то написал, обязательно объясняй словами. Что значит "AddHealth" в "Определение"? Ты, и другие опытные программисты различают add (увеличить) и push (добавить в конец), но многие новички пишут addObject (к тому же в csharp'e как я понял Add == push). Да, из контекста, новичок поймёт что к чему, но на это уйдёт время, а так как ты не говорил об этом, то мозг, скорее всего, пропустит диаграмму и... зря. Потому что, её рассмотрение / обсуждение сразу же объясняет паттерн. Перенеси правую часть диаграммы влево, когда появляется "Команда -- отдельный объект". При "Наполнять параметрами" покажи что-то вроде commands.Add(new AddHealthCommand(value)) или commands.Add(() => player->AddHealth(value)). И аналогично по другим пунктам.А далее просто усложняй примеры.
Сударь, у вас очепятка в описании. "сылка на гитхаб на проект"
Исправил, благодарю!)
Спасибо за видео. Очень познавательно, как всегда.
У меня вопрос есть, буду очень рад, если ответите. Есть, к примеру программа, которая сделана по шаблону MVC, к примеру, могу ли я её теперь использовать как блок, чтобы вставить в другую программку, сделанную на MVC ?? То есть это может выглядеть подобным образом: MVC1( MVC2, MVC3 (MVC4...)). Просто я не очень понимаю момент дальнейшего расширения. Если его и можно вставить подобным образом, то куда это вставляется, моё предположение что в модель, но может и по другому как-то по хитрому ??
MVC это ничто иное как слои. Слой данных + слой логики + слой вида. Если и переносить в другую программу то скорее типа такого M1+M2+M3/V1+V2+V3/C1+C2+C3.
Тут у меня в шаверме мввм но думаю идея понятна)
github.com/Haywaar/ShawarmaFight/tree/main/Assets/_Project/Develop/MVVM
@@sergeykazantsev1655 Спасибо за ответ, всё проанализирую.
Просто вот я подумал, если я сделаю, игровой автомат в стиле MVC, то как сделать казино в стиле MV(C, P, VM) из этих автоматов, к примеру. Казино же содержит List. А Slot - это уже реализованный автомат MVC.
Ну, тут как вам будет удобнее и яснее. Вообще главное разделить логику на три слоя. Для казино это особенно важно
Здраствуйте, ждать ли видос про патерн стратегию?
Пока делаю материалы по декоратору и mvvm на практике, так что наверное в ближайшие два месяца точно нет :/
4:10
> клиент внедрил в команду ссылку на ресивер
Это обязательно?
Допускается ли, что в классе конкретной команды в методе `execute` уже используется нужный `receiver`?
Т.е. на 13:19 ресивер не достается из входящих параметров конструктора, а просто прописан непосредственно в execute.
Согласно паттерну, да, обязательно.
Если в методе execute у вас есть входные параметры, КАЖДАЯ команда обязана их передать. А так как команды могут быть очень разнообразными - рано или поздно это вылезет бессмысленной передачей неиспользуемого параметра.
@@sergeykazantsev1655 Я имею ввиду, можно ли вообще не передавать ресивер в виде параметра
class MoveCommand extends Command {
x: number;
y: number;
constructor(x, y) {
this.x = x;
this.y = y;
}
execute() {
myCustomReceiver.move(this.x, this.y);
}
}
а в client вот так создаем команду:
new MoveCommand(2, 5);
это нормально для данного паттерна?
Я думаю можно, но кто тогда если не ресивер будет что-то делать?)
в вашем примере вот есть тот же MyCustomrReceiver, а как он туда попадёт?
Или вы его планируете с нуля создавать?
@@sergeykazantsev1655 myCustomReceiver будет импортирован в файл, где объявлен класс MoveCommand
@@sergeykazantsev1655 экземпляр myCustomReceiver просто импортируется в файл, где объявлен класс MoveCommand.
Как-то так)
Доброго времени суток.
Возник вопрос не по теме видео, но он терзает меня уже какое-то время.
У объекта класса есть возможность задать его приватные поля через Init метод или через свойства. Не значит ли это, что условный читер легко сможет накрутить себе бесконечный счет/здоровье/урон? Мб просто чего-то не понимаю в этой системе
Переформулировал запрос для гугла и наконец нашел ответ на свой вопрос.
Модификаторы доступа вообще ничего не решают с точки зрения информационной безопасности.
Видимо не правильно понимал формулировку о влиянии на объект извне.
Пора удариться в информационную безопасность :D
По моему опыту - читеры обычно взламывают данные, они копаются в кэше игры и получают доступ к тем же PlayerPrefs, что позволяет довольно легко всё взломать, либо по принципу artmoney - отслеживают значение переменной и в какой-то момент отсеивают все ненужные и изменяют её.
Есть способы защиты:
1) Хранить данные в сконвертированном хитром формате. Например у вашего игрока 100 монет, а в памяти вы храните всегда на 123 монеты больше. То есть у вас в памяти gold = 223, а на дисплее вы отображаете 223-123=100. Читер в памяти значение 100 найти не может и взломать тоже не может
2) Если есть соединение с сервером можно валидировать значения на клиенте и на сервере. Условно есть информация на сервере что у вас 100 монет а на клиенте внезапно стало 10000000 монет. Сервер явно поймёт что это фигня и поправит вам ваше значение
Отдельная история это спидхаки, если нет сервера - от них защищаться сложнее всего но это отдельная история
@@sergeykazantsev1655 вау. Не ожидал получить столь информативный ответ. Большое спасибо! Ты очень крут!
ошибка в названии
Исправлено, спасибо