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

Older Posts 19 shown
Post #327 154
Недавно сделал интерактивный коллаб и забыл выложить сюда
https://t.me/HexCollabBot?startapp
Там можно нажимать по карте и переходить на канал автора куска этой карты
А ещё я специально для этого коллаба научился делать аддоны для констракта, а это капец как сложно там так всё запутанно сделали, что я дня три только разбирался как настроить среду для разработки аддона
Но в итоге всё получилось, там в аддоне всего три действия: открытие ссылки внутри телеграмма и открытие внешних ссылкок, ну и инициализация мини апа
Но я супер доволен что игра смогла запуститься с моим плагином и не ломается)
Возможно в будущем продолжу его разработку, хоть в нём и нет смысла, потому что такой плагин уже есть в сторе платный и бесплатный от playgama
Post #325 144

Forwarded from Дневник разработчика

Construct 3 Hack.rar3.3 KB
🎁Construct 3 FREE🎁

💾Устанавливается как расширение для браузера Edge, Chrome

После установки запустите версию на выбор:
r424 (Авторизация) - https://editor.construct.net/r424/
r421 (Без авторизации) - https://editor.construct.net/r421/

После запуска выберите соответствующую версию в меню справа сверху, и нажмите "Запустить"
r424 - для корректного запуска зайдите в любой свой аккаунт (можно создать новый пустой), затем нажмите "запустить", и перезайдите в свой аккаунт (НЕ ПРЕЗАГРУЗИТЬ ВКЛАДКУ, А ВЫЙТИ И ЗАЙДИ В АККАУНТ СНОВА!)
r421 - можно НЕ ВХОДИТЬ В АККАУНТ, и сразу нажать "запустить". Для этой версии вход в какой либо аккаунт не требуется
  • 🥰 1
Post #324 148
Сегодня учился делать мини приложения в телеге
Получилась вот такая интерактивная страничка
@PixelFolderBot по концепту одной писелярщицы чтобы открыть приложение нужно перейти в бота и нажать кнопку open слева внизу
Там можно переключать вкладки и нажимать на кнопки, правда они пока без функционала, но зато работает кнопка подписаться она перекинет вас не канал автора гифки
Post #321 141
Приняли задание✨
С небольшими замечаниями, но их я исправлю уже когда буду сдавать вторую часть
Замечания:
1) Удаляйте неиспользуемые using

2) Base

1. FindObjectOfType - не используйте методы Find для получения ссылок на компоненты объектов со сцены, это неявное обращения к объектам и трудозатратное по производительности, также и с ResourceStorage

2. в OnDisable происходят подписки вместо отписок

3) можно не делать явное сравнение с правдой, например (isAlive == true) или isAlive != false). Результатом сравнения будет всё тоже значение, поэтому эта операция не нужна

4) ResourceDistributor - более 1 пустой строки подряд быть не должно

5) UnitsDepot - SendFreeUnitToGathering - условные операторы отделяются от остального кода пустой строкой с двух сторон

6) Builder

1. переменные должны именоваться в стиле camelCase

2. Input.GetMouseButtonDown(0) - магия
  • 🥰 2
Post #320 137
(мне резко разонравилось слово "ментор" наверное по тому что я пишу его в каждом посте, поэтому теперь буду писать "проверяющий")
Ответ проверяющего по предыдущему решению:


1) if (Vector3.Distance(positionNearby, transform.position) < _sphere.radius) - "Vector3.Distance - Это очень затратная операция из-за вычисления корня в конце. У процессора с этим туго. Везде где возможно лучше вместо дистанции использовать sqrMagnitude, это даже в документации написано (просто сравниваешь не с самой дистанцией, а с ее квадратом). https://t.me/KaDR_gamedev/83
2) public event Action<Resource> UnitUnloadResource;
3) public event Action ReadyForNewTask;
4) public event Action<Resource> UnitAimedAtResource; - события именуются в прошедшем времени с окончанием -ed или -ing
5) StartCoroutine(nameof(MoveToResourse), resource);
6) StartCoroutine(nameof(MoveToBase), resource); - немного странное решение. Почему сразу не написать StartCoroutine(MoveToBase (resource));
7) if (_resourceStorage.HasFreeStorageSpace == true) - не делайте явную проверку с true. Ведь результатом сравнения будет всё тоже значение
_base.GetComponent<ResourceDistributor>().Initialize();, а если на базе нет компонента ResourceDistributor?
8) if (_generator == null)
_generator = FindObjectOfType<ResourceGenerator>(); - я бы предпочел в OnValidate выводить ошибку что поле не заполнено

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

