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 #262 · Back to latest

Older Posts 20 shown
Post #261 71
Продолжаем проходить курс
Сегодня сделал 16-е задание "Создание главного меню"
Оно было очень простым, даже код писать не надо и сдавать соответственно надо только видео
Задание:
Создать главное меню, которое содержит кнопки:

1)играть

2)об авторах

3)выход

Кнопки стилизовать под себя, попрактиковаться в анимации кнопок и смене цвета при нажатии.

Отправить ссылку на GIF или видео

А ещё у меня за целый день день не проверили предыдущее задание "битва за платформер" такое у меня в первый раз, что в течении суток нет проверки
Ну надеюсь завтра ответят
~~~~~~~~
P.S. это задание приняли буквально через 5 мин после сдачи и без комментариев
При том, что предыдущее задание так и не проверили
~~~~~~~
~
P.S.S. Мне нравятся все новые знания про архитектуру, компоненты, кодстайл, выстраивать логику в таком стиле как в юнити, но мне всё ещё не нравится сам юнити из-за того что он слишком медленный открытие проекта - 5 мин, компиляция любого изменения в коде 10-15 сек, билд игры больше 20 мин. Всё это очень долго и сильно раздражает. По этому у меня есть сильное желание перейти на Cocos creator. Это точная копия юнити, но работает в разы быстрее, запускает тест сцен прямо в браузере, нет ожидания компиляций, быстро открывается, быстро делает билды буквально за несколько секунд и в целом более оптимизирован под веб. А ещё я в этом движке смогу применить абсолютно все знания которые получу на курсе и не прийдётся переучиваться. Так что в скором времени можете ждать от меня какой-нибудь тестовый проект в кокосе)
  • ❤ 2
Post #260 53
Moth Пока делал задание с платформером появилась проблема: враги наносят урон игроку через триггер который наносит урон врагам Думал, что я что то не правильно сделал, отправил вопрос в дс менторам, они сказали что это скорее всего баг движка Так что прийдётся…
Продолжаем проходить курс по юнити от Яюниор. Я исправил вчерашний баг с коллизиями, просто заменил их на Physics2d.OverlapAreaAll по совету от ментора и всё работает как надо. Игрок наносит урон как и задумывалось.
Гит: https://github.com/NoNameDeleted/PlatformerBattle
  • ❤ 2
Post #259 63
Пока делал задание с платформером появилась проблема: враги наносят урон игроку через триггер который наносит урон врагам
Думал, что я что то не правильно сделал, отправил вопрос в дс менторам, они сказали что это скорее всего баг движка
Так что прийдётся придумывать костыли чтобы обойти этот баг👍
  • 👍 1
  • 😁 1
Post #258 68
Moth Продолжаем проходить курс по Юнити от Яюниор Доделал задание из поста выше 👆 Ну как доделал... Просто сдал как есть с небольшими изменениями Я не стал делать всякие сложные штуки типа машины состояний и анимации прыжка Потому что я посмотрел примеры как делали…
Стоп что...
Задание приняли с первого раза даже без комментариев...
У меня каждый раз от этого двоякое чувство
С одной стороны круто что я такой умный и хочется уже побыстрее пройти курс, дойти до пыточной и делать свои игры для Яндекс игр
С другой стороны хотелось бы по максимуму разобрать все ошибки чтобы писать идеальный код
  • ❤ 2
  • 🔥 1
Post #257 59
Продолжаем проходить курс по Юнити от Яюниор
Доделал задание из поста выше 👆
Ну как доделал...
Просто сдал как есть с небольшими изменениями
Я не стал делать всякие сложные штуки типа машины состояний и анимации прыжка
Потому что я посмотрел примеры как делали это задание ученики прошлых лет и... там всё настолько слабо и плохо, что мой самый простой и недописанный код это просто идеал по сравнению с ними))
Признаюсь я уже не раз смотрел примеры кода предыдущих учеников 2ух летней давности когда проходил курс по С#
И мне даже не стыдно было подсматривать потому что приходилось переписывать почти всё
Я не знаю какие раньше были проверки, но они явно были хуже того что есть сейчас
Посмотрим что скажут менторы
Но я чувствую что это задание минимум на шесть попыток и нас ждёт очень долгое приключение
  • 🔥 2
