background top icon
background center wave icon
background filled rhombus icon
background two lines icon
background stroke rhombus icon

Скачать "The 6 Design Patterns game devs need?"

input logo icon
Обложка аудиозаписи
Подождите немного, мы готовим ссылки для удобного просмотра видео без рекламы и его скачивания.
console placeholder icon
Теги видео
|

Теги видео

design patterns
game dev
unity 3d
game programming
game programming patterns
head first design patterns
programming
design patterns explained
design patterns tutorial
unity
unity3d
singleton
factory
command pattern
command
game undo
monobehaviour
monosingleton
game development
design patterns made easy
brackeys
beginner
gamedev
Flyweight Pattern
state pattern
observer pattern
component pattern
unity devlog
unity tips
unity tutorial
finite state machine
Субтитры
|

Субтитры

subtitles menu arrow
  • enАнглийский
Скачать
00:00:00
эй, как дела, я Джейсон, и сегодня ты
00:00:02
узнаешь кое-что, что
00:00:04
действительно необходимо понять всем разработчикам игр,
00:00:05
и это, конечно же,
00:00:08
шаблоны проектирования, которые вы, вероятно, видели в
00:00:09
заголовке ниже, если вы не знаете,
00:00:11
что такое шаблоны проектирования. это на самом деле
00:00:13
идеально, потому что они действительно
00:00:14
важны, и мы собираемся дать хорошее
00:00:16
представление о том, что они собой представляют, как вы
00:00:18
их будете использовать и как они
00:00:19
сделают вашу карьеру в разработке игр или
00:00:21
опыт разработки игр в целом
00:00:23
намного лучше,
00:00:25
вы вы, вероятно, уже используете некоторые из
00:00:27
этих шаблонов и даже не знаете об этом, на
00:00:28
самом деле один из них даже не обязательно
00:00:30
связан с кодом и может вызывать некоторые
00:00:32
реальные проблемы с памятью, если вы уже являетесь
00:00:34
экспертом и знаете все
00:00:37
шаблоны проектирования, тогда, эй, просто следуйте инструкциям и
00:00:38
дайте мне знать, если вы увидите какие-либо
00:00:40
недостающие, если вы думаете о шаблоне проектирования,
00:00:42
который, по вашему мнению, действительно должен понимать каждый разработчик игр, которого
00:00:45
здесь нет, оставьте комментарий ниже и
00:00:47
давайте просто добавим это там, и мы
00:00:48
обсудим это, и, возможно, мы включим это в
00:00:50
будущее видео. Теперь я хочу
00:00:52
хорошо разобраться, прежде чем приступить к работе. Я хочу поделиться
00:00:54
книгой по шаблонам программирования игр,
00:00:56
потому что это просто отличный ресурс, который
00:00:59
доступен бесплатно по шаблонам программирования игр.
00:01:01
спокойно, я думаю, просто поищите
00:01:03
шаблоны программирования игр, и вы
00:01:04
это увидите. Я также помещу ссылку на книгу
00:01:07
ниже, может быть, я воспользуюсь партнерской
00:01:09
ссылкой для Amazon или чего-то еще, и
00:01:11
последнее, что мы начнем, это
00:01:13
просто, пожалуйста, если вы интересуетесь
00:01:15
шаблонами проектирования или разработкой игр в
00:01:17
целом, обязательно поделитесь этим
00:01:19
видео или, по крайней мере, нажмите кнопку «Нравится»,
00:01:21
это действительно помогает увеличить количество просмотров, все
00:01:24
в восторге, и каждый код в конечном итоге становится
00:01:26
лучше, так что давайте началось с
00:01:28
единственного наиболее часто используемого шаблона, а именно
00:01:30
шаблона Singleton. Это шаблон, с которым
00:01:32
большинство из нас, разработчиков, сталкивается довольно
00:01:35
рано. Этот шаблон, как описано в
00:01:38
Википедии, представляет собой шаблон, в котором или который
00:01:41
ограничивает создание экземпляра класса
00:01:43
одним экземпляром. и в этом
00:01:46
вся идея слова синглтон.
00:01:48
Теперь вы услышите много
00:01:50
плохого о синглтонах - очень
00:01:52
легко неправильно использовать их как некое глобальное
00:01:55
хранилище данных, которое многие вещи читают
00:01:57
и записывают в вас и вызывают проблемы,
00:01:58
но в целом не стоит просто списывать со счетов отдельные
00:02:01
вещи и думать, что они плохие, что
00:02:02
вы не можете их использовать, вы найдете
00:02:04
синглтоны почти в каждом проекте, и
00:02:06
вы, вероятно, захотите использовать их довольно
00:02:08
часто, так как же выглядит синглтон например,
00:02:10
давайте быстро взглянем на некоторый код. У
00:02:12
меня есть этот объект ScoreText, и
00:02:15
в нем нигде нет слова синглтон, у него
00:02:17
нет никакой реальной
00:02:18
ссылки на синглтон, как
00:02:20
вы можете сказать, что это то, что это такое
00:02:22
хотя у меня есть общедоступный статический
00:02:26
экземпляр Scoretext, и теперь эта часть экземпляра
00:02:28
может называться как-то по-другому в
00:02:30
вашем синглтоне, это может быть в паре, или что-то в этом роде, или что-то в этом роде, или что-то в этом роде, или что-то в этом роде, или
00:02:32
что-то в этом роде,
00:02:35
это довольно распространенное слово
00:02:36
для этого, но общедоступный статический версия
00:02:39
этого класса или общедоступный статический экземпляр
00:02:42
этого класса здесь как бы подсказывает мне, что
00:02:44
это, вероятно, одиночный экземпляр, который уже можно
00:02:45
настроить, экземпляр
00:02:47
определенно отдает его, поэтому то, что здесь происходит, находится
00:02:49
в состоянии бодрствования, мы просто устанавливаем экземпляр на
00:02:52
этот, теперь наш синглтон на
00:02:54
самом деле здесь не соблюдается все это
00:02:56
ограничение, оно не уничтожает какие-либо
00:02:58
существующие, мы могли бы написать синглтон,
00:03:00
который делает это, чтобы мы могли сказать «эй», если
00:03:02
экземпляр не равен нулю, а затем уничтожить
00:03:05
новую вещь, которая создается, или, возможно,
00:03:07
уничтожить старую, а затем установить
00:03:09
экземпляр на новый, но здесь мы просто
00:03:11
переопределяем его, и нам все равно,
00:03:13
потому что сейчас это не окажет никакого
00:03:14
влияния, почему мы делаем это хорошо,
00:03:17
чтобы мы могли сделать что-то вроде нашего
00:03:18
звонка по оценке рекламы, давайте посмотрим в этом
00:03:20
внутреннем проекте посмотрите, как он выглядит и
00:03:23
как его можно использовать, поэтому вот очень
00:03:25
простой синглтон, настроенный с моей очень
00:03:28
скучной игрой с кликером по пузырям. Я могу нажать «
00:03:30
Играть», нажать на пузырь и посмотреть, как
00:03:33
они лопаются, и посмотреть на количество пузырьков.
00:03:35
поднимитесь сейчас,
00:03:37
здесь используется синглтон, как вы, вероятно, можете видеть
00:03:39
по моему выбору, это текст подсчета кликов,
00:03:41
который сейчас показывает значение
00:03:44
семь, и он увеличивается каждый раз, когда я
00:03:46
нажимаю или щелкаю значение атома пузырька,
00:03:48
щелкаю пузырь Итак, как эта работа,
00:03:51
давайте откроем сценарий пузыря и
00:03:53
посмотрим, поэтому, если мы посмотрим сюда, наведя курсор
00:03:55
мыши, что на самом деле происходит,
00:03:58
мы ждем щелчка, и когда мы нажимаем
00:04:00
на что-то, что срабатывает, мы вызываем
00:04:02
наш набор аниматоров и триггер для установки
00:04:04
всплывающего окна, и это просто воспроизведение этой маленькой
00:04:06
всплывающей анимации. 0% связано с нашим
00:04:08
синглтоном. Наш синглтон находится прямо здесь, в
00:04:10
строке 14, где мы вызываем текстовый
00:04:13
экземпляр оценки, добавляет 4 и передает 1, поэтому
00:04:17
мы просто добавляем один укажите на
00:04:19
текст партитуры, так что теперь нашему всплывающему пузырю не
00:04:21
обязательно нужна ссылка на этот
00:04:23
текст партитуры.
00:04:24
Конечно, есть и другие способы
00:04:25
сделать это, мы могли бы
00:04:27
назначить здесь ссылку, куда мы, возможно, добавим
00:04:29
текст партитуры и перетащим ее. он там, но мы не
00:04:31
хотим перетаскивать его при каждом всплывающем
00:04:33
пузыре, мы можем сделать что-то вроде
00:04:35
поиска объекта типа здесь, но мы, вероятно,
00:04:37
не хотим сканировать объект каждый
00:04:40
раз, когда мы просто хотим сохранить
00:04:41
ссылку к этому единственному, потому что
00:04:42
вокруг есть только один, так что здесь
00:04:44
синглтон просто работает сейчас как проекты
00:04:47
Крог и отдельные вещи могут стать немного
00:04:48
громоздкими и запутанными, но в большинстве случаев
00:04:51
в простых ситуациях синглтон
00:04:53
действительно просто решит многие из этих
00:04:54
проблем, давайте перейдем Перейдем к номеру два:
00:04:57
хотя это шаблон наблюдателя,
00:04:59
шаблон наблюдателя — это еще один способ
00:05:02
реагирования на события или вещи, которые
00:05:05
происходят в игре, которые мы можем или
00:05:07
не можем захотеть напрямую связать с нашей игрой
00:05:10
сейчас, что может показаться немного странным,
00:05:11
может не иметь значения много смысла, поэтому давайте
00:05:13
посмотрим на пример: скажем, у меня
00:05:15
есть скучный кликер по пузырям, и я
00:05:18
хочу добавить способ, позволяющий воспроизводить
00:05:22
звук всякий раз, когда я нажимаю на пузырь, но я
00:05:24
не хочу, чтобы это было типа
00:05:26
здесь миллион источников звука. Я не хочу добавлять
00:05:27
источник звука к каждому из
00:05:29
этих объектов, потому что я знаю, типа, эй, у меня
00:05:31
будет своего рода источник звука,
00:05:32
может быть, он будет перегружаться и воспроизводиться слишком
00:05:34
много, и, может быть, я хочу добавьте какой-нибудь дополнительный элемент
00:05:35
управления или что-то в этом роде, чтобы у вас была
00:05:37
возможность включать и выключать
00:05:38
воспроизводимые звуки или управлять ими, так как бы
00:05:42
я это сделал? Я бы настроил это
00:05:43
с помощью шаблона наблюдателя, и
00:05:45
мы собираемся давайте посмотрим
00:05:48
здесь второй пример, и я бы создал что-то
00:05:50
вроде этого источник звука со своим
00:05:52
собственным сценарием, поэтому за пределами этого
00:05:54
источника звука эта сцена изменилась 0 не
00:05:57
нужно было входить не нужно было
00:05:58
ничего менять в пузырьках вам нужно сделать
00:06:00
что-нибудь, но мы услышим звук,
00:06:01
давайте попробуем, а затем посмотрим, что и
00:06:03
как это на самом деле подключено, поэтому я
00:06:06
нахожу несколько пузырьков и щелкаю, говоря, отключите,
00:06:13
что вдруг он замолчал, ок, и как
00:06:16
это работает сейчас, этот скрипт может это выглядит
00:06:18
немного странно для любого, кто
00:06:19
действительно новичок в программировании, но на
00:06:21
самом деле здесь происходит то, что у нас есть
00:06:23
метод пробуждения, который запускается
00:06:25
сразу же после
00:06:27
создания объекта, мы берем наш источник звука,
00:06:29
который находится на этом объекте, и кэшируем его, поэтому
00:06:31
мы просто берем этот источник звука здесь,
00:06:33
кэшируем его в переменную, чтобы мы могли использовать
00:06:35
его позже, а затем при включении, поэтому, когда
00:06:37
мы размещаем
00:06:38
объект, мы регистрируемся для события,
00:06:41
а событие - это то, что мы можем
00:06:43
прослушивать из нескольких мест и просто
00:06:45
получать уведомления, когда что-то происходит, поэтому
00:06:48
здесь мы регистрируемся на событие,
00:06:49
вызываемое при появлении любого пузырька, и мы
00:06:52
регистрируем его с помощью этого плюс равно, и
00:06:54
это говорит о том, что бы это ни случилось, добавьте этот
00:06:57
метод к тому, что вы делаете, чтобы воспроизвести
00:06:59
поп-аудио. это произойдет, и если мы
00:07:01
посмотрим на воспроизведение поп-аудио, воспроизведение поп-аудио
00:07:04
на самом деле просто воспроизводит источник звука,
00:07:05
если вы не знакомы с этим
00:07:07
синтаксисом, это всего лишь
00:07:09
синтаксис метода тела выражения, и он работает для методов,
00:07:12
где у нас есть только одна вещь это
00:07:14
происходит, поэтому я также мог бы
00:07:16
написать это так, но я хотел
00:07:17
показать, как это обычно пишется, когда у меня есть
00:07:19
одна вещь для метода, последнее,
00:07:21
что у нас здесь есть, - это не
00:07:22
отключенный, который выполняет регистрацию B и
00:07:25
удаляет это сейчас причина, по которой мы
00:07:27
это делаем, заключается в том, что когда мы регистрируемся на событие, если
00:07:29
мы не отменяем регистрацию на событие, оно
00:07:32
никогда не исчезает, поэтому технически, если бы у меня
00:07:34
этого не было, и я отключил свой
00:07:36
объект и включил его, я бы получил два
00:07:39
вызова к этому воспроизводить поп-аудио, и я
00:07:41
действительно хочу просто избежать того, что мы
00:07:43
обычно хотим отменить регистрацию событий
00:07:45
всякий раз, когда мы регистрируемся для них, и
00:07:46
система событий, по сути, является
00:07:48
реализацией или структурой, которую мы
00:07:51
можем использовать для создания шаблона наблюдателя, теперь
00:07:53
давайте посмотрим, что как выглядит это событие
00:07:55
и как я на самом деле создал
00:07:56
код, чтобы подключить его и заставить все это
00:07:58
работать, поэтому, если я перейду сюда, я могу нажать f12 и
00:08:02
прямо здесь вижу, что у меня есть это
00:08:03
общедоступное статическое событие для любого
00:08:06
всплывающего пузыря, и я Я просто удалю
00:08:08
эти два оператора регенерации, потому что
00:08:11
чувствую, что они могут запутать
00:08:13
вещи, все, что действительно важно, это
00:08:15
это событие, и обычно место, куда я
00:08:18
бы поместил такое событие, находится прямо вверху,
00:08:20
поэтому я собираюсь удерживайте Ctrl, Alt
00:08:21
и сдвиг, выделив все это
00:08:23
пару раз на стрелке вверх, и просто переместите его
00:08:25
вверх, потому что именно здесь
00:08:27
мне нравится, чтобы мои события сейчас были, как
00:08:29
это работает, на самом деле здесь, в строке 18,
00:08:32
в строке 19 Я думаю,
00:08:35
давайте удалим 18, теперь это строка 18, у нас
00:08:37
это есть при любом лопнувшем пузыре, а затем
00:08:40
вопросительный знак, вызывающий то, что это
00:08:43
на самом деле делает, говорит: эй, это
00:08:45
событие лопнувшего пузыря из-за этого
00:08:47
ключевого слова события здесь, и
00:08:49
если что-то зарегистрировано для этого, если
00:08:52
что-то имеет +, равное, а затем
00:08:54
какой-то метод затем вызывает это, и это то,
00:08:57
что это вызывает, теперь
00:08:59
здесь стоит вопросительный знак, просто говоря, делайте это только в том случае, если
00:09:01
что-то зарегистрировано, если у меня нет
00:09:03
вопросительного знака, и я удаляю что
00:09:04
тогда это даст мне исключение, и
00:09:06
на самом деле мой редактор кода, который является автором,
00:09:08
и многие другие редакторы кода дают мне
00:09:11
небольшое предупреждение о том, что оно может быть нулевым
00:09:12
и может привести меня туда, поэтому мне нужно
00:09:13
поставить там вопросительный знак и на
00:09:15
самом деле это основа шаблона наблюдателя,
00:09:17
позволяющая регистрироваться и получать уведомления
00:09:19
о том, когда что-то происходит, а затем получать
00:09:21
уведомления об этих событиях.
00:09:23
Также стоит отметить, что мы можем передавать
00:09:25
аргументы в эти события или эти
00:09:27
действия, чтобы я мог иметь действие, которое
00:09:29
возможно, передает целое число, и тогда мой
00:09:32
при любом всплывающем пузыре должен будет принять
00:09:34
целое число в своем методе, который
00:09:35
регистрировался для него, например, если бы я вошел
00:09:37
сюда, это должно было бы принять целочисленный
00:09:39
параметр, и это могло бы быть похоже на
00:09:42
объем или что-то в этом роде еще, что мы, возможно,
00:09:44
обычно регистрируем, например, текстовое
00:09:46
значение для счета или что-то еще,
00:09:48
что передается, но я
00:09:50
хотел убедиться, что вы понимаете,
00:09:51
что это тоже возможно.
00:09:53
Следующий шаблон, о котором я хочу поговорить,
00:09:55
действительно зависит от игры. некоторые типы игр используют
00:09:57
его повсюду, а некоторые типы игр
00:09:59
никогда его не используют, и это шаблон команд,
00:10:01
и я хочу очень быстро
00:10:03
продемонстрировать, как выглядит
00:10:05
использование шаблона команд, поэтому здесь у меня есть
00:10:06
настройка бота с простой агент навигационной сетки,
00:10:09
и вы можете щелкнуть, и он переместится туда,
00:10:11
куда я щелкну сейчас, если я щелкну здесь, и
00:10:13
я щелкну здесь, и я щелкну здесь, и я
00:10:14
щелкну здесь, вы видите, что на
00:10:16
самом деле он никогда не заканчивает ходить в те места,
00:10:17
он просто пойдет до самого
00:10:19
последнего места, я нажал квест, потому что все, что
00:10:21
я делаю, это устанавливаю пункт назначения в агенте навигационной сетки,
00:10:24
и если вы новичок в навигационных сетках,
00:10:25
это действительно все, что вам нужно сделать, чтобы сделать
00:10:27
ход, но если мы хотим поставить их в очередь
00:10:29
местоположения и заставить их перемещаться в разные
00:10:31
позиции. Шаблон команды - один из отличных
00:10:33
способов сделать это. Теперь давайте посмотрим,
00:10:35
как выглядит эта реализация, поэтому у
00:10:37
меня здесь есть мой капсульный персонаж, у которого
00:10:39
снова есть этот агент навигационной сетки и
00:10:43
команда, управляемая сценарий бота, давайте
00:10:45
откроем его, и если вы посмотрите прямо здесь,
00:10:47
вот та часть, где я на самом деле
00:10:49
устанавливаю пункт назначения, и вот
00:10:51
почему он капризничает, отключив эту
00:10:53
строку кода и включив эту строку кода
00:10:56
прямо здесь, удалив запятую в на самом деле
00:10:58
я просто удалю строку 41, она будет
00:11:00
работать так, как я хочу, я
00:11:02
покажу это, и
00:11:03
я собираюсь показать, как на
00:11:04
самом деле работают команды и как это
00:11:05
достигается, о чем я также хочу просто поговорить,
00:11:08
пока Я прохожу через это и
00:11:09
загружаю это, что команды
00:11:11
используются для самых разных вещей, которые
00:11:13
действительно распространены в играх, потому что это такие вещи,
00:11:15
как RTS, где у нас есть команды, которые
00:11:18
мы даем вам, и это
00:11:19
похоже на то, что мы Я делаю здесь онлайн-игры,
00:11:22
которые в некоторой степени асинхронны. Любая игра, в
00:11:24
которой вы отправляете запрос на
00:11:26
сервер, а затем ждете, как вы знаете,
00:11:29
я могу придумать сотни разных
00:11:31
игр, каждая почти каждая асинхронная мобильная игра
00:11:33
делает что-то вроде
00:11:35
шаблона команд, в котором мы отправляем
00:11:37
команду и получаем какой-то ответ,
00:11:38
так что давайте посмотрим на это сейчас. Я
00:11:41
могу щелкнуть и поставить в очередь другую кучу
00:11:43
разных мест, и вы
00:11:44
сможете увидеть, где я нажимаю он
00:11:46
просто обходит эти места
00:11:48
в том порядке, в котором я нажимал на них, теперь
00:11:50
давайте углубимся в то, как на самом деле работает этот код,
00:11:52
как мы настраиваем систему команд.
00:11:54
Я также хочу отметить, что мы можем делать и
00:11:56
другие вещи, которые нам не нужны
00:11:57
обязательно просто делайте движения, так что давайте посмотрим, что
00:12:00
наша команда контролируется здесь,
00:12:02
и, как я уже упоминал, у него есть агент навигационной сетки,
00:12:04
и в нашем начале мы фактически кэшируем
00:12:06
этот хитрый агент, у нас также есть
00:12:08
очередь команд, теперь команда - это класс,
00:12:11
который мы' Я написал, вы можете увидеть это прямо
00:12:12
здесь, мы пойдем взглянуть на это через
00:12:13
секунду, а Q — это просто список или
00:12:16
набор вещей, по порядку это просто
00:12:18
очередь, которую вы увидите в продуктовом
00:12:20
магазине или где-нибудь еще, очередь вещей,
00:12:21
где первый вход - первый
00:12:24
выход, а затем, наконец, у нас есть команда,
00:12:26
которая является нашей текущей командой,
00:12:28
которую мы просто сохраняем и знаем, над какой командой
00:12:30
мы сейчас работаем в нашем
00:12:32
методе обновления, мы прослушиваем команды, а затем
00:12:34
мы обрабатываем команды не так уж много, давайте
00:12:36
сначала посмотрим на прослушивание команд,
00:12:38
поэтому слушайте команды, просто проверьте,
00:12:40
нажимаем ли мы кнопку мыши,
00:12:42
что является щелчком левой кнопкой мыши, это то, что 0,
00:12:44
мы делаем приведение лучей с помощью нашей камеры, которая
00:12:47
главный экран указывает на Рэя, потому что
00:12:50
демо-версия, поэтому, если нас не волнует использование
00:12:51
домена камеры и луча указателя экрана, он
00:12:53
даст нам луч прямо из
00:12:55
камеры и или использует ту основную камеру,
00:12:57
которая помечена тегом, последнее, что мы делаем, это
00:13:00
приведение лучей и если мы нажимаем что-то, мы просто
00:13:03
подаем команду для перемещения в эту
00:13:05
точку и передаем агента, поэтому мы
00:13:07
создаем здесь новую команду перемещения, ну,
00:13:10
факт, давайте просто команда далекого перемещения равна
00:13:13
этому, а затем мы подаем это
00:13:16
просто чтобы сделать это действительно очевидным, поэтому мы
00:13:18
добавляем в эту команду теперь команды
00:13:20
имеют тип команды, а команда перемещения является
00:13:23
ее подклассом, поэтому она пойдет прямо
00:13:25
туда, как вызов этой команды, или я называю
00:13:27
ее командой перемещения, и она будет работают
00:13:29
точно так же, теперь давайте
00:13:32
посмотрим на команды процесса, поэтому после того, как мы
00:13:35
прослушаем команды, мы их обработаем,
00:13:37
давайте посмотрим, как выглядит их обработка,
00:13:38
а затем посмотрим, как
00:13:40
на самом деле выглядит команда, поэтому обработка конечности
00:13:42
довольно проста, если наша текущая команда
00:13:44
не равно нулю, и наша текущая команда
00:13:46
не завершена, мы абсолютно ничего не делаем, поэтому
00:13:49
просто ждем, пока эта текущая команда
00:13:50
завершится. Существует много разных
00:13:52
способов обработки завершенных команд.
00:13:54
Мы упростили задачу с помощью этого
00:13:55
следующего шага, который мы сделаем. do - это проверить, есть
00:13:57
ли какие-либо команды, готовые
00:13:59
к DQ, поэтому, если команд не осталось,
00:14:02
просто возвращаемся, потому что все еще
00:14:04
нечего обрабатывать. Последнее, что мы делаем, это
00:14:07
d/q текущую команду или следующую
00:14:09
команду, и это один из методов
00:14:11
в очереди, который просто получает следующий
00:14:13
в очереди, а затем мы вызываем выполнение, все
00:14:16
в порядке, это все, что есть у этого
00:14:18
процессора, так как же на
00:14:19
самом деле выглядит команда, давайте нажмем f12, посмотрим
00:14:21
на выполнение, мне нравится, что это абстрактный
00:14:24
класс с абсолютно нулевой
00:14:26
реализацией, у нас есть абстрактный
00:14:29
метод void, называемый выполнением, и абстрактный
00:14:31
бык с именем Finish, и абстрактный
00:14:34
класс здесь и сейчас, если вы не знакомы
00:14:36
с абстрактными классами, не волнуйтесь, вы
00:14:38
узнаете о них по ходу дела, и я
00:14:39
на них есть несколько видео, но по сути это
00:14:41
класс, экземпляр которого не может быть создан, который
00:14:43
должен быть унаследован,
00:14:45
это похоже на моноповедение, вы не можете
00:14:47
просто добавить само моноповедение, вам
00:14:50
нужен новый класс, который наследует
00:14:52
моноповедение, для этих команд то же самое
00:14:54
Итак, давайте посмотрим на
00:14:55
команду, которую мы на самом деле используем, которая
00:14:57
является нашей командой перемещения, и я оставил ее
00:14:58
в этом файле, мне, вероятно, следует разместить ее
00:15:00
в отдельном файле класса. Я хотел отметить
00:15:03
это, потому что это немного некрасиво, но это
00:15:05
хорошо, что мы здесь,
00:15:06
поэтому наша команда перемещения, поскольку это не
00:15:08
моноповедение, может находиться прямо здесь, и
00:15:10
она принимает пару параметров для своего
00:15:12
конструктора, поэтому конструктор здесь
00:15:14
принимает пункт назначения, который является просто
00:15:16
вектором 3, и агентом, который мы
00:15:18
передавали, когда мы вызываем эту новую
00:15:20
команду перемещения прямо здесь, когда мы
00:15:23
ее создали, мы передаем точку и агента, ок,
00:15:26
давайте просто прокрутим еще немного вниз
00:15:28
и посмотрим еще раз,
00:15:29
следующее, что мы делаем, это выполняем,
00:15:32
что устанавливает пункт назначения в этот
00:15:34
пункт назначения и затем мы закончили,
00:15:36
который просто проверяет,
00:15:38
меньше ли оставшееся расстояние
00:15:40
первой точки, очень-очень просто, так что вы, вероятно, можете
00:15:42
представить, как этот код будет выглядеть за пределами
00:15:44
шаблона команды, и вам может быть
00:15:46
интересно, зачем проходить этот
00:15:48
процесс сделать это шаблоном, если я
00:15:50
просто ставлю движения в очередь. Самое приятное
00:15:52
в этом то, что как только вы выполнили такой
00:15:54
шаблон команды, мы можем начать
00:15:56
реализовывать дальнейшие расширения, такие как
00:15:58
отмена, чтобы мы могли отменить действие из наших
00:16:01
команд, которые мы можем добавьте различные типы
00:16:03
действий, чтобы он перемещался на
00:16:04
определенную позицию и, возможно, охранял, или начинал
00:16:07
копать, или подбирать ресурс, или сражаться,
00:16:10
или что-то еще, что мы хотели
00:16:11
сделать, мы можем начать смешивать и сопоставлять
00:16:13
их и начинать отдавать команды и
00:16:15
затем получите гораздо больше контроля над этим,
00:16:17
очень легко построить аналогичные системы, которые
00:16:19
не используют эти шаблоны, или как бы
00:16:21
реализовать эти шаблоны наполовину,
00:16:24
очень конкретным способом для очень
00:16:26
конкретной вещи, но просто помня, что
00:16:28
эти шаблоны существуют, поэтому мы можем
00:16:29
повторно использовать их таким образом, я думаю, это
00:16:31
чрезвычайно ценно, давайте перейдем к
00:16:32
следующему шаблону, и это
00:16:34
шаблон компонента, и если вы
00:16:36
еще не знаете об этом, вы на самом деле
00:16:38
использовали шаблон компонента практически
00:16:40
безостановочно по мере сборки Unity
00:16:42
Unity построен на
00:16:45
шаблоне компонентов или шаблоне проектирования компонентов
00:16:47
для объединения игровых объектов и
00:16:49
префабов, когда мы добавляем
00:16:51
к объектам различные компоненты, поэтому мы удаляем средство рендеринга
00:16:53
спрайтов или физический компонент,
00:16:57
такой как коллайдер или твердое тело, — это
00:16:59
все компоненты, которые мы добавляем и
00:17:01
наращиваем сейчас, когда мы говорим об использовании
00:17:04
шаблона компонентов в качестве
00:17:06
разработчиков Unity, на самом деле речь идет о создании
00:17:08
более мелких компонентов и составлении наших
00:17:11
объектов из этих более мелких компонентов, поэтому
00:17:13
вместо обязательного построения, как
00:17:16
класс тяжелого танка, это большой тяжелый розовый
00:17:19
с двумя пушками и думая об
00:17:21
игре в реальном времени, мы создаем класс движущегося объекта и
00:17:24
класс турели и как бы объединяем эти
00:17:26
вещи, и танк будет нашим префабом,
00:17:28
и это будет объект, представляющий собой
00:17:30
комбинацию всех этих компонентов,
00:17:32
поэтому я хотел указать на это, потому что
00:17:35
шаблон компонентов действительно интересен
00:17:37
и важен, и
00:17:38
люди не осознают, что они
00:17:40
регулярно используют следующий шаблон, о котором
00:17:43
хотят поговорить, тоже в некоторой степени в
00:17:45
том же духе, и это
00:17:46
шаблон наилегчайшего веса, это еще один шаблон, который мы
00:17:48
иногда не осознаем, что используем,
00:17:50
потому что большую часть времени в наиболее
00:17:53
важных частях разработки игр
00:17:54
шаблон легковеса на самом деле больше применим к нашим
00:17:57
художественным ресурсам, чем к нашему коду, поэтому
00:17:59
идея шаблона легковеса заключается в том, чтобы
00:18:02
повторно использовать данные и иметь общие одни и те же данные,
00:18:05
чтобы мы не создавали копии всех
00:18:07
этих данных, поэтому, если у меня есть 3000 элементов,
00:18:10
которые содержат один и тот же элемент, я
00:18:12
не хочу обязательно иметь 3000
00:18:15
строк этих гигантских его описания.
00:18:17
Я хочу иметь такое, которое бы
00:18:18
определяло этот предмет, и все эти
00:18:20
вещи ссылаются на него, это небольшая
00:18:22
часть, хотя, когда дело доходит до
00:18:24
реальной разработки игры, я вижу гораздо более серьезную
00:18:26
проблему, заключающуюся в том, что люди случайно
00:18:29
пропускают использование вещей например, сетки и
00:18:32
материалы или игровые объекты, или теперь у нас остается
00:18:35
много неиспользуемой или потраченной впустую памяти,
00:18:38
чтобы дать хороший пример того, что я
00:18:40
хотел показать, как иногда мы
00:18:42
неправильно используем свойства материалов для установки
00:18:44
цветов, и способ, которым мы можем повторно использовать
00:18:47
шаблон легковеса или выберите
00:18:49
реализацию этого шаблона легковеса,
00:18:50
чтобы сделать ситуацию немного лучше, и
00:18:53
это касается установки цветов
00:18:55
материала, поэтому давайте перейдем к следующей демонстрации, и
00:18:57
здесь у нас есть сцена с кучей
00:18:59
настроенных кубов. чтобы просто
00:19:01
случайно изменить цвет, когда я включаю
00:19:03
этот сценарий изменения цвета, а также я
00:19:05
открыл профилировщик под окном,
00:19:08
анализом и профилировщиком и переключился на
00:19:11
представление памяти, чтобы мы могли получить представление о
00:19:13
количестве материалов и
00:19:15
используемой сейчас памяти материала эти цифры будут
00:19:17
небольшими, потому что мы используем очень пустую
00:19:19
крошечную текстуру или вообще не используем текстуру,
00:19:21
очень простой материал, и мы просто
00:19:23
меняем цвета на кубах, но это может
00:19:25
увеличиваться по мере роста нашего проекта. Я хочу, чтобы вы
00:19:28
увидели что происходит, поэтому я
00:19:29
выбираю все свои кубы, устанавливаю
00:19:32
этот флажок и смотрю на наши материалы. Я
00:19:35
почти танцую с
00:19:37
использованием нашей памяти, давайте посмотрим, как
00:19:39
это делается и как мы на самом деле
00:19:41
преодолеваем этот наилегчайший вес шаблон здесь, поэтому
00:19:43
мы вызываем здесь набор цвета
00:19:46
для материала, поэтому мы получаем
00:19:48
рендерер в нашем пробуждении и кэшируем, что
00:19:51
затем мы получаем материал и вызываем набор
00:19:53
цвета или вызываем цвет, равный
00:19:56
передаче случайного цвета, который мы генерируем,
00:19:58
но это также то же самое, что и этот вызов набора цвета
00:20:01
ниже, поэтому иногда люди
00:20:03
могут подумать: ладно, ну, может быть, это
00:20:05
исправит, мне просто нужно вызвать этот цвет,
00:20:06
это на самом деле его обертка, и они делают то же самое,
00:20:08
мы получим те же
00:20:09
результаты, что и не то, что мы хотим сделать, на
00:20:11
самом деле здесь происходит то, что
00:20:13
когда мы это делаем, вместо этого создается копия
00:20:16
этого материала с этим случайным цветом, а
00:20:18
мы хотим обновить
00:20:21
существующие данные в этом экземпляре
00:20:23
вместо создания совершенно другой копии
00:20:25
материала. мы просто хотим обновить некоторые
00:20:27
данные о свойствах материала в этом
00:20:28
конкретном экземпляре, чтобы их можно было применить,
00:20:31
поэтому давайте кратко рассмотрим, как мы
00:20:33
можем это исправить и как мы можем использовать этот
00:20:34
легковесный шаблон, чтобы избежать этой проблемы,
00:20:36
а не заново создавать материал каждый раз. и у
00:20:39
нас есть это здесь, в этом
00:20:41
методе обновления, если я удалю это, мне
00:20:42
действительно нужно избавиться от моего старого обновления,
00:20:44
тогда вместо этого мы можем получить
00:20:48
блок свойств этого средства визуализации и
00:20:50
установить цвет этого свойства заблокируйте
00:20:53
объект этого свойства материала, заблокируйте
00:20:56
случайный цвет, а затем установите блок свойств,
00:20:58
и это фактически выполняет это обновление,
00:21:01
не вызывая потери памяти, которую
00:21:04
мы только что видели, поэтому давайте попробуем это,
00:21:05
нажимаем кнопку воспроизведения, выбираем наши кубы и
00:21:09
смотрим наши материалы и количество материальной памяти
00:21:11
снова не увеличивается, и мы все еще
00:21:14
имеем тот же эффект, и сейчас я
00:21:16
хочу перейти к последнему, и я думаю, что,
00:21:19
вероятно, самый важный из них - это
00:21:22
шаблон состояния. Это шаблон, который
00:21:24
используется почти во всех типах игра
00:21:27
так или иначе теперь иногда мы
00:21:29
используем шаблон состояния только в наших элементах
00:21:31
управления анимацией. Система Meccan M
00:21:33
является примером
00:21:35
системы конечного автомата с контроллером состояний, где мы
00:21:37
большую часть времени управляем состояниями и переходами визуально,
00:21:40
хотя будем писать этот код
00:21:42
на основе конечные автоматы, которые контролируют
00:21:44
состояние наших объектов или нашего игрового процесса, чтобы
00:21:47
заставить их делать что угодно, от
00:21:49
перехода из меню в меню или меню в
00:21:51
игровой процесс, до управления ботом, который
00:21:54
бегает, сражается с врагами, собирает вещи или
00:21:56
идет и строит дома или любую другую
00:21:58
функциональность заключается в том, что мы хотим, чтобы при
00:22:00
создании этих более сложных
00:22:02
состояний у нас также были очень простые
00:22:04
конечные машины, которые управляют такими вещами, как
00:22:05
кнопка или рычаг, и когда мы передвигаем
00:22:08
этот рычаг к
00:22:10
состоянию, он может перейти только к следующей дате
00:22:11
или чему-то еще. существует множество
00:22:13
различных сценариев для конечных автоматов,
00:22:15
и если вы действительно хотите научиться
00:22:17
писать бота с конечным автоматом или работать с
00:22:19
конечными автоматами, потому что они
00:22:21
важны, просто посмотрите видео, которое
00:22:23
я сделал, где мы углубимся в то, как вы используете
00:22:25
конечный автомат, чтобы контролировать, что
00:22:27
делаете, заставляете их собирать вещи, возвращать
00:22:30
вещи, убегать от врагов и все
00:22:32
такое забавное, вещи, которые
00:22:33
действительно как бы оживляют
00:22:36
игру, я уже упоминал, что их
00:22:38
сотни шаблонов проектирования на
00:22:41
самом деле их, вероятно, меньше 100,
00:22:42
но их много, их
00:22:44
определенно десятки и десятки,
00:22:46
большинство из них на самом деле не применимы
00:22:49
в вашей повседневной работе, те, которые
00:22:51
мы Я говорил о сегодняшнем дне, я использую почти
00:22:53
регулярно, поэтому я бы порекомендовал вам хотя
00:22:56
бы получить представление о том, что они из себя представляют, попытайтесь
00:22:58
их понять, возможно, не пытайтесь
00:23:00
пихать их повсюду, а просто
00:23:02
определите, когда они подойдут и когда
00:23:04
они могут вам помочь. а затем, когда вы обнаружите
00:23:06
эти сценарии, когда вы скажете: «Эй,
00:23:08
кажется, этот шаблон команды
00:23:11
может подойти, вот тогда я бы порекомендовал
00:23:13
погрузиться глубже, посмотрите кучу
00:23:15
видеороликов о шаблонах команд, прочитайте много
00:23:17
ресурсов, посмотрите примеры и найдите
00:23:19
реализацию». это лучше всего подходит для вашего
00:23:21
проекта, будут ли
00:23:23
разные реализации, которые
00:23:25
немного различаются здесь и там, и какая из них
00:23:27
лучше всего подходит для вас, это просто будет
00:23:28
зависеть от вас и вашего проекта, так что погрузитесь
00:23:31
в это, получите от этого массу удовольствия и
00:23:32
убедитесь, что вы изучили этот
00:23:34
материал, и ваш код станет лучше,
00:23:35
вы обнаружите, что проекты становится легче
00:23:38
выполнять, вы, вероятно, получите от этого массу
00:23:39
удовольствия, кроме этого, я еще раз хочу
00:23:41
сказать особое спасибо всем, кто
00:23:43
patreon, ребята, вы потрясающие, и, пожалуйста,
00:23:46
не забудьте нажать кнопку «Мне нравится» и
00:23:48
помните, если у вас есть комментарии или просто
00:23:50
какие-то другие шаблоны, которые, по вашему мнению, мне
00:23:54
следовало упомянуть, просто опустите их
00:23:56
ниже, я хочу знать, потому что это
00:23:59
список, который я придумать это было
00:24:00
лучшее, что я мог сделать, но я, вероятно, пропустил по
00:24:02
крайней мере один или два, о которых я подумаю, ах,
00:24:04
чувак, мне следовало рассказать об этом, и я
00:24:07
думаю, что это, ох, и, наконец, мне следует на этом
00:24:09
закончить, если тебе интересно У меня
00:24:11
также есть несколько курсов, где мы углубляемся
00:24:12
в эти вещи. Ниже вы найдете ресурсы по
00:24:14
этому поводу и множество других видео
00:24:16
об этом, хорошо, спасибо, до свидания.