Решение: https://github.com/NoNameDeleted/BotsCollectors/tree/d8c7e4c5e330f5f201bbb12e3f1bb240588e8ad1
  • 🔥 2
Post #319 111
Я исправил предыдущие ошибки и решил пойти немного дальше перед тем как получить ответ

Вот решение: https://github.com/NoNameDeleted/BotsCollectors/tree/01f339eb8496d894bebad85fb3af69745a07bdb1

И вот отзыв по нему:

1) Удаляйте неиспользуемые using

2) UnitsSpawner - переменная Unit unit в функции SpawnUnit не нужна

3) HasFreeUnits - можно сократить public bool HasFreeUnits => _freeUnits.Count > 0; и кстати это свойство не используется в коде

4) ResourceStorage - лучше пишите методы событий Unity в порядке их вызова (Awake выше OnEnable, Start ниже OnEnable)

5) ResourceStorage - если класс называется хранилищем ресурсов, то он наверное должен выступать только складом, а не базой данных для бронирования ресурсов, для этого нужен отдельный класс

6) можно не делать явное сравнение с правдой, например (isAlive == true) или isAlive != false). Результатом сравнения будет всё тоже значение, поэтому эта операция не нужна

7) Unit стр 41 - вместо постоянного ручного перемещения объекта можно просто прекрепить его как дочерний объект и открепить когда довезём

8) Base

1. после { и перед } пустые строки не нужны

2. не мучайте код с помощью Update, пытайтесь отправить ботов за ресурсами только событийно в двух случаях, когда сканер событием оповестил что он обнаружил ресурсы (чтобы если все боты были без работы, то ничего не сломать), и в момент возвращения бота на базу, это сильно сократит количество вызовов метода GatherResouses

9) Builder - метод BuildBase ничего не делает, буквально, в нём кода нет

10) Player

1. поле _isBuildMode не используется

2. у всех членов класса должны быть явно указаны модификаторы доступа

3. переменные должны именоваться в стиле camelCase

Мои мысли: вобщем зря наверное я начал делать следующее задание (колонизация) которое является продолжением этого задания (боты сборщики) потому что я начал накидывать некоторые "намётки" и не доделал их, думая что проверяющий поймёт что они не являются частью задания и пропустит недоделанные части, но нет
Ну ничё, я уже почти доделал второе задание ещё не сдав первое
И кстати это самое последнее задание в блоке юнити и после него я могу с гордостью заявить что прошел юнити на 100%
  • 🔥 2
  • 👍 1
Post #318 128
Отзыв ментора:

Привет, Владислав.

1) private void Scann() скан пишется с одной буквой н. )
2) Вынеси скан в отдельную сущность.
3) У ресурса не должно быть поля private bool _isFree = true; сделай класс который хранит найденные ресурсы и выдает только те, которые еще никому не назначил, то есть будет две коллекции, в одной будут храниться вообще все ресурсы, в другой те, которые еще никому не отдали.
4) public void PickUpByUnit(Unit unit) ресурс не должен знать о юните.
5) обычные поля отделяются от сериализованных пустой строкой.
6) Выдели отдельный класс по управлению юнитами и пускай база им владеет и работает с его методами. )
Мои мысли:
Вобщем я всё забыл за эти пол года... Как же быстро время летит как будто максимум месяц прошел
Удивительно что технически всё работает. Хоть думать не разучился))
По ошибкам - я просто всё свалил в несколько скриптов, потому что так проще, а по правилам, конечно надо каждый функционал выносить в отдельный компонент
  • 🔥 1
Post #317 146
Спустя пол года продолжаем курс)

Задание "Боты сборщики"

Условие:
Создадим 3D игру с плоской картой. Камера позволяет наблюдать за всем пространством уровня. Реализовать следующие механики:

1. В начале игры на базе находятся три юнита

2. Во время игры в случайных местах уровня генерируются ресурсы (на ваш выбор)

3. База может сканировать пространство уровня на наличие ресурсов

4. Если у базы есть свободный юнит и несобранный ресурс, она отправляет юнита собрать этот ресурс

5. Когда юнит получил координаты ресурса, он физически берет ресурс и несет его на базу

6. У базы есть показатель количества доступных ресурсов. Когда юнит приносит новый ресурс, этот показатель увеличивается. Сам юнит ожидает дальнейших указаний

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

