C# ПОЛИМОРФИЗМ простым языком с примерами в Unity! Уроки по C# (ч. 7)

  Рет қаралды 7,608

Яковлев Илья - IT и игры

Яковлев Илья - IT и игры

Күн бұрын

Пікірлер: 26
@1stBamos
@1stBamos 3 жыл бұрын
Видео супер. Как по мне, убрать мемасы из кода было хорошей идеей - меньше отвлекают))
@George_Panov_Moscow
@George_Panov_Moscow 27 күн бұрын
спасибо!
@Pahan75D1
@Pahan75D1 2 жыл бұрын
Композицию ребятам покажи в ней свои плюсы, минусы). Видос отличный освежил знания
@slevinsaint9284
@slevinsaint9284 2 жыл бұрын
Хороший урок. Спасибо! "Аффтар пиши истчо", как говорится))
@mastervolodsobeck5176
@mastervolodsobeck5176 3 жыл бұрын
Здорово! Сенкс мастер!
@ПавелЮ-р5э
@ПавелЮ-р5э 3 жыл бұрын
Продолжай дальше, ты молодец
@darkart6487
@darkart6487 3 жыл бұрын
Ну, а так хорошо, видео зачётное. Только надо говорить, что он и для того чтобы кода было меньше и он был проще
@-it394
@-it394 3 жыл бұрын
Я просто в примерах проговаривал от чего это нас может избавить и подумал, что будет понятно)
@SlothHuntOnYou
@SlothHuntOnYou Жыл бұрын
Спасибо за 4к разрешение и 30fps!!! - а то многие идиоты пишут обучающий материал в 60fps - который проблемно смотреть на скорости 2х
@ПавелЮ-р5э
@ПавелЮ-р5э 3 жыл бұрын
Ураааааааа топ
@va1r347
@va1r347 3 жыл бұрын
Илья, вьі сделаете когда нибудь видео про лямбду вьіражения ??
@-it394
@-it394 3 жыл бұрын
Конечно)
@mao3193
@mao3193 3 жыл бұрын
Так то говоришь все правильно, но если попробуешь использовать это в боевом проекте, быстро словишь проблему с хрупким базовым классом. Чтобы не словить такую проблему, класс Unit должен быть пустым, просто классом меткой, того, что этот конкретный GameObject является юнитом, а не чем либо ещё. Так же этот класс Unit гарантирует что те или иные поведения обязательно будут на корневом объекте, где Unit, или в его детях. Как ты это будешь делать через аттрибут запроса компонента или через Custom editor, или OnValidate твое уже дело. А вот уже метод "двигаться к", "телепортироваться к", "издать боевой клич" это различные поведения то бишь другие клаас, такие как Mover - MoveTo(Vector3), Teleport - Exute(Vector 3), CrySomePhrase - Exute(), Exute(str). Ну и так далее. Так же все эти компоненты могут иметь свои callback к которым можно привязаться. Хорошо, вот у тебя юнит с уникальными теми или иными возможностями. Как это объединить в один рабочий юнит. Тут уже надо будет написать один скрипт, который будет исключительно взаимодействовать с поведениями выше: либо вызывает какой либо метод, либо реагировать на события, либо читать тот или иной параметр. Никакой собственной локиги за исключением логических выражении для выбора следующей ветки. Для этой цели можно либо использовать Behaviour Tree, либо любой плагин для визуального программирования будто то Bolt(хотя он не умеет работать с событиями C# или я просто не нашел) flow canvas / uNode. Либо подключить скриптовый язык по типу Lua, JS, python. Или можешь забобахать все на C#, хотя идея заключается в том, чтобы дать дизайнерам инструмент для гибкой настройки поведения? но чтобы и не было доступа ко всей кодовой базе проекта, для чего BT или uNode вполне подходят, да даже логику lua можно легко объяснить дизайнеру (во сколько школьников делают свои подделки в roblox), а вот с C# уже другая история.
@-it394
@-it394 3 жыл бұрын
Спасибо за такое подробное разъяснение! Как я сказал в видео, этот пример я сделал лишь для того, что бы показать принцип работы полиморфизма и он не является как вы выразились "боевым", однако не вижу совсем ужасным использование в базовом классе какого - то функционала. Допустим мы создаем tower defence или что-то подобное где на нас из каких-то точек спавнятся враги. Так почему не использовать в базовом интерфейсе, что-то типо moveTo(vector3) или общего способа движения/поиска пути. В случае не слишком большого проекта мне кажется это вполне уместным. Но на больших проектах соглашусь будет иметь смысл раскидывать все на отдельные сущности)
@mao3193
@mao3193 3 жыл бұрын
​@@-it394 как раз занимаюсь tower defence. И MoveTo это абс класс AbsSetterTargetAI. С тремя реализациями - первая выставляет цель для агента как свою позицию (чтобы на месте стоять, так же чтобы стоять на месте в скриптовой части компонент агента просто отключается), вторая выставляет цель из памяти текущий цели, третья содержит кастомный вектор, который устанавливается как цель и который можно менять опять таки из скриптовой части. И теперь со стороны скриптовой части ты можешь либо просто использовать AbsSetterTargetAI, если тебе не важна реализация, или же использовать что либо конкретно, чтобы давать гарантию что будет нужна точка, а не какая-то левая. public abstract class AbsSetterTargetAI : MonoBehaviour { [SerializeField] protected Unit Unit; private AIPath AiPath=>_aiPath?_aiPath:_aiPath=Unit.GetComponent(); private AIPath _aiPath; public void SetPath() => AiPath.destination = GetDestination(); public abstract Vector3 GetDestination(); } как видишь в моем АБС классе, есть уже базовая логика (установка пути), наследники переопределяют возвращаемый вектор, точно так же как у тебя - базовая логика и абс логика. Но у тебя проблема в том, что ты смешал две ответственности, которые даже не рядом - крик и спаун. У меня претензия именно к смешиванию логики. Этого не было, если бы ты показал ещё и пример композиции. Вот у тебя есть этот Unit и пускай он может издавать крик, но делает он это не самостоятельно, а через композицию, имеет в себе поле AbsMakeCry, которое назначается из инспектора. Будет типа такое public void Cry() => _absMakeCry.Cry(); Вот это было бы уже куда красивее. Этот подход кстати называется Mediator. Unit просто посредник, которые делегирует выполнение работы уже другим. Для маленьких проектов, его кстати можно использовать за место скриптинга более высокого уровня. Хотя и настройки игрвоого процесса будет оооочень ограниченной.
@ViktorTseplyayev
@ViktorTseplyayev 3 жыл бұрын
@@mao3193 даже при компонентном построение логики сущностей имеет место быть полиморфизму. Сама юнити предлагает работать с сущностями на уровне компонентов через редактор и как вытыкающий паттерн встраивание зависимостей, далее в префаб и/или как угодно. Композиции и прочие паттерны это уже в процессе реализации и выбираются в зависимости от потребностей поставленной задачи. Автор рассказывает про то что такое полиморфизм в целом и как с ним работать. Это базовые знания ООП. Автору респект за ролик. Поменьше бы мемов ;)
@mao3193
@mao3193 3 жыл бұрын
@@ViktorTseplyayev больше мемом богу мемом!
@marvisgames
@marvisgames 2 жыл бұрын
Кто может дать час два урока подтянуть меня ?
@4elowww742
@4elowww742 7 ай бұрын
Я в 7:44 не понял каким образом данные в лист _units передаются, но както они забираются 😮
@darkart6487
@darkart6487 3 жыл бұрын
эх ну я так хотел написать.. Но ты не обижайся, если сам себя по рукам бить не станешь, никто этого вместо тебя не сделает
@gameviewer5693
@gameviewer5693 3 жыл бұрын
Что касательно реализации интерфейсов не сказано, это считается полиморфизмом?
@_mirai
@_mirai 3 жыл бұрын
да
@-it394
@-it394 3 жыл бұрын
Да, к сожалению до интерфейсов мы еще не дошли, по этому в качестве примеров я их и не приводил, однако мы обязательно поговорим об этом в будущем)
@GiniusOfGalaxy
@GiniusOfGalaxy Жыл бұрын
4:15 не особо понимаю как из класса юнит мы получаем префаб.
@4elowww742
@4elowww742 7 ай бұрын
Метод вызывается по нажатию кнопки, а в кнопку мы запихуеваем объект. В коде получается экземпляр скрипта на объекте
FOREVER BUNNY
00:14
Natan por Aí
Рет қаралды 31 МЛН
How To Choose Mac N Cheese Date Night.. 🧀
00:58
Jojo Sim
Рет қаралды 97 МЛН
UnityEvents. ЛУЧШЕЕ решение для разработки игр на Unity???
17:47
Яковлев Илья - IT и игры
Рет қаралды 10 М.
Математика в играх на Unity. Библиотека Mathf
5:45
Insane One - Разработка игр
Рет қаралды 25 М.