Описание:

https://game.courses/mp/ - Multiplayer Mastery Course - Open NOW We'll talk about which design patterns game programmers use, what design patterns are... and why you should care about them. I'll also show you how to implement each pattern in unity using some simple code and examples. 0:00 - Intro 1:11 - Beg for Likes 1:28 - Singleton Pattern 4:55 - Observer Pattern 9:52 - Command Pattern 16:32 - Component Pattern 17:41 - Flyweight Pattern 21:15 - State Pattern 22:35 - 100's of design patterns? (wrap-up and discussion) More about patterns and courses: https://game.courses/intermediate/ Game Programming Patterns: https://gameprogrammingpatterns.com/ Game Programming Patterns Physical Book (Amazon Affiliate Link): https://www.amazon.com/Game-Programming-Patterns-Robert-Nystrom/dp/0990582906?language=en_US Join the Group: https://www.facebook.com/unsupportedbrowser Patreon: https://www.patreon.com/unity3dcollege

Готовим варианты загрузки

popular icon
Популярные
hd icon
HD видео
audio icon
Только звук
total icon
Все форматы
* — Если видео проигрывается в новой вкладке, перейдите в неё, а затем кликните по видео правой кнопкой мыши и выберите пункт "Сохранить видео как..."
** — Ссылка предназначенная для онлайн воспроизведения в специализированных плеерах

Вопросы о скачивании видео

mobile menu iconКак можно скачать видео "The 6 Design Patterns game devs need?"?mobile menu icon

  • Сайт http://unidownloader.com/ — лучший способ скачать видео или отдельно аудиодорожку, если хочется обойтись без установки программ и расширений. Расширение UDL Helper — удобная кнопка, которая органично встраивается на сайты YouTube, Instagram и OK.ru для быстрого скачивания контента.

  • Программа UDL Client (для Windows) — самое мощное решение, поддерживающее более 900 сайтов, социальных сетей и видеохостингов, а также любое качество видео, которое доступно в источнике.

  • UDL Lite — представляет собой удобный доступ к сайту с мобильного устройства. С его помощью вы можете легко скачивать видео прямо на смартфон.

mobile menu iconКакой формат видео "The 6 Design Patterns game devs need?" выбрать?mobile menu icon

  • Наилучшее качество имеют форматы FullHD (1080p), 2K (1440p), 4K (2160p) и 8K (4320p). Чем больше разрешение вашего экрана, тем выше должно быть качество видео. Однако следует учесть и другие факторы: скорость скачивания, количество свободного места, а также производительность устройства при воспроизведении.

mobile menu iconПочему компьютер зависает при загрузке видео "The 6 Design Patterns game devs need?"?mobile menu icon

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