Решение: https://github.com/NoNameDeleted/BotsCollectors/commit/7bd4b0114bfa34e750119c94dac52f2200b78a4c
Ответ в следующем посте
Post #316 324
Отзыв ментора на ответ из прошлого поста:
Доработать

1. [SerializeField] private float _explosionRadius = 5f; [SerializeField] private float _explosionForce = 100f; - эти данные может хранить сам взрыватель, раз у вас на каждом кубе свой взрыватель
Или свойства по ним не нужны, если извне не получаете данные

2. private List<Rigidbody> _createdParts; - если не используется, то оно и не нужно

3. part.GetComponent<Rigidbody>() - а где гарантия, что данный компонент есть на объекте?

4. private Cube _cube; - поле не нужно. Вы в метод передаете нужный куб


Мои мысли:
Все ошибки связаны с одним непонимением - я думал что при создании нового куба в Init нужно передавать данные из прошлого куба по отдельности, но почему то не подумал, что можно передать весь куб целиком это было связано с тем что внутри Init'a куба мне пришлось делать ещё Init компонента Exploader и мне это показалось как то костыльно и сейчас так кажется, но с другой стороны такое решение удобнее расширять так что думаю норм.

Новое решение: https://github.com/NoNameDeleted/CubesExplosion/tree/e1a0674cde1b4de85f7afca67612ddff406c6bfc
  • 👍 5
Post #315 258
Задание "Взрыв кубов 2.0"

Условие:
Продолжаем работу над задачей “Взрывы кубов”.

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

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


Решение: https://github.com/NoNameDeleted/CubesExplosion/tree/d41742f25fda9f5e185fb7af76d522c70b5076df

Ответ ментора и мои исправления напишу в следующем посте
  • 👍 4
Post #312 219
Код первой попытки: https://github.com/NoNameDeleted/CubesExplosion/tree/848d6855dd3a92080ca250b3d9b2f4d5f39c41e9

Комментарий ментора по первой попытке:
1) стр 82 и 23 - магические числа

2) следует разделять ответственности, не засовывайте всю логику в один класс, вынесите логику применения силы, а также логику создания как в фабричных паттернах, в отдельные классы Exploader и Spawner, и эти компоненты должны быть не обязательно на кубах, можно и следует их держать отдельно от кубов


Моё мнение по каждому пункту:
1) После долгого перерыва забыл, что нужно перепроверять код на магические числа, исправил быстро
2) У меня изначально получился небольшой класс в котором было всего два метода собственно спавн мини кубиков и взрыв и я подумал что не стоит его дробить на столько чтобы в каждом компоненте было по одному методу, но оказывается стоило

Код второй попытки: https://github.com/NoNameDeleted/CubesExplosion/tree/4596e4cffe8bad91549bb6daa86605455b2fc71b

Комментарий ментора по второй попытке:
Доработать

1. newObject.GetComponent<Renderer>() - один объект не знает, какие могут быть компоненты у другого. Стоит или проверить наличие, или пусть второй сам найдет и сохранит у себя. А дальше или сам делает нужные действия с компонентом, или вернет его по запросу.

2. Instantiate(template - создавайте не по GameObject, а сразу по нужному компоненту и обращайтесь к его новому методу Init, чтобы задать все нужные данные.

3. for (int i = 0; i < UnityEngine.Random.Range(minCubeParts, maxCubeParts + 1); i++) - некорректное использование Random.Range - на каждой новой итерации цикла будет получено новое число. Сначала получите число в переменную и уже используйте переменную.


Мой мысли:
1 и 2) Это тот самый знаменитый паттерн "фабрика" котрый я честно пытался загуглить и понять, но в инете какая-то супер сложная схема и мутные непонятные примеры. Так что ментору пришлось напрямую говорить мне что и как написать. В этом наверное и есть его задача и теперь я понял как это работает. Всё равно бы я сам не додумался что можно сделать метод Init в самом кубе чтобы он как бы сам себя задавал параметры - меньший размер и рандомный цвет. И ещё я думал что GameObject.Instantiate работает только с самим GameObjecт'ом и даже не думал, что можно с помощью этого метода создавать объект любого класса например Cube в моём случае. В такие моменты вспоминаю о том как же всё таки хорошо что я учусь не сам, а с ментором))
3) Эту ошибку с рандомом я даже не заметил, потому что даже в таком неверном виде технически она работала правильно и спавнила от 2 до 6 кубов как и должна. Это скорее просто невнимательность связанная с долгим перерывом на два месяца.

