классный видос! в следующий можно добавить интерактив: пример реализации архитектуры и вопрос: что тут может пойти не так? P.S.: на 1:24 это было бы уместно :)
По мин\макс лучше написать _minLimit = Mathf.Min(_minLimit, _maxLimit); _maxLimit = Mathf.Max(_minLimit, _maxLimit); или совместить, это на случай если значения будут изменяться не слайдером
Вообще это все у всех довольно по разному оформлено, поэтому не вижу смысла сильно зацикливаться - делай как удобно) Если увижу видос на эту тему - закину сюда в комменты
Пасиб за еще 1 урок) Есть люди кто шарят как сделать рендеринг рук персонажа поверх всех моделей(стен, предметов и т.д) так чтоб еще на них накладывалась тень корректно (к примеру зашел в темное помещение и руки должны быть не светлыми ,а темными). Если что проект в 3д пространстве + юнити 2023 года Буду также благодарен за помощь)
Может и поздно. Но насколько знаю, для этого можно скопировать стандартный шейдер и в нём изменить одно значение в строчке "ZTest" на значение "off". И в материале руки применить твой новоиспеченный шейдер. Я таким способом сделал отображение интерфейса в мировом пространстве поверх всех моделей, так нужно было для vr приложения.
Есть один момент, честно не знаю как оно себя поведет. 1й совет 1 пример с мин-макс, а если мы для мин выставим 100, то для макс будет 101, или все же 100 (ибо мы его в Range ограничили)???
Не очень хорошо когда один класс занимается всем подряд, класс будет разрастаться и это приведёт к долгому поиску метода который тебя интересует. Вместо использования IAttacker, IMovable, Damageable, лучше завести классы EnemyAttack, EnemyMove, EnemyHealth и этим самым мы ограничим ответственность и можем передавать только эти компоненты. Например когда нам мы захотим ударить врага, нам нужно будет передать только один EnemyHealth. Понятное дело нет каких-то абсолютных правил по написанию кода, но из практики если вы захотите делать не маленькую игру, удобнее дробить ответственности
Соглашусь, но в целом мы точно также можем передавать IDamagable. Вообще этот пример довольно абстрактный, на нем я хотел показать, что надо задумываться над разделением интерфейсов и ограничивать сущности
Не совсем понял про "Принцип разделения интерфейсов", точнее есть логическая не стыковка: 1. Нельзя создавать кучу интерфейсов с одним методом, так как по итогу класс будет состоять только из интерфейсов. 2. Если делаем разных врагов с методами в интерфейсах одинаковыми и потом турель которая не двигается и не реализует некоторые методы движения из интерфейса, то потом разделяем интерфейсы по одному методу, и получается что враги состоит из интерфейсов.
пример был неудачный, в таких случаях используется не наследование а композиция. То есть эти интерфейсы не башня реализовывать должна а отдельные классы
Как правильно передавать объект? Каждый раз в инспекторе перетягивать нужный? Или FindGameObject by TAG? Мне кажется что есть какой-то способ, но я о нем не знаю.
только через инспектор, раз на то пошло. Про Find object забудь вообще. Ну или можешь сделать тот же самый bootstrap, но для него тоже нужно будет ссылки прокидывать через инспектор
StealMana сильно не очевидно что должен делать. Можно понять, что если я как OrcMage хочу например при движении стилить ману у всех вокруг - я должен вызвать у них StealMana. Поэтому хорошо бы описать вообще идеальную систему настраиваемых спелов у мобов и игрока. И систему ИИ которая будет решать за моба какие спелы использовать.
Не стоит воспринимать этот пример как абсолютный. На нем я просто хотел показать, что надо задумываться над разделением интерфейсов. Естественно, когда вы делаете абилки для игры, это может выглядеть по иному. Все зависит от конкретной ситуации
Что насчет реализации методов по умолчанию, оставляя их пустыми? Таким образом мы сможем выбирать какие методы нам нужно реализовывать в нужном классе enemy.
В целом иногда можно оставлять методы пустыми, однако все равно весь этот ворох методов придется тащить в каждый класс и если, допустим вы заходите поменять как-то сигнатуру какого-то метода, то придется потом лезть в каждый класс и править это дело + не всегда логически верно работает код с пустой реализацией (вызывается какой-то метод по типу сделай анимацию, а анимации нет - это не очень понятно)
Согласен, спасибо. Если что, я имел не пустую реализацию метода в классе, а реализацию методов по умолчанию (прямо в самом интерфейсе) оставлять методы пустыми. Но вариант не очень. Я бы использовал получения ссылки на определённый интерфейс, который реализует объект класса, полученный в ссылку интерфейса, а затем, если нужно достучаться до другого реализуемого интерфейса, то использовать ключевое слово is, чтобы преобразовать ссылку, чтобы иметь доступ к методам нужным. А так очень информативное видео, спасибо большое!
Спасибо! Очень хорошее видео! Надеюсь, что будет добавка! )) Еще попробую спросить совета, или может тему для видео. Как правильнее организовать HUD, т.е. вывод хелсбара, тамины, маны, панели быстрого доступа, миникарты + возможно что еще - все то, что игрок видит во время основного игрового процесса (т.е. не меню, и не инвентарь)? Все это в один канвас? Или разбить на части, сделав из них префабы, и получается тогда у каждого префаба будет свой канвас? Вопрос в основном и заключается, в том, сколько канвасов делать. Или может не делать один глобальный канвас, а размещать каждый такой мелкий канвас на своем месте...
Зависит конечно от игры, но в целом можно один канвас разбить на глобальные слои какие -то (PopupLayer, HudLayer, FXLayer и тд). И на каждом слое будет располагаться своя информация. Также как вариант можно создавать некоторые элементы UI прямо по ходу игры через фабрику
Добавлю что при изменении чего либо в канвасе он весь перерисовывается,а иногда это может быть очень затратно, так что всякие часто меняющиеся штуки лучше выносить в другой или другие канвасы
Сколько раз видел OnValidate, но почему-то в голову не приходила мысль, как его можно использовать. Зато постоянно старался использовать меньше геткомпонента, ибо "ну а как же, нагружает же систему". Спасибо за советы!
Очень жду следующую часть, твои уроки бесценны!
бесценны, потому что монетизация отключена?
@testservicesssss😂
Видос отличный, продолжение хотим :)
Спасибо автору за простую и, что не мало важно, понятную подачу!
1:24 А теперь попробуй ползунок Min Limit перетащить на 100 :)
тоже подумал об этом
Очень хорошо, спасибо!
Ля, это гениальные видосики! Продолжай их делать, узнаю то, о чём раньше и не знал)
Реально крутое и полезное видео, спасибо большое!👍🔥🔥
Очень жду следующие советы!
Воу воу воу! Откуда ты взялся? Я подписываюсь!
классный видос!
в следующий можно добавить интерактив:
пример реализации архитектуры и вопрос: что тут может пойти не так?
P.S.: на 1:24 это было бы уместно :)
отличное видео, спасибо автору 🥰
Очень хороший тутор!)
Спасибо за видео!
Круто обьясняешь!
Жалко, что только один лайк можно поставить! Контент супер!!! 😊
Продолжай) может наконец научусь нормально писать код)
По мин\макс лучше написать _minLimit = Mathf.Min(_minLimit, _maxLimit); _maxLimit = Mathf.Max(_minLimit, _maxLimit); или совместить, это на случай если значения будут изменяться не слайдером
Видос супер!
9:05 только это нужно не наследовать а использовать композицию и таким способом мы убираем проблему дублирования кода
Стоит, делай 👍
null-coalesing операторы типа ??, ?. нельзя использовать с объектами юнити по идее
Почти тысяча лукасов ;-)
по поводу спавна врагов: не проще ли сделать пул закидывать туда врагов на старте, а при перезагрузке очищать пул?
Если нужен пул в игре, то можно и пул сделать, логика такая же
Хотелось бы узнать архитектуру, в плане рекомендации по структуре проекта, где какие папки и файлы +-
Вообще это все у всех довольно по разному оформлено, поэтому не вижу смысла сильно зацикливаться - делай как удобно) Если увижу видос на эту тему - закину сюда в комменты
Привет, а дай ссылку на свое резюме пж, стало интересно изучить твой опыт)
Пасиб за еще 1 урок)
Есть люди кто шарят как сделать рендеринг рук персонажа поверх всех моделей(стен, предметов и т.д) так чтоб еще на них накладывалась тень корректно (к примеру зашел в темное помещение и руки должны быть не светлыми ,а темными). Если что проект в 3д пространстве + юнити 2023 года
Буду также благодарен за помощь)
Может и поздно. Но насколько знаю, для этого можно скопировать стандартный шейдер и в нём изменить одно значение в строчке "ZTest" на значение "off". И в материале руки применить твой новоиспеченный шейдер.
Я таким способом сделал отображение интерфейса в мировом пространстве поверх всех моделей, так нужно было для vr приложения.
Спасибо за помощь @@keshbel
Красава❤
Есть один момент, честно не знаю как оно себя поведет. 1й совет 1 пример с мин-макс, а если мы для мин выставим 100, то для макс будет 101, или все же 100 (ибо мы его в Range ограничили)???
Не очень хорошо когда один класс занимается всем подряд, класс будет разрастаться и это приведёт к долгому поиску метода который тебя интересует. Вместо использования IAttacker, IMovable, Damageable, лучше завести классы EnemyAttack, EnemyMove, EnemyHealth и этим самым мы ограничим ответственность и можем передавать только эти компоненты. Например когда нам мы захотим ударить врага, нам нужно будет передать только один EnemyHealth. Понятное дело нет каких-то абсолютных правил по написанию кода, но из практики если вы захотите делать не маленькую игру, удобнее дробить ответственности
Соглашусь, но в целом мы точно также можем передавать IDamagable. Вообще этот пример довольно абстрактный, на нем я хотел показать, что надо задумываться над разделением интерфейсов и ограничивать сущности
Тебе бы подошло Data oriented programming)
@@-it394 с IEnemyTarget хорошо получилось его было достаточно а вот второй вариант уже неудачный
Обращаться к другому объекту в Awake не есть гуд.
Не совсем понял про "Принцип разделения интерфейсов", точнее есть логическая не стыковка:
1. Нельзя создавать кучу интерфейсов с одним методом, так как по итогу класс будет состоять только из интерфейсов.
2. Если делаем разных врагов с методами в интерфейсах одинаковыми и потом турель которая не двигается и не реализует некоторые методы движения из интерфейса, то потом разделяем интерфейсы по одному методу, и получается что враги состоит из интерфейсов.
пример был неудачный, в таких случаях используется не наследование а композиция. То есть эти интерфейсы не башня реализовывать должна а отдельные классы
@@USSR-Lenin-Stalin-Forever Спасибо за ответ! Да, такой подход решает проблему)
Как правильно передавать объект? Каждый раз в инспекторе перетягивать нужный? Или FindGameObject by TAG? Мне кажется что есть какой-то способ, но я о нем не знаю.
только через инспектор, раз на то пошло. Про Find object забудь вообще. Ну или можешь сделать тот же самый bootstrap, но для него тоже нужно будет ссылки прокидывать через инспектор
при инициализации передавать все необходимые зависимости через bootstrap, не надо ничего искать тем более по тегу.
StealMana сильно не очевидно что должен делать. Можно понять, что если я как OrcMage хочу например при движении стилить ману у всех вокруг - я должен вызвать у них StealMana. Поэтому хорошо бы описать вообще идеальную систему настраиваемых спелов у мобов и игрока. И систему ИИ которая будет решать за моба какие спелы использовать.
Не стоит воспринимать этот пример как абсолютный. На нем я просто хотел показать, что надо задумываться над разделением интерфейсов. Естественно, когда вы делаете абилки для игры, это может выглядеть по иному. Все зависит от конкретной ситуации
Что насчет реализации методов по умолчанию, оставляя их пустыми? Таким образом мы сможем выбирать какие методы нам нужно реализовывать в нужном классе enemy.
В целом иногда можно оставлять методы пустыми, однако все равно весь этот ворох методов придется тащить в каждый класс и если, допустим вы заходите поменять как-то сигнатуру какого-то метода, то придется потом лезть в каждый класс и править это дело + не всегда логически верно работает код с пустой реализацией (вызывается какой-то метод по типу сделай анимацию, а анимации нет - это не очень понятно)
Согласен, спасибо. Если что, я имел не пустую реализацию метода в классе, а реализацию методов по умолчанию (прямо в самом интерфейсе) оставлять методы пустыми. Но вариант не очень. Я бы использовал получения ссылки на определённый интерфейс, который реализует объект класса, полученный в ссылку интерфейса, а затем, если нужно достучаться до другого реализуемого интерфейса, то использовать ключевое слово is, чтобы преобразовать ссылку, чтобы иметь доступ к методам нужным. А так очень информативное видео, спасибо большое!
дефолтная реализация методов в интерфейсах - жутчайшее зло)
@@SCHCOMM согласен)
Спасибо! Очень хорошее видео! Надеюсь, что будет добавка! ))
Еще попробую спросить совета, или может тему для видео. Как правильнее организовать HUD, т.е. вывод хелсбара, тамины, маны, панели быстрого доступа, миникарты + возможно что еще - все то, что игрок видит во время основного игрового процесса (т.е. не меню, и не инвентарь)? Все это в один канвас? Или разбить на части, сделав из них префабы, и получается тогда у каждого префаба будет свой канвас? Вопрос в основном и заключается, в том, сколько канвасов делать. Или может не делать один глобальный канвас, а размещать каждый такой мелкий канвас на своем месте...
Зависит конечно от игры, но в целом можно один канвас разбить на глобальные слои какие -то (PopupLayer, HudLayer, FXLayer и тд). И на каждом слое будет располагаться своя информация. Также как вариант можно создавать некоторые элементы UI прямо по ходу игры через фабрику
Добавлю что при изменении чего либо в канвасе он весь перерисовывается,а иногда это может быть очень затратно, так что всякие часто меняющиеся штуки лучше выносить в другой или другие канвасы
@@nfurtin спасибо!
А если я поставлю минимум 100, то что будет
Будет 101, тут либо рендж ставить на 1 больше, либо доп валидация
Вот по c# естт метанит , нет какого то похожего для юнити в целом помимо офицальной документации
атакую по-оркски
Сколько раз видел OnValidate, но почему-то в голову не приходила мысль, как его можно использовать. Зато постоянно старался использовать меньше геткомпонента, ибо "ну а как же, нагружает же систему". Спасибо за советы!
Два года работаю в юнити и постоянно что то новое узнаю и постоянно что то забываю 😂
+
Мне кажется или ты повторяешься?
В чем?