TGViewer
Channel Public Channel
Moth

Moth

@namlessmoth

Прохожу курс Яюниор по юнити
♡2024 by Pixlife. Copying Art is an act of love. Love is not subject to law.
Subscribers
44
Photos
98
Videos
35
Links
137

Showing posts older than #283 · Back to latest

Older Posts 19 shown
Post #282 96
Moth Пытался сделать флаппи бёрд в юнити по видео с 6.07 до 6.18 и из-за того что там пропущено 60% действий у меня ничего особо не получилось пока что, только передвижение птицы и землю В видео то монтаж не по порядку вставлен, то создание скриптов пропущено,…
21-е задание "Flappy Terminator"

Условие:
Реализовать похожий на Flappy Bird раннер со следующими изменениями:

1) Графика должна быть другой.
2) Препятствия теперь не появляются, вместо них в правой части экрана появляются противники, которые периодически стреляют пулями по горизонтали (влево).
3) Игрок тоже может стрелять по нажатию отдельной клавиши. Пуля будет направлена туда, куда смотрит игрок в момент выстрела.
4) Пули противников могут уничтожить игрока, а пули игрока уничтожают противников.
Управление персонажем при этом остается аналогичным Flappy Bird.

Сдавать как проект на GitHub + видео


Сегодня сделал пул объектов и заменил графику. В целом я уже примерно понял как строится архитектура таких игр (с пулом объектов) так что завтра думаю сделаю пули, коллизии и экран поражения если успею.
  • 🔥 1
Post #281 85
24-е задание "Создание эффекта блёсток"

Текст задания:
Представим, что мы делаем игру про маленькую девочку, которая везде раскидывает свои блёстки.

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


Задание приняли сразу же как сдал👍

Следующее задание звучит так:
Создать свой собственный эффект и отправить результат в GIF.

Эффект обязательно должен иметь сложное поведение и включать в себя модули, что мы изучили(не обязательно все, тут смотрите по нужде.)


Выберу, сделаю и сдам вариант из ваших комментариев👇 так что пишите свои варианты
  • 🔥 2
Post #280 72
Создавать второй канал или нет?
(+) С одной стороны интересно, есть мотивация сделать что то интересное чтобы пропиариться
(-) С другой стороны мне очень не нравится писать свои имя - фамилию в названиях это как то кринжово выглядит и звучит
(-) И ещё сейчас хочется по максимуму сосредоточиться на курсе и не распыляться лишний раз
(+) Но у меня уже есть проект - коллаб с рыбами на юнити про который можно рассказать на новом канале тем более что на этом канале я про это не рассказывал
(итог) Получается поровну два плюса и два минуса не могу определиться
Post #279 67

Forwarded from Творческая Мастерская | Роман Сакутин

Когда я только начинал я часто сталкивался с падением мотивации и забрасывал свой путь разработчика игр. Пока я не нашёл интересную фишку которая помогла мне.

Это не панацея но она значительно вас укрепит!

Я начал вести небольшой блог на который были подписаны всего 20 человек, в нём я рассказывал что и как учу и показывал свои первые наброски. Поначалу мне было дико не ловко! Но потом я начал получать от этого какой-то кайф и много энергии...

Оказалось что всё не так страшно. Если рассказывать честно о своих успехах и провалах то люди поддерживают и ты становишься частью чего-то больше и утром уже хочется проснуться и сделать что-то интересное для проекта чтобы поделиться этим.

Предлагаю вам прямо сейчас сделать так же. Пусть вы ещё ничего не умеете но это важный первый шаг.

Создайте прямо сейчас телеграмм канал и честно назовите: "Имя Фамилия - Путь в разработку игр | Движуха Сакутина" и в качестве автарки поставьте свой любимый мем. :)

Первый постом расскажите о себе и до чего хотите достичь.

Дальше заполните эту форму - https://forms.gle/Cgd1wuGtiKexrsiBA

