Паттерн Command, Команда, Unity, C#, gamedev

Поделиться
HTML-код
  • Опубликовано: 17 ноя 2024

Комментарии • 58

  • @fundevil3627
    @fundevil3627 7 месяцев назад +7

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

  • @danilazakharov4034
    @danilazakharov4034 7 месяцев назад +3

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

  • @THE666CODERED
    @THE666CODERED Месяц назад

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

  • @n11ckz64
    @n11ckz64 7 месяцев назад +6

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

  • @fazleev
    @fazleev 7 месяцев назад +5

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

  • @maksimsazanovich6087
    @maksimsazanovich6087 7 месяцев назад +2

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

  • @atlantatesla9348
    @atlantatesla9348 6 месяцев назад +1

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

  • @darkhaunt9930
    @darkhaunt9930 7 месяцев назад +1

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

  • @forcesoftheevil9252
    @forcesoftheevil9252 7 месяцев назад +1

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

    • @sergeykazantsev1655
      @sergeykazantsev1655  7 месяцев назад

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

    • @MrKingofTiger
      @MrKingofTiger 7 месяцев назад +1

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

  • @DimaKrokodilov
    @DimaKrokodilov 7 месяцев назад +2

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

    • @sergeykazantsev1655
      @sergeykazantsev1655  7 месяцев назад +1

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

    • @DimaKrokodilov
      @DimaKrokodilov 7 месяцев назад

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

  • @andreyromanov680
    @andreyromanov680 Месяц назад +1

    как всегда лучший

  • @wepko
    @wepko 7 месяцев назад +1

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

  • @alexsorokin8373
    @alexsorokin8373 7 месяцев назад +2

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

  • @Vorono4ka
    @Vorono4ka 7 месяцев назад

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

  • @Slagemer1
    @Slagemer1 2 месяца назад

    Comfor minus - в голос))

  • @MrFtik
    @MrFtik 7 месяцев назад +1

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

  • @Хилючуваки
    @Хилючуваки 2 месяца назад

    Балдеж

  • @MoiseevMaxim
    @MoiseevMaxim Месяц назад

    Супер крутые гайды, по паттернам!
    У меня вопрос не большой:
    Клиентом же не обязательно должна быть условная фабрика.
    Если, например, у меня есть какое-то объект, на который другие системы(классы, объекты) должны повлиять. Я могу в каждой другой системе создавать такую команду?
    Например, если в этой игре была, какая-то сущность, которая тоже создавалась и добавляла свои ходы? Или эти системы просто будут содержать сслыку на фабрику все команд?

    • @sergeykazantsev1655
      @sergeykazantsev1655  Месяц назад

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

  • @issatay8876
    @issatay8876 4 месяца назад

    круто разжевал

  • @faraway4256
    @faraway4256 7 месяцев назад +1

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

    • @sergeykazantsev1655
      @sergeykazantsev1655  7 месяцев назад

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

    • @faraway4256
      @faraway4256 7 месяцев назад

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

    • @sergeykazantsev1655
      @sergeykazantsev1655  7 месяцев назад

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

  • @sutekinamirai1737
    @sutekinamirai1737 6 месяцев назад

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

    • @sergeykazantsev1655
      @sergeykazantsev1655  6 месяцев назад

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

  • @ИванДовлатов-х3ж
    @ИванДовлатов-х3ж 7 месяцев назад +2

    Хорооош)

  • @atlantatesla9348
    @atlantatesla9348 6 месяцев назад +1

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

    • @sergeykazantsev1655
      @sergeykazantsev1655  6 месяцев назад +1

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

    • @atlantatesla9348
      @atlantatesla9348 6 месяцев назад +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  6 месяцев назад +1

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

    • @atlantatesla9348
      @atlantatesla9348 6 месяцев назад

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

    • @atlantatesla9348
      @atlantatesla9348 6 месяцев назад

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

  • @alexgolovin4069
    @alexgolovin4069 7 месяцев назад +1

    спасибо!

  • @beziboba9458
    @beziboba9458 5 месяцев назад

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

    • @beziboba9458
      @beziboba9458 5 месяцев назад

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

    • @sergeykazantsev1655
      @sergeykazantsev1655  5 месяцев назад

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

    • @beziboba9458
      @beziboba9458 5 месяцев назад

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

  • @articice7342
    @articice7342 6 месяцев назад

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

  • @TayProlay
    @TayProlay 3 месяца назад

    Это ни капли не легкий паттерн, если сравнивать с другими.

  • @bornumental146
    @bornumental146 6 месяцев назад

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

  • @bornumental146
    @bornumental146 7 месяцев назад

  • @РусланИсабеков-у1н
    @РусланИсабеков-у1н 5 месяцев назад

    Top

  • @Mepp3ku
    @Mepp3ku Месяц назад

    А еще инвокер иногда дает кривой санстрайк)

  • @swornake652
    @swornake652 7 месяцев назад

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