И финальная попытка которую приняли с небольшими замечаниями: https://github.com/NoNameDeleted/CubesExplosion

Комментарий ментора:
1) шанс деления куба следует хранить в классе Cube, спавнер должен только создавать
2) даже развёрнутым свойствам следует устанавливать приватный set, все изменения данных следует проводить в методах


Моё мнение:
1) Это скорее стилистическое субъективное замечание
2) А вот про это я не совсем понял, ведь если всем свойствам ставить приватный set, то по сути их вообще нельзя менять извне, но это как то бессмысленно зачем они тогда вообще нужны можно тогда просто писать геттеры и сеттеры для каждого свойства и это же кринж (кто делал игры в Gdevelop поймут о чём я🙃) может быть он имел ввиду конкретно мой случай, а не вобщем, но всё равно странно. Есть же даже отдельное понятие как "контрактное программирование" акцент в котором как раз делается на проверки передаваемых значений через контракты (проверки) в публичных сеттерах у свойств, ну да ладно
  • 🔥 3
Post #309 164
Задание "Взрыв кубов"
Условие:

На сцене находится несколько кубов. При нажатии на куб он исчезает и появляются новые кубы, в случайном количестве от 2 до 6 штук.
У каждого нового куба Scale уменьшен в два раза по всем осям.
Цвет каждого куба определяется случайным образом.
На каждый куб действует сила гравитации.
Шанс разделения с каждым разом уменьшается в 2 раза начиная со 100%. При успехе идет разделение, иначе куб просто исчезает.
Добавить взрывную силу из центра исчезнувшего куба, которая разбросает только созданные им объекты.
Сделать невидимые ограждения, чтобы кубики далеко не разлетались

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


Моё решение: https://github.com/NoNameDeleted/CubesExplosion
  • ❤ 2
Post #307 158
Давно ничего не постил это связано с перерывом из-за летней сессии, а после долгих перерывов очень сложно восстановить прежний поток жизни. Каждый раз как будто заново начинаю вести канал. И каждый раз после перерыва задумываюсь а надо ли мне оно вообще и что этот канал для меня. И вот во время таких размышлений я наткнулся на такую мысль в каком то видео на ютубе: "Соц сети полезно вести любому человеку не зависимо от количества подписчиков потому что это самый простой, удобный и исчерпывающий способ узнать подробнее о человеке". И далее в разговоре там привели такой пример, что вот познакомился ты с каким то человеком условно в баре, вы пообщались и ты его то заинтересовал, хочется узнать о тебе по больше и как это сделать? Пересказывать о себе каждый раз при новом знакомстве это долго, статей на википедии о тебе нет, статей тоже. А телеграмм канал как раз может дать полную картину о тебе и держать в курсе последних событий, которые можно обсудить. Это как резюме или портфолио только для каких то случайных знакомств в чатах, на работе, в путешествии. Казалось бы максимально простая и очевидная мысль, но почему то раньше она мне в голову не приходила или не казалась важной. Возможно потому что я редко общаюсь с новыми людьми или потому что не рассказываю тут о событиях из жизни (у меня почти ничего не происходит) Вобщем у меня прибавился новый смысл вести этот канал🎉
И я хочу закончить свою коллекцию постов по модулю юнити от Яюниор. Да я до сих пор его не прошел, хотя мне оставалась последняя задача и в конце мая я планировал её доделать, а сейчас уже конец июля... За это время в модуль добавили много новых задачек и ещё больше лекций так что номера заданий из предыдущих постов больше не актуальны. Но зато "контента" будет больше)
У меня сейчас есть две недели перед отъездом на отдых (поедем в пермь и пушкинские горы) так что постараюсь каждый день проходить курс и делать посты.
  • ❤ 3
Post #305 208
Ура обо мне написали🎉
Теперь появится мотивация доделать эту игру
Надеюсь
  • ❤ 5
Post #304 252
Всем привет)
Сегодня у меня к вам небольшая просьба, помогите пожалуйста выйграть приз🙏 https://ijunior.ru/free-unity-base-online?utm_source=club&utm_term=referal&utm_campaign=VuVlad Всё что вам нужно это зарегистрироваться по этой ссылке на бесплатный вебинар от Романа Сакутина на тему "Unity для гуманитариев". Для вас это буквально 2 минуты, а для меня возможность получить футболку члена клуба и Play Station 5. Заранее всем огромное спасибо😊
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 →