Я подпишусь на вас и ставить лайки-балалайки а также раз в неделю буду делиться здесь самыми интересными каналами и историями, чтобы другие люди тоже подписывались. Давайте объединяться и поддерживать друг друга!
Google Docs Регистрация творческой единицы
Post #277 69
Продолжаем делать домашку по курсу юнити
23-е задание "Создать эффект удар *" (я пропустил два предыдущих, вернусь к ним позже)

Условие:
Представим, что мы делаем файтинг. В процессе игры игрок может нанести удар по противнику или по другому объекту. Нужно создать эффект удара.
Например, эффект “разлета искр” от удара игрока по металлу.
Сдавать как видео или гиф


Я не знаю как должен выглядеть удар. В реале вообще нет никаких частиц при ударе по бетону кулаком например), так что это в любом случае должны быть мультяшные гиперболизированные частицы, но так как это простой базовый удар, а не взрыв например, то частицы должны быть незаметными и мелкими без дыма и искр. Так что получились просто вот такие осколки. Вроде норм.
  • 👍 2
  • ❤ 1
Post #275 70
сегодня сделал две системы партиклов и... всё
сегодня вообще нет сил ничё делать не знаю почему
  • ❤ 2
  • 🔥 1
Post #274 83
Пытался сделать флаппи бёрд в юнити по видео с 6.07 до 6.18 и из-за того что там пропущено 60% действий у меня ничего особо не получилось пока что, только передвижение птицы и землю
В видео то монтаж не по порядку вставлен, то создание скриптов пропущено, то слишком рано обрезано в общем снято максимально так, чтобы по нему невозможно было ничего повторить самому.
Не знаю зачем это было сделано, но это странно.
Зачем я вообще начал повторять эту игру?
Это нужно для следующего задания в котором нужно сделать похожую игру, только заменить трубы на врагов которые стреляют в игрока и игрок тоже может по ним стрелять.
Завтра скину весь текст задания если у меня получится хоть что то сделать.
Почему не могу сделать по любому другому видео?
Потому что нужно соблюдать кодстайл и архитектуру принятую на курсе а то буду опять по 6 раз переделывать как в курсе по С#
  • ❤ 3
Post #273 78
  • 😁 7
Post #272 84
Сегодня весь вечер учил HTML + CSS чтобы делать красивые интерфейсы в играх на констракте.
Выполнял задачки на этом сайте там интересная подача материала. Всё разбито на очень маленькие практические задачки можно выполнять быстро по порядку прям как мне нравится. На сайте про констракт конечно не сказано, но я всё равно делал все задания в констракте. Единственное чем отличается HTML CSS в констракте от обычного HTML CSS на сайтах тем, что немного по другому надо вставлять картинки и в целом работа с файлами в основном через ивенты, а не через свойство src как в обычном HTML. Но самый главный плюс это то что HTML элементы можно очень удобно интегрировать в игры. Для них действуют все принципы работы со слоями - прозрачность, маски, адаптация под размеры экрана. Если нужно сделать всякие кнопки, слайдеры, поля для ввода текста, таблицы, книги, инвентарь, ссылки и анимации для всего этого при наведении и нажатии, то HTML это просто обязательный почти безальтернативный вариант, всем советую👍
А ну и ещё как микро бонус сможете потом верстать сайты
  • ❤ 4
Post #271 74
Продолжаем проходить курс по Юнити от Яюниор
Сегодня у нас юбилейное 20-ое задание🎉 "Битва за платформер 3 - Вампиризм"

Звучит так:
Продолжаем работать над платформером. Добавим игроку способность вытягивать здоровье из ближайшего врага, который находится в радиусе действия способности. Пока она действует на врага, игрок плавно забирает у него запас здоровья и прибавляет его себе. Способность должна активироваться нажатием кнопки и действовать 6 секунд.

Сдавать как проект на Github + видео


Гит: https://github.com/NoNameDeleted/PlatformerBattle/tree/850ef235043ce8fb10666d458d8ce7c7d857c7d0

