Паттерн 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 Финал
  • เกม

ความคิดเห็น • 48

  • @fundevil3627
    @fundevil3627 2 หลายเดือนก่อน +4

    Ты святой. Если я когда-либо выйду в область игровой индустрии со своим детищем, я укажу тебя в титрах как того, кому я особенно благодарен за помощь

  • @fazleev
    @fazleev 3 หลายเดือนก่อน +5

    Найс! Отличное объяснение моего любимого паттерна!

  • @alexsorokin8373
    @alexsorokin8373 2 หลายเดือนก่อน +2

    Спасибо за шикарный контент!)

  • @user-ql9ye5mx6u
    @user-ql9ye5mx6u 2 หลายเดือนก่อน +2

    Хорооош)

  • @user-xy7hu1zu7v
    @user-xy7hu1zu7v 2 หลายเดือนก่อน +2

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

    • @sergeykazantsev1655
      @sergeykazantsev1655  2 หลายเดือนก่อน +1

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

    • @user-xy7hu1zu7v
      @user-xy7hu1zu7v 2 หลายเดือนก่อน

      @@sergeykazantsev1655 это очень радует)

  • @wepko
    @wepko 2 หลายเดือนก่อน +1

    Приятно наблюдать за развитием качественного канала. Думал что за броситься, но нет пока держаться.Очень сильно помогли с SOLID

  • @n11ckz64
    @n11ckz64 3 หลายเดือนก่อน +4

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

  • @maksimsazanovich6087
    @maksimsazanovich6087 3 หลายเดือนก่อน +2

    Спасибо большое!!!! Как раз летом буду делать головломку с программированием действий, ох как же меня выручили 😅

  • @danilazakharov4034
    @danilazakharov4034 3 หลายเดือนก่อน +3

    Несколько месяцев опасался этого паттерна и постоянно городил костыли как раз через enum'ы. А стоило всего лишь пару дней посидеть и разбираться, столько нервов потом сэкономил..
    Ролик классный, спасибо огромное)

  • @atlantatesla9348
    @atlantatesla9348 2 หลายเดือนก่อน +1

    Я фронтендер. Пыталась понять, так зачем же нужен этот паттерн. Глянула несколько видео, но именно благодаря твоему видео я поняла, что к чему. У тебя отличное объяснение и наглядный пример!
    Примеры из других видео словно слишком неестественные и использование паттерна там кажется неоправданным.
    Благодарю за видео! У тебя отлично получается!

  • @MrFtik
    @MrFtik 3 หลายเดือนก่อน +1

    Кайф, спасибо за видео!)

  • @darkhaunt9930
    @darkhaunt9930 3 หลายเดือนก่อน +1

    О, супер, спасибо за видос! Когда-то у меня дойдут руки до ртс, там этот паттерн распробую на полную)

  • @user-tj2kf1jg7q
    @user-tj2kf1jg7q หลายเดือนก่อน

    Top

  • @forcesoftheevil9252
    @forcesoftheevil9252 3 หลายเดือนก่อน +1

    Хорошо постарались. С головоломкой отличный пример вышел. Я в неё почему-то сыграть захотел

    • @sergeykazantsev1655
      @sergeykazantsev1655  3 หลายเดือนก่อน

      Надо только посложнее уровни сгенерить )

    • @MrKingofTiger
      @MrKingofTiger 3 หลายเดือนก่อน +1

      @@sergeykazantsev1655 и добавить лимит на количество ходов

  • @Vorono4ka
    @Vorono4ka 2 หลายเดือนก่อน

    повезло наткнуться на канал, надеюсь, вы наберёте побольше аудитории и люди станут писать код грамотнее!

  • @alexgolovin4069
    @alexgolovin4069 3 หลายเดือนก่อน +1

    спасибо!

  • @articice7342
    @articice7342 หลายเดือนก่อน

    Нравится практическая направленность канала. Но, пардон за моё брюзжание. Заметил грубую ошибку в подаче материала: если что-то написал, обязательно объясняй словами. Что значит "AddHealth" в "Определение"? Ты, и другие опытные программисты различают add (увеличить) и push (добавить в конец), но многие новички пишут addObject (к тому же в csharp'e как я понял Add == push). Да, из контекста, новичок поймёт что к чему, но на это уйдёт время, а так как ты не говорил об этом, то мозг, скорее всего, пропустит диаграмму и... зря. Потому что, её рассмотрение / обсуждение сразу же объясняет паттерн. Перенеси правую часть диаграммы влево, когда появляется "Команда -- отдельный объект". При "Наполнять параметрами" покажи что-то вроде commands.Add(new AddHealthCommand(value)) или commands.Add(() => player->AddHealth(value)). И аналогично по другим пунктам.А далее просто усложняй примеры.

  • @bornumental146
    @bornumental146 หลายเดือนก่อน

    Сударь, у вас очепятка в описании. "сылка на гитхаб на проект"

  • @user-cb7dk1ow3h
    @user-cb7dk1ow3h 3 หลายเดือนก่อน

  • @faraway4256
    @faraway4256 2 หลายเดือนก่อน +1

    Спасибо за видео. Очень познавательно, как всегда.
    У меня вопрос есть, буду очень рад, если ответите. Есть, к примеру программа, которая сделана по шаблону MVC, к примеру, могу ли я её теперь использовать как блок, чтобы вставить в другую программку, сделанную на MVC ?? То есть это может выглядеть подобным образом: MVC1( MVC2, MVC3 (MVC4...)). Просто я не очень понимаю момент дальнейшего расширения. Если его и можно вставить подобным образом, то куда это вставляется, моё предположение что в модель, но может и по другому как-то по хитрому ??

    • @sergeykazantsev1655
      @sergeykazantsev1655  2 หลายเดือนก่อน

      MVC это ничто иное как слои. Слой данных + слой логики + слой вида. Если и переносить в другую программу то скорее типа такого M1+M2+M3/V1+V2+V3/C1+C2+C3.
      Тут у меня в шаверме мввм но думаю идея понятна)
      github.com/Haywaar/ShawarmaFight/tree/main/Assets/_Project/Develop/MVVM

    • @faraway4256
      @faraway4256 2 หลายเดือนก่อน

      @@sergeykazantsev1655 Спасибо за ответ, всё проанализирую.
      Просто вот я подумал, если я сделаю, игровой автомат в стиле MVC, то как сделать казино в стиле MV(C, P, VM) из этих автоматов, к примеру. Казино же содержит List. А Slot - это уже реализованный автомат MVC.

    • @sergeykazantsev1655
      @sergeykazantsev1655  2 หลายเดือนก่อน

      Ну, тут как вам будет удобнее и яснее. Вообще главное разделить логику на три слоя. Для казино это особенно важно

  • @sutekinamirai1737
    @sutekinamirai1737 2 หลายเดือนก่อน

    Здраствуйте, ждать ли видос про патерн стратегию?

    • @sergeykazantsev1655
      @sergeykazantsev1655  2 หลายเดือนก่อน

      Пока делаю материалы по декоратору и mvvm на практике, так что наверное в ближайшие два месяца точно нет :/

  • @atlantatesla9348
    @atlantatesla9348 2 หลายเดือนก่อน +1

    4:10
    > клиент внедрил в команду ссылку на ресивер
    Это обязательно?
    Допускается ли, что в классе конкретной команды в методе `execute` уже используется нужный `receiver`?
    Т.е. на 13:19 ресивер не достается из входящих параметров конструктора, а просто прописан непосредственно в execute.

    • @sergeykazantsev1655
      @sergeykazantsev1655  2 หลายเดือนก่อน +1

      Согласно паттерну, да, обязательно.
      Если в методе execute у вас есть входные параметры, КАЖДАЯ команда обязана их передать. А так как команды могут быть очень разнообразными - рано или поздно это вылезет бессмысленной передачей неиспользуемого параметра.

    • @atlantatesla9348
      @atlantatesla9348 2 หลายเดือนก่อน +1

      ​@@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);
      это нормально для данного паттерна?

    • @sergeykazantsev1655
      @sergeykazantsev1655  2 หลายเดือนก่อน +1

      Я думаю можно, но кто тогда если не ресивер будет что-то делать?)
      в вашем примере вот есть тот же MyCustomrReceiver, а как он туда попадёт?
      Или вы его планируете с нуля создавать?

    • @atlantatesla9348
      @atlantatesla9348 2 หลายเดือนก่อน

      @@sergeykazantsev1655 myCustomReceiver будет импортирован в файл, где объявлен класс MoveCommand

    • @atlantatesla9348
      @atlantatesla9348 2 หลายเดือนก่อน

      ​@@sergeykazantsev1655 экземпляр myCustomReceiver просто импортируется в файл, где объявлен класс MoveCommand.
      Как-то так)

  • @beziboba9458
    @beziboba9458 หลายเดือนก่อน

    Доброго времени суток.
    Возник вопрос не по теме видео, но он терзает меня уже какое-то время.
    У объекта класса есть возможность задать его приватные поля через Init метод или через свойства. Не значит ли это, что условный читер легко сможет накрутить себе бесконечный счет/здоровье/урон? Мб просто чего-то не понимаю в этой системе

    • @beziboba9458
      @beziboba9458 หลายเดือนก่อน

      Переформулировал запрос для гугла и наконец нашел ответ на свой вопрос.
      Модификаторы доступа вообще ничего не решают с точки зрения информационной безопасности.
      Видимо не правильно понимал формулировку о влиянии на объект извне.
      Пора удариться в информационную безопасность :D

    • @sergeykazantsev1655
      @sergeykazantsev1655  หลายเดือนก่อน

      По моему опыту - читеры обычно взламывают данные, они копаются в кэше игры и получают доступ к тем же PlayerPrefs, что позволяет довольно легко всё взломать, либо по принципу artmoney - отслеживают значение переменной и в какой-то момент отсеивают все ненужные и изменяют её.
      Есть способы защиты:
      1) Хранить данные в сконвертированном хитром формате. Например у вашего игрока 100 монет, а в памяти вы храните всегда на 123 монеты больше. То есть у вас в памяти gold = 223, а на дисплее вы отображаете 223-123=100. Читер в памяти значение 100 найти не может и взломать тоже не может
      2) Если есть соединение с сервером можно валидировать значения на клиенте и на сервере. Условно есть информация на сервере что у вас 100 монет а на клиенте внезапно стало 10000000 монет. Сервер явно поймёт что это фигня и поправит вам ваше значение
      Отдельная история это спидхаки, если нет сервера - от них защищаться сложнее всего но это отдельная история

    • @beziboba9458
      @beziboba9458 หลายเดือนก่อน

      @@sergeykazantsev1655 вау. Не ожидал получить столь информативный ответ. Большое спасибо! Ты очень крут!

  • @swornake652
    @swornake652 3 หลายเดือนก่อน

    ошибка в названии

  • @bornumental146
    @bornumental146 3 หลายเดือนก่อน