mobile menu iconКак скачать видео "The 6 Design Patterns game devs need?" на телефон?mobile menu icon

  • Вы можете скачать видео на свой смартфон с помощью сайта или pwa-приложения UDL Lite. Также есть возможность отправить ссылку на скачивание через QR-код с помощью расширения UDL Helper.

mobile menu iconКак скачать аудиодорожку (музыку) в MP3 "The 6 Design Patterns game devs need?"?mobile menu icon

  • Самый удобный способ — воспользоваться программой UDL Client, которая поддерживает конвертацию видео в формат MP3. В некоторых случаях MP3 можно скачать и через расширение UDL Helper.

mobile menu iconКак сохранить кадр из видео "The 6 Design Patterns game devs need?"?mobile menu icon

  • Эта функция доступна в расширении UDL Helper. Убедитесь, что в настройках отмечен пункт «Отображать кнопку сохранения скриншота из видео». В правом нижнем углу плеера левее иконки «Настройки» должна появиться иконка камеры, по нажатию на которую текущий кадр из видео будет сохранён на ваш компьютер в формате JPEG.

mobile menu iconСколько это всё стоит?mobile menu icon

  • Нисколько. Наши сервисы абсолютно бесплатны для всех пользователей. Здесь нет PRO подписок, нет ограничений на количество или максимальную длину скачиваемого видео.