В целом задание не слишком сложное, но вчера застопорился и не смог решить из-за того что начал делать через событие OnTriggerStay, чтобы отслеживать врагов в радиусе, но это событие не работало в корутине и я не знал что существует OverlapCollider, но вот сегодня узнал случайно, сделал и всё заработало👍
Следующее задание - самое сложное из всего курса по юнити так что возможно буду делать его несколько дней
  • ❤ 1
Post #270 77
Moth Продолжаем проходить курс по Юнити от Яюниор Сегодня сделал 19-ое задание под названием "Битва за платформер 2 - Внедрение интерфейса" Текст задания: Внедрите разработанный индикатор здоровья (плавный бар здоровья) в платформер. Над каждым врагом и игроком…
Получил ответ ментора на это задание:

1) [RequireComponent(typeof(SpriteRenderer))]
[RequireComponent (typeof(Animator))] - можно в одном написать)
2) Проверку коллизий с монетами и аптечками я бы в отдельный компонент вынес.
3) if (collision.TryGetComponent(out EnemyDamager enemy))
_health.LoseHealth(enemy.Damage); - что у вас игрок мазахист какой-то? Зачем он сам себя бьет и создает для этого условия? Это врагу нужно ударить игрока, он пусть и проверяет, ищет и говорит игроку "я тебя ударил с таким-то уроном". Сам-то игрок врагов правильно бьет.


Изменённый вариант: https://github.com/NoNameDeleted/PlatformerBattle/tree/bfdecb66eeb643dc8d023604bc78052c776bdca1

Мои комментарии по каждому пункту:

1) Для аниматора требуется спрайт рендер и можно не требовать спрайт рендерер заново если уже требуешь аниматор. Это не ошибка и по логике я всё написал правильно - в скрипте использовал два компонента и я потребовал два компонента. А то что написал ментор это что то из разряда топ 10 лайфхаков в юнити о которых вы точно не знали.

2) У меня в скрипте Player были две проверки коллизии при чём вместе проверка на подбор аптечек и проверка на столкновение с врагом. Я так понимаю логика в том чтобы по максимуму разгрузить ключевой компонент (Player, Enemy, PickUp) у каждого объекта и по максимуму всю логику вынести в отдельные компоненты (Mover, Collector, Patroller, Health, Attacker, Damager) В идеале ключевой компонент должен быть вообще пустой.

3) Программисты придумали огромное множество всяких инструментов (статическая типизация, тесты, IDE с подсказками, правила) которые помогают писать правильно и не допускать ошибок, но никакой инструмент никогда не сможет предостеречь от такой ошибки и ответить на вопрос Кто должен проверять столкновения - игрок "искать" врага и наносить себе урон от него или враг должен "искать" игрока и наносить ему урон? При условии что оба варианта в игре выглядят и работают абсолютно одинаково. И если для вас как и для ментора очевидно, что враг наносит урон и следовательно он обрабатывает взаимодействие с игроком, то надо вспомнить, что на уровне этих врагов может быть очень много и если каждый будет постоянно "искать" игрока, то это может повлиять на производительность, а игрок всегда один и следовательно если он будет обрабатывать взаимодействия с врагами, то это будет более оптимизированно.Таких примеров можно найти ещё очень много и всегда выбор: логика, красота, понятность и масштабируемость против оптимизации, веса и скорости.
  • ❤ 2
Post #269 71
Я сейчас кое что вспомнил
Неделю назад пошла закрытая секретная трансляция для участников клуба
И там рассказали про эффективные методы обучения
https://www.youtube.com/live/j7n7iwZFPAo?feature=shared
Из того что запомнил больше всего:
1) надо в первую очередь определить цель и идти к ней
2) никогда не заниматься учёбой ради самой учёбы - это очень важно, встречал много людей которые делают что то просто чтобы сделать, а ни чтобы прийти к цели
3) надо вести дневник, у меня дневник - этот канал
4) разделять крупные задачи над мелкие подзадачи и стараться фокусироваться на текущей мелкой задаче, на курсе уже всё разделили на подзадачи за меня)
5) 25 мин учиться 5 отдыхать это самый бесполезный совет который никогда для меня не работал
6) много спать, я и так по 10 часов каждый день сплю))
7) выработать привычку к обучению в основном этому посвящён весь стрим. Я в целом учусь каждый день уже больше месяца и думаю ещё месяц и у меня будет привычка
8) удобно обустроить своё рабочее место чтобы в нём было приятно учиться, а потом следующий совет старайтесь выходить учиться в непривычные места типа кофейнь, парков (зачем тогда обустраивали место)

