Видео супер. Как по мне, убрать мемасы из кода было хорошей идеей - меньше отвлекают))
@George_Panov_Moscow27 күн бұрын
спасибо!
@Pahan75D12 жыл бұрын
Композицию ребятам покажи в ней свои плюсы, минусы). Видос отличный освежил знания
@slevinsaint92842 жыл бұрын
Хороший урок. Спасибо! "Аффтар пиши истчо", как говорится))
@mastervolodsobeck51763 жыл бұрын
Здорово! Сенкс мастер!
@ПавелЮ-р5э3 жыл бұрын
Продолжай дальше, ты молодец
@darkart64873 жыл бұрын
Ну, а так хорошо, видео зачётное. Только надо говорить, что он и для того чтобы кода было меньше и он был проще
@-it3943 жыл бұрын
Я просто в примерах проговаривал от чего это нас может избавить и подумал, что будет понятно)
@SlothHuntOnYou Жыл бұрын
Спасибо за 4к разрешение и 30fps!!! - а то многие идиоты пишут обучающий материал в 60fps - который проблемно смотреть на скорости 2х
@ПавелЮ-р5э3 жыл бұрын
Ураааааааа топ
@va1r3473 жыл бұрын
Илья, вьі сделаете когда нибудь видео про лямбду вьіражения ??
@-it3943 жыл бұрын
Конечно)
@mao31933 жыл бұрын
Так то говоришь все правильно, но если попробуешь использовать это в боевом проекте, быстро словишь проблему с хрупким базовым классом. Чтобы не словить такую проблему, класс 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# уже другая история.
@-it3943 жыл бұрын
Спасибо за такое подробное разъяснение! Как я сказал в видео, этот пример я сделал лишь для того, что бы показать принцип работы полиморфизма и он не является как вы выразились "боевым", однако не вижу совсем ужасным использование в базовом классе какого - то функционала. Допустим мы создаем tower defence или что-то подобное где на нас из каких-то точек спавнятся враги. Так почему не использовать в базовом интерфейсе, что-то типо moveTo(vector3) или общего способа движения/поиска пути. В случае не слишком большого проекта мне кажется это вполне уместным. Но на больших проектах соглашусь будет иметь смысл раскидывать все на отдельные сущности)
@mao31933 жыл бұрын
@@-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 просто посредник, которые делегирует выполнение работы уже другим. Для маленьких проектов, его кстати можно использовать за место скриптинга более высокого уровня. Хотя и настройки игрвоого процесса будет оооочень ограниченной.
@ViktorTseplyayev3 жыл бұрын
@@mao3193 даже при компонентном построение логики сущностей имеет место быть полиморфизму. Сама юнити предлагает работать с сущностями на уровне компонентов через редактор и как вытыкающий паттерн встраивание зависимостей, далее в префаб и/или как угодно. Композиции и прочие паттерны это уже в процессе реализации и выбираются в зависимости от потребностей поставленной задачи. Автор рассказывает про то что такое полиморфизм в целом и как с ним работать. Это базовые знания ООП. Автору респект за ролик. Поменьше бы мемов ;)
@mao31933 жыл бұрын
@@ViktorTseplyayev больше мемом богу мемом!
@marvisgames2 жыл бұрын
Кто может дать час два урока подтянуть меня ?
@4elowww7427 ай бұрын
Я в 7:44 не понял каким образом данные в лист _units передаются, но както они забираются 😮
@darkart64873 жыл бұрын
эх ну я так хотел написать.. Но ты не обижайся, если сам себя по рукам бить не станешь, никто этого вместо тебя не сделает
@gameviewer56933 жыл бұрын
Что касательно реализации интерфейсов не сказано, это считается полиморфизмом?
@_mirai3 жыл бұрын
да
@-it3943 жыл бұрын
Да, к сожалению до интерфейсов мы еще не дошли, по этому в качестве примеров я их и не приводил, однако мы обязательно поговорим об этом в будущем)
@GiniusOfGalaxy Жыл бұрын
4:15 не особо понимаю как из класса юнит мы получаем префаб.
@4elowww7427 ай бұрын
Метод вызывается по нажатию кнопки, а в кнопку мы запихуеваем объект. В коде получается экземпляр скрипта на объекте