Post #256 62
Сегодня начал делать четырнадцатое задание под названием "2D платформер"
Задание:
Создать простой 2D платформер, в котором реализовать:

-Управление персонажем(бег, прыжки);

-Анимацию бега(прыжок не обязательно);

-Простых врагов, который будут патрулировать небольшой участок;

-Спавн монеток, которые можно собирать.

Сдавать через Git + видео демонстрация.


Сразу скажу, что сегодня я его не смог доделать это задание. Там слишком много моментов, которые надо продумать и связать вместе. Очень долго пытался найти как сделать машину состояний, которая бы нормально работала с аниматором, но так ничего и не нашел(
Как видите спрайты у меня все свои, а не скачанные с ассет стора и их импорт, настройка и создание анимаций заняли достаточно много времени так что ничё особо сегодня не успел.
Если у вас есть на примете хорошие материалы или примеры по аниматору + машине состояний, то скиньте пж. Интересует именно их связка.
P.S. кстати это моя самая первая попытка сделать платформер в юнити. И самая первая попытка самому добавить спрайты, до этого брал только готовые из ассет стора
  • ❤ 1
  • 🥰 1
Post #255 56
Moth Продолжаем делать домашку по курсу Юнити от Яюниор Сегодня у нас тринадцатое задание под названием "Сигнализация против жулика" по видео от 3.40 до 3.59 Звучит задание так: У вас есть некий дом (2d или 3d, это не важно), в который сможет зайти наш жулик.…
Ответ ментора по заданию "Сигнализация против жулика"
1. Громкость меняется не всегда, есть моменты когда сигнализация выключена, поэтому менять громкость постоянно нерационально. Вместо этого лучше сделать так, чтобы для изменения громкости запускалась корутина, а когда процесс изменения закончен выключалась

2. При входе/выходе из зоны сигнализации, нужно проверять с каким-именно объектом мы столкнулись, ведь это может быть не жулик

3. Разделите ответственности. Задача сигнализации это менять громкость, а контролем за входом/выходом должна заниматься другая сущность


Исправленный вариант: https://github.com/NoNameDeleted/burglar-alarm/tree/0ad79f27401091f23190c249de8066308f520299

Мои мысли по каждому пункту:
1) Сделал изменение громкости максимально просто на сколько это возможно, но это оказалось не очень оптимизированно.
2) У меня на сцене нет никого кроме дома и жулика так что я решил что эта проверка бессмысленна, но ладно добавил
3) Я сначала сделал всего один скрипт для дома с логикой сигнализации. Потому что этот скрипт был очень маленький и не увидел причин для его разделения. И даже сейчас когда разделил ответственность на два скрипта я всё равно считаю что это оверинжениринг
  • ❤ 1
Post #254 51
Moth Как обычно моё мнение по каждому пункту ответа ментора: (Надеюсь дальше и правда будут задания ещё интереснее) 1 и 2) Про это я уже сказал в предыдущем посте. Я просто не понял суть поведения которое описывают скрипты. 3) Я думал на сцене есть что то типа…
Результат домашки, думаю вы и сами уже понимаете крутость этого ответа🎉🎉🎉
  • ❤ 2
  • 🔥 1
Post #253 61
Продолжаем делать домашку по курсу Юнити от Яюниор
Сегодня у нас тринадцатое задание под названием "Сигнализация против жулика" по видео от 3.40 до 3.59
Звучит задание так:
У вас есть некий дом (2d или 3d, это не важно), в который сможет зайти наш жулик.

Давайте поможем Лёше поймать жулика, для этого в доме следует установить сигнализацию.

Сигнализацию лучше установить на двери, либо во внутреннем пространстве дома, чтобы мы знали, что жулик зашел.

Когда жулик зашел в дом, громкость сигнализации должна начать плавно увеличиваться до максимальной. Когда жулик вышел, громкость должна плавно снизиться до нуля.

Перед выполнением изучите Mathf.MoveTowards

Сдача как проект на Git + видео демонстрация.

Моё решение: https://github.com/NoNameDeleted/burglar-alarm/tree/f24d08c0912051fd5b502670b75a0987f79d07a2
Тут просто работа со звуком ничего особенного даже прокомментировать не могу
Из нового узнал, что триггеры оказывается не работают без Rigidbody =)
Но зато завтра у нас начинается серия задач про разработку собственного платформера, которая будет тянуться аж на 5 разных заданий
Кстати тема этих заданий как раз удачно совпала ещё кое с чем, но это уже тема отдельных будущих постов
  • ❤ 1
Post #252 56
Moth Всем привет! Ответ ментора получился очень большой. В основном ошибки из-за того что я не правильно понял логику кода. Я думал что пуля вылетает и рикошетит между мишенями по кругу. А оказалось что это игрок движется по маршруту из точек по кругу и стреляет…
Как обычно моё мнение по каждому пункту ответа ментора:
(Надеюсь дальше и правда будут задания ещё интереснее)
1 и 2) Про это я уже сказал в предыдущем посте. Я просто не понял суть поведения которое описывают скрипты.
3) Я думал на сцене есть что то типа тира, а это просто путь состоящий из нескольких точек
4) Не знал, что GetChild сразу получает трансформ
5) Ну я тут вообще убрал все публичные методы исправляя первые два пункта так что этой ошибки уже нет, но всё равно учту на будущее
6) Вот про эту фишку я знал, но когда делал задания совсем вылетело из головы
7) Ну тут спорно, я получал индекс редко, только когда игрок доходил до точки на пути и искал новую точку
8) Я не до конца сначала понял как работает RequireComponent и зачем он нужен, но теперь понял
Надеюсь теперь всё правильно)
  • 👍 1
Post #251 58
Moth Сделал двенадцатое задание. Если вкратце - там нужно было исправить плохой ход и сделать его хорошим. Могу официально заявить, что это пока что самое интересное задание из всего курса и в модуле С# очень не хватало подобных заданий. Моё первое решение: ht…
Всем привет!
Ответ ментора получился очень большой. В основном ошибки из-за того что я не правильно понял логику кода. Я думал что пуля вылетает и рикошетит между мишенями по кругу. А оказалось что это игрок движется по маршруту из точек по кругу и стреляет по мишеням.
Вот сам ответ:
Добрый день. Нет, не самое, дальше интереснее) Но пока надо доработать это:

1) Вы скрестили несовместимое. Первый скрипт не имеет отношения к пуле. Он описывает движение по маршруту, не более. Вам нужно произвести легкий рефакторинг по стилю, а не менять логику скриптов.
2) Тем более, логика апдейта и метода движения будут противоречить друг другу.
3) _targetField - имя не отражает суть. Это путь или контейнер точек пути.
4) targets[i] = targetField.GetChild(i).GetComponent<Transform>(); - Зачем тут GetComponent? Посмотрите, что возвращает GetChild.
5) Помимо упорядочивания методов по доступности, в юнити вводится дополнительное ограничение. Методы событий юнити всегда пишутся выше своих, даже если доступность их ниже. Так же методы событий юнити лучше писать в порядке их вызова основным потоком. Тоесть первым Awake. Исключение, что OnEnable, OnDisable можно рядом писать, то все ровно не раньше чем вызывается в очереди OnEnable. Подробнее
https://docs.unity3d.com/ru/530/Manual/ExecutionOrder.html
6) Логику GetNextTarget можно заменить парой строк, если записывать в переменную индекса остаток от деления (%) ее "текущего значение + 1" (только через инкремент, чтоб избежать магических чисел) на "длину массива". Тогда вы замкнете значение между 0 и максимальным индексом.
7) Текущий индекс лучше в поле хранить, чем постоянно искать. Это затратно по ресурсам, особенно на больших массивах.
8) [RequireComponent(typeof(Rigidbody))] не имеет смысла, тк мы не делаем тут GetComponent.

Переписанный вариант: https://gist.github.com/NoNameDeleted/6274460596bf41ae35c0b3a1051390db/d7e27db82f3baa0e8c30b4f7f579114da4ce8056
Каждый пункт прокомментирую в следующем посте, а то тут не поместится.
  • ❤ 1
  • 👏 1
Post #250 58
Moth А сегодня (если успею) буду делать двенадцатое задание, которое называется "Гений Code Style" и звучит так: Плохой программист взял заказ на написание простой игры. Он выполнил заказ на скорую руку и уехал в отпуск. В скором времени заказчик обнаружил множество…
Сделал двенадцатое задание.
Если вкратце - там нужно было исправить плохой ход и сделать его хорошим.
Могу официально заявить, что это пока что самое интересное задание из всего курса и в модуле С# очень не хватало подобных заданий.
Моё первое решение: https://gist.github.com/NoNameDeleted/6274460596bf41ae35c0b3a1051390db/c4c6fd23a59395f3288a7a55390198ab1a952293
У меня есть небольшое ощущение, что я абсолютно не понял задание и сделал всё вообще не так как надо, но в любом случае это было интересно и меня не затруднит всё переделать. Завтра скину ответ ментора.
  • ❤ 1
Post #249 59
А сегодня (если успею) буду делать двенадцатое задание, которое называется "Гений Code Style" и звучит так:
Плохой программист взял заказ на написание простой игры. Он выполнил заказ на скорую руку и уехал в отпуск. В скором времени заказчик обнаружил множество проблем в проекте и нанял вас как главного разработчика. Вы хотели начать с исправления проблем, но вскоре обнаружили, что code style в проекте полностью отсутствует. По этой причине вы приняли стратегическое решение - привести весь код к одному стандарту. Проработайте именование и соблюдение стандартов в проекте.
код плохого программиста
Тут есть уже два готовых скрипта которые надо исправить. Очень интересное задание я его заметил ещё когда делал модуль по C#
Можете посмотреть не только на пример хорошего кода, который я кидаю, но и пример того как точно не надо делать))
Он конечно карикатурный, но достаточно показательный и понятный
  • ❤ 1
  • 👍 1
Post #248 54
Moth Максимально быстрая проверка и исправление Ошибки которые нашел ментор: 1) class Target если вам нужен скрипт без логики, удаляйте весь код из него 2) class Enemy -> OnEnable -> GetComponent<SpriteRenderer>(); - правильно что инициализируете нужные компоненты…
По предыдущему ответу всего одно замечание:
Создавать врагов должен спавнер а не точка спавна, в текущей реализации спавнер не чего не создает и как минимум его именование не отображает сути
Исправленная версия: https://github.com/NoNameDeleted/Spawners/tree/6eb31cf826a7fc165b683aac3e19ebb2d31f22c7
Тут опять ошибка тянется с предыдущего задания, где точки спавна не имели никакой логики и всё делал родительский объект "спавнер". Он распределял врагов по точкам спавна и собственно спавнил. А теперь когда я перенёс задачу спавна врагов на каждую точку, а в у родительского объекта осталась только задача распределения, то это уже не спавнер, а "распределитель", а точки спавна - "спавнеры"
  • ❤ 1
Post #247 55
Максимально быстрая проверка и исправление
Ошибки которые нашел ментор:
1) class Target если вам нужен скрипт без логики, удаляйте весь код из него

2) class Enemy -> OnEnable -> GetComponent<SpriteRenderer>(); - правильно что инициализируете нужные компоненты до присвоения новых данных через метод, но инициализацию данных стоит проводить в Awake, так как он срабатывает первым при появления объекта на сцене, а OnEnable срабатывает каждый раз при включении объекта, то есть если объект будет выключаться, при включениях на процессор будет больше нагрузка из-за GetComponent во время игры

3) class Enemy -> стр 28-29 - методы отделяются от остального кода пустой строкой с двух сторон

4) SetDirection, _direction -> не верное название для метода и поля, это позиция цели, а не направление, направление это вектор отражающий сторону в которой находится цель, а позиция это логично координаты цели

Исправленный вариант: https://github.com/NoNameDeleted/Spawners/tree/af00993a0614e6a47241ebe33f243932ac36cfb6
Честное мнение по каждому пункту:
1) Я просто забыл удалить ненужный код как обычно(
2) Не знал что надо получать компоненты в Awake, а OnEnable это просто первое что пришло в голову. Опять же всё из-за отсутствия опыта.
3) Нет пустой строчки💀
4) Раньше в предыдущем задании я делал движение через направление, а в этом задании сделал через цель и забыл поменять название поля.
  • ❤ 1
Post #246 59
Продолжаем проходить курс по Юнити от Яюниор
Сегодня у нас одиннадцатое задание по материалам видео с 2.06 до 4.39 и называется оно "Продвинутая генерация врагов"
Звучит так:
Продолжаем работать над проектом с генерацией врагов. 

Теперь каждая точка спауна создает свой тип врагов и имеет цель, то есть объект, к которому идут враги. В момент создания точка спауна передает врагу свою цель, чтобы тот направился к ней. Таких целей должно быть несколько, у каждого спавнера своя цель.

Сами цели движутся по заранее определенному маршруту, от одной точки к другой.

Сдавать как проект на Git и видео демонстрацию


Гит: https://github.com/NoNameDeleted/Spawners/tree/8cd13f7f7c78d6794a52dd8eb2d51d22a8a774c1
Это было на удивление сложное задание. Я прочитал задние и думаю "о сейчас быстро всё решу как обычно" потом сел писать код и просто пол часа смотрел на пустой скрипт не зная что писать. Сначала думал о том как лучше задать тип каждого спавнера, не делать же отдельный компонент под каждый тип, но и через строку или тег задавать не вариант. Потом вспомнил про enum через час размышлений)) Потом думал над тем как сделать цели при их добавлении скрипт родителя спавнеров слишком разросся и пришлось там оставить только рандомный выбор точки спавна, а саму логику спавна перенёс в префаб точки спавна. Потом в скрипте врага сделал словарь тип-цвет и добавил метод который красит врагов в соответствии с типом.
Вам наверное ничё не понятно, но по другому объяснить не могу.
В общем потратил много времени просто потому что нет опыта и насмотренности. Когда делал задания по С# тоже было такое по началу, но потом просто привыкь, мозг перестроился и начал сразу на автомате разбивать задачу на подзадачи, представлять все классы, свойства и методы когда только читал задания. Надеюсь с Юнити однажды станет также.
  • ❤ 1
Post #244 58
Надо потом посмотреть✍
  • 👍 1
Post #243 63
Великий Орц Орцхоев спустился с небес и оценил мою домашку
Почему великий? Потому что это единственный ментор Яюниор со своим тг каналом на сколько я знаю
И канал крутой всем советую подписывайтесь)
P.S. только сейчас заметил, что он проверил домашку всего за 17 минут. С одной стороны я рад, что на столько быстро проверяют домашку, а с другой он хоть успел за это время скачать проект и открыть его в юнити🤔 об этом мы никогда не узнаем
  • 😁 1
  • 🤨 1
Post #242 57
Исправленный вариант: https://github.com/NoNameDeleted/Spawners/tree/4eb95459427e9b40d571e366a6f59d784b43919b
Моё честное мнение по каждому пункту ответа ментора (сообщение выше)
1) Тут я положил скрипты просто куда попало. Знал конечно что желательно сделать отдельную папку для скриптов, но просто в предыдущих заданиях я тоже кидал скрипты куда попало и никто ни разу ни чё не сказал, но тут это уже не прокатило.
2) Забыл подписать private для Update это на логику никак не влияет просто заморочки кодстайла, я к ним уже привык из предыдущего можуля так что окей
3) Ну тут я не понял саму суть задания. Просто там написано "враг должен начать двигаться по прямой в том направлении, которое ему укажет спавнер" а как именно укажет непонятно. У меня он указывал буквально своим поворотом как стрелочка (см. два поста выше) Но оказывается надо было задавать направление через отдельный метод у врага как я мог об этом догадаться... наверное никак
4) А вот у меня случился прямо небольшой поворот в сознании оказывается указав в типе класс компонента объекта можно получить целый объект на котором висит этот компонент. Т.е. один и тот же объект можно получить и через тип Transform и через тип SpriteRender и через кастомный класс компонента например Enemy. Я думал, что объект это только GameObject. Это как то не интуитивно как один объект может быть разных типов? зачем тогда вообще эти типы... ну ладно
5 и 6) Это по сути одна ошибка, надо было передать всех детей родительского спавнера через инспектор и не париться с получением его детей через код, на самом деле я просо не знал что через инспектор можно получать массив объектов.
7) Я хотел сделать универсальный метод который может заспавнить вообще любой объект, а не только врага, но это лишний оверинженеринг как оказалось лучше делать узкоспециализированный метод под каждый конкретный случай, чем париться с универсальностью
8) Просто надо было переименовать spawner в spawnPoint но как на мой вкус spawner тут тоже вполне себе подходит и отражает суть
Всего получилось два скрипта, весь код скину в комменты
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 →