Это все что я запомнил, но там конечно же было больше советов, можете сами посмотреть, для вас эксклюзивный секретный доступ
YouTube Эффективная учеба
  • ❤ 1
  • 🔥 1
Post #268 61
Продолжаем проходить курс по Юнити от Яюниор
Сегодня сделал 19-ое задание под названием "Битва за платформер 2 - Внедрение интерфейса"
Текст задания:
Внедрите разработанный индикатор здоровья (плавный бар здоровья) в платформер. Над каждым врагом и игроком должен находиться его персональный индикатор здоровья, привязанный к нему.

Сдавать как проект на Github + видео


Гит: https://github.com/NoNameDeleted/PlatformerBattle/tree/c578a54da3dfe9cdf42e609dca806dad5514d555
Задание было не сложное, научился делать юнити пакет и импортировать его в проект.
  • ❤ 2
  • 🔥 1
Post #267 58
Moth Получил очень длинный ответ от ментора на задание выше👆 Так что пост будет в двух частях. Ответ ментора: 1) public UnityEvent<int> OnHealthChange; - Во первых, с On именуются обработчики события события. Во-вторых, Само событие просто сообщает, что случилось…
Мой мысли по каждому пункту:
1) Над названием событий я даже не задумывался и писал названия наугад, теперь знаю что сами события называются без On и заканчиваются на -ing, -ed, а обработчики событий уже начинаются с On.
2) То что Юнити сделал свои события хуже чем обычные события С# это было супер неочевидно. Они же по идее делали их на основе уже готовых событий, даже не знаю что там можно было испортить. На первый взгляд они мне показались более удобными тем что можно назначать обработчики через инспектор.
3) Универсальность в коде это что то, что нужно настраивать зная конечный проект или проекты в которых этот код будет работать. А так как проекта в котором будет применятся этот плагин ещё нет, то и универсальность я не продумал, но по замечаниям всё исправил.
4) На счёт слайдера это я мог узнать только из опыта и просмотра готовых проектов, так как опыта у меня ещё нет, то я не мог узнать таких особенностей про слайдер, но всё исправил, теперь буду знать.
5) Не знаю откуда в названии появился пробел
6) Про RequireComponent я уже знал, просто случайно пропустил в одном скрипте
7) Я хотел вынести сразу, но у меня Сериалайз поля дублировались из базового класса и я решил это вообще не делать, и даже когда сейчас сделал там получилось всё очень некрасиво и через костыли
8) Я так и не понял как именно Lerp точнее контролирует время даже в гугле пишут, что MoveTowards и Lerp работают одинаково кроме того что первая функция линейно изменяет значения, а вторая экспоненциально (сначала быстро, а потом замедляется). "Каждый раз брать в качестве стартового значения текущее положение слайдера - не корректно. Нужно запомнить его положение на момент старта корутины" - этот совет просто не работает и MoveToward и Lerp работают только когда получают _slider.value (изменяемое значение) напрямую, если следовать совету и запоминать её перед началом цикла корутины, то _slider.value немного сдвигается один раз, а потом просто корутина застревает в бесконечном цикле из-за того что передаваемое значение не изменяется.
Гит с изменённым кодом: https://github.com/NoNameDeleted/Health-Plugin/tree/85266fe2572f6e9aa238a727b6d917ec13f71d60
  • ❤ 1
Post #266 64
Moth Продолжаем проходить курс по Юнити от Яюниор Сегодня 18-ая задача под названием "Индикатор здоровья" Условие: В задаче “Битва за платформер - Начало” мы реализовали работу со здоровьем персонажа и врагов, теперь пора научиться отображать его на экране. Создадим…
Получил очень длинный ответ от ментора на задание выше👆 Так что пост будет в двух частях.
Ответ ментора:
1) public UnityEvent<int> OnHealthChange; - Во первых, с On именуются обработчики события события.
Во-вторых, Само событие просто сообщает, что случилось в настоящем (-ing) или прошедшем (-ed) времени, в зависимости от того, когда вызывается, до или после действия HealthChanged;.
В-третьих, не дублируйте имя класса в его членах.
2) public UnityEvent<int> OnHealthChange; - юнити ивент не самый удобный инструмент вообще и в 99% случаев достаточно стандартных событий C#.
Кроме того, назначение обработчиков из инспектора усложняет понимание кода, тк неочевидны становятся зависимости. Всегда лучше назначать обработчики явно в коде (даже у кнопок).
3) Здоровье сейчас не универсально. Максимальное здоровье должно настраиваться из инспектора. А размер урона и лечения приходить в параметрах метода. И перед тем как применять это значений, надо проверить, что оно больше 0. Чтоб здоровье не уходило за пределы диапазона, можно использовать метод Mathf.Clamp.
4) Чтоб сделать систему независимой от от границ слайдера, обычно эти границы выставляют от 0 до 1, а текущее значение определяют, как текущее ХП деленное на максимальное. Тогда даже если максимум ХП будет меняться при прокачке, по этой формуле он все ровно будет искать соотношение текущего к максимальному, которое всегда от 0 до 1 будет.
5) Smooth HealthBar.cs - файл должен называться как класс.
6) При использовании GetComponent нужно убедиться, что есть атрибут RequireComponent. https://agava.notion.site/RequireComponent-22b7c385c77546f682a0d8c3cf9998ac
7) У вас в каждом классе UI дублируется получение здоровья и подписка на него. Вынесите в базовый класс.
8) Mathf.MoveTowards(_slider.value, health, _speedChange * Time.deltaTime); - не ошибка, но рекомендую поправить. Я бы заменил на Lerp. Он позволяет более точно контролировать время. Иначе на больших дельтах долго будет плавный бар догонять (что у вас на видео и видно). Только хорошо осознайте, за что отвечает каждый параметр. Каждый раз брать в качестве стартового значения текущее положение слайдера - не корректно. Нужно запомнить его положение на момент старта корутины и изменяя 3й параметр (обычно опираясь на время) от 0 до 1 мы смещаем выходное число от начального к конечному положению, где 0 - стартовое, а 1 - целевое значение.
  • ❤ 1
  • 🤔 1
Post #265 56
Продолжаем проходить курс по Юнити от Яюниор
Сегодня 18-ая задача под названием "Индикатор здоровья"
Условие:
В задаче “Битва за платформер - Начало” мы реализовали работу со здоровьем персонажа и врагов, теперь пора научиться отображать его на экране. Создадим универсальную систему для отображения здоровья, чтобы в будущем применять в других проектах.

На сцене должны быть расположены 2 кнопки, которые будут симулировать получение урона и лечение - удары врагов и подбор аптечек в дальнейшем. Обрабатывать текущее здоровье должен ранее реализованный класс здоровья, новый класс создавать не нужно.

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

Текстовый. На экране отображается текст в формате Текущее здоровье/Максимальное здоровье. Например, 45/100

Бар здоровья. Степень заполненности бара отражает отношение текущего здоровья к максимальному. Например, при значении 60/100 бар должен быть заполнен на 60%. Реализовать это будет удобно с помощью компонента Slider

Плавный бар здоровья. Тоже самое, что и предыдущий бар, однако отображает все изменения с эффектом плавности.

В задаче вам может пригодиться Mathf.MoveTowards(), этот метод работает как его аналог в Vector3, но для float.

После выполнения задачи, экспортируйте из нее систему отображения здоровья в виде Unity Package как собственный ассет, чтобы использовать в будущих проектах.

Сдавать как проект на Github + видео

Гит: https://github.com/NoNameDeleted/Health-Plugin/tree/a41a49c70235f83d9be08822c32751e7f8ec6ad4
Долго не мог понять что надо сделать и как вообще правильно делать эти пакеты по каким правилам и принципам. Пересмотрел кучу разных ассетов в ассет сторе их структуру платные и бесплатные и понял что правил нет абсолютно никаких там люди просто создают папку и накидывают в неё всё что есть без разбора. Вообще не думают о размере этого ассета или удобстве использования. Ну и я собственно тоже сделал просто обычный проект только название сцены изменил на "DemoScene".
  • ❤ 1
  • 👍 1
Post #264 72
Сегодня немного "отдыхал" от Юнити и сделал небольшой проект на констракте.
Тут есть два режима - редактрирование и просмотр. Режимы переключаются по кнопке window mode. В режиме редактирования вы можете перемещать и поворачивать персонажей, добавлять для предпросмотра своих персонажей и писать реплики для каждого персонажа. А в режиме просмотра смотреть эти реплики. Но вся фишка в том, что реплики которые вы написали не просто сохраняются для вас, а сохраняются вообще для всех кто будет играть в эту игру после вас т.к. они сохраняются в общую базу данных.
Юнити я не забросил, надеюсь завтра уже продолжу дальше проходить курс)
https://deleteddeleted.itch.io/platform-collab
  • ❤ 3
Post #263 75
Moth Продолжаем проходить курс по юнити от Яюниор Сегодня я сделал 17-е задание под названием "Audio Mixer" Условие: Создать сцену на которой будет находится 3 кнопки, которые воспроизводят разные звуки по нажатию. Отдельно кнопка включения и выключения всех звуков.…
Ответ ментора по этой задаче:
private void Awake()

{

GetComponent<Button>().onClick.AddListener(PlayClickSound);

}

Отписки нет

И зависимость Button лучше явно в поле записать и хранить, даже если не используется

2 - _masterMixer.SetFloat(MusicVolume, Mathf.Log(soundLevel) * 20);

маг число 20-ка

Исправленный вариант: https://github.com/NoNameDeleted/Audio-Mixer/tree/efbc86bbbd437703338314f37f9430e364379d9f
Моё мнение:
1) Забыл исправить скопированный код под нужный кодстайл, это первая моя такая ошибка, но в будущем наверное будет постоянно)
2) Магическое число... просто в условиях задачи была именно такая формула и я не стал её менять, но как оказалось надо было
  • ❤ 1
  • 👍 1
Post #262 85
Продолжаем проходить курс по юнити от Яюниор
Сегодня я сделал 17-е задание под названием "Audio Mixer"
Условие:
Создать сцену на которой будет находится 3 кнопки, которые воспроизводят разные звуки по нажатию. Отдельно кнопка включения и выключения всех звуков. Также на сцене играет фоновая зацикленная музыка. Задача продемонстрировать корректную работоспособность всех слайдеров и кнопок. По очереди меняя положение слайдеров и включая звуки.

Для решения задания вам стоит изучить работу Audio Mixer. Один из вариантов решения задачи разобран в материале тут: https://youtu.be/560AKXsVuh8?si=w-8uThme8zQc-brK
Чтобы верно настроить громкость звука, надо будет использовать Mathf.Log10(level) * 20. Подробнее можно изучить поняв проблематику по ссылке.
Сдавать видео демонстрацию и ссылку на GitHub

На первый взгляд может показаться что это очень простое задние. Я сперва тоже не дочитал условие и просто привязал volume к onChangeValue слайдеров напрямую. Но это оказалось не верное решение я заметил, когда перечитал условие перед отправкой задания. Проблема в том что при таком прямом решении звук уменьшается не равномерно, а сначала вообще не уменьшается почти, а под конец слайдера уменьшается слишком резко. И решение этой проблемы реально сложное, через прослойку между звуком и значением слайдера и эта прослойка в виде аудиомиксера и небольшого скрипта к нему. Так что задние это делал долго почти весь день, но оно того стоило, это реально полезная штука и настройка громкости нужна в абсолютно любой игре.
  • ❤ 1
  • 🔥 1
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →