Рефакторинг c# кода тестового задания. Код ревью unity3D
2021 ж. 3 Мам.
18 896 Рет қаралды
Разбираем код еще одного подписчика на c# в рамках тестового задания Junior Unity3D
Ссылка на Discord - / discord
Группа Игроделов - vk.com/special3d
LINQ в C# - • LINQ в C#. Продвинутое...
Поддержка канала:
Patreon - www.patreon.com/user?u=32502669
В крипте:
BTC - 16WmTb4VTFGYrwEjjnMKNNMMzsMB1rPEqD
ETH - 0x8d35406f8317b846528d0a9ea4a34ce59968dff2
XRP - rLW9gnQo7BQhU6igk5keqYnH3TVrCxGRzm (TAG - 1438215071)
LTC- MNSWdzdVsUMnozSU5HhUPEscfxaUK3Fdck
#unity #кодревью #рефакторинг #ityoutubersru
Я залил два архива до и после рефакторинга. Их можно найти по этой ссылке - drive.google.com/drive/folders/1Q2r8uHt5toZbUZeZwIDmnh12wTFbrnx5?usp=sharing
Спасибо большоее. Может на гитхаб, чтоб не потерялось?
Даешь народу видео по State Machine и ECS! Лайк однозначно!
Лайк, подписка. Первый раз наткнулся на канал и это именно то, что мне нужно прямо сейчас. Будем учиться на чужих ошибках. Продолжай в том же духе
кто от Романа ?
Спасибо, Максим! Вечером буду разбираться и понимать!
Если что, я залил два архива(до и после)
Наконец то рефакторинг, пожалуйста продолжайте
Ну тут однозначно лайк+подписка. Буду ждать новых роликов, интересно посмотреть на чужой код и его улучшение. Может и свой проект как нибудь выложу на твоё обозрение)
Отличный обзор. Нужно будет самому посмотреть, и разобраться.
Привет. Использование библиотеки поиска пути и не использовать коллайдеры это было основным требованием. Пул создавался для хоть какой оптимизации. Ведь время на задание было ограничено. А сделать нужно было много чего. Налепил , как ты и сказал, чтобы выиграть время)
Не пишу на шарпе, но очень интересно послушать про разные архитектурные фичи, однозначно лаек upd с нанесения логического урона на 11:23 проорал
Спасибо было интересно.
Привет,жду твоих видосов,как свой День Рождения.Спасибо за твой труд)
Хорошо, что не раз в году)
Спасибо за видео :)
Как всегда, круто! 12:24 - Думаю, что всё-таки следует раскрывать контракты явно. Передача Entity-создателя может немного смутить. С другой стороны, это расширит "конструктор" до 4-х аргументов, что тоже уже не очень приятно.
Все верно, на самом деле если дать оценку исходному коду, то это 3 из 10. Я сделал из него только 5(максимум). Причины по которой я не делал выше две: 1) Хронометраж видео, нужно делать по этапам или переписывать с нуля( в этом случае половина аудитории не поймет из чего это вышло. 2) Из-за исходного кода, так как я хотел показать тем, кто пишет в таком стиле или часто работает с кодом в таком стиле, как сделать немного лучше и главное понятно
За Эмбиент из Deus Ex: Human Revolution - царский лайк!
Комментик для мотивации))
Как новичок новичку, хочется посоветовать не городить бесконечные вложенные if else, а в написании методов стараться следовать правилу: плюс - минус 10 строк на метод. Бесконечные разветвленные портянки практически не читаемы. Лично я стараюсь по возможности вообще не использовать оператор else, что делает код гораздо понятнее, но это уже дело вкуса, наверное. А автору канала спасибо за познавательное видео.
Совсем else не использовать наверное слишком круто)
Ну, да, так умеют только гуру чипа Линуса:) Но все же в большинстве случаев (как замечено на собственном опыте) else можно заменить на поведение по умолчанию, что делает код более плоским и более читаемым. Хотя, возможно, это накладывает дополнительную нагрузку на машину, что может быть критичным в гемдеве.
Разделение методов или классов по таким формальным ограничениям, как 10 строк приведет к лапшекоду, где методы вызывают методы, которые вызывают методы, которые вызывают методы. Дебажить такое это не менее адский процесс. Я думаю формальных ограничений быть не может, если например это метод валидации какого-то состояния по куче правил - там может быть огромное количество строк. Вопрос еще в том, что ни в оригинале, ни в рефакторинге не было замечено ни единого комментария в коде, хотя из того же видео было слышно, что комментировать есть что. Вот это тот момент, который часто упускается. Комментарии невероятно помогают, когда надо въехать что было у другого человека в голове, когда он писал код
Уничтожение объекта это ресурсозатратная операция, проще сделать пул объектов. Выделение и удаление памяти увеличивает кол во вызовов GC, что тоже негативно влияет на производительность. Больше кэша меньше работы с памятью
Сделай видосик по DI (Dependecy Injection) 🥺 пожалуйста
Спасибо за ролик, всегда интересно посмотреть рефакторинг. Забавно было бы если автор как пули реализовывал бомбардировщик ) Скидывает бомбы самолет, его сбивает пво и бомбы повисают в воздухе или ваще исчезают ) Хотя как геймплейная фича че бы и да?)
Больше похоже на интерсептеров у кэриера в старкрафте
@@gaitavr1992 сто лет в СК не играл и ниче не помню. ) еще и во второй части на Крыльях свободы остановился (или как оно там называлось). А вот кстати зиккураты из ВарКрафта 3. Там вполне бы фишка с исчезанием пули подошла после разрушения башни. )
Пули исчезнули бы)
Бро, очень крутой видос. Сам учусь игры пилить (закончил учить шарп по курсу Сакутина недавно) и обзор кода - это просто топ при изучении языка, т.к. со стороны как правило видишь кучу ошибок, которые сам допускаешь)) разбор огонь 🔥
Сакутин топ)
Тяжело идет но очень круто!
Скажу честно, через паузу на курсах рассматривал с подростками видео. Как раз тема актуальна, так как группа находится на стадии написания игр своими руками на минмиальных фреймворках
Надеюсь, было полезно
Очень люблю ваши видео! Действительно познавательные, но скучновато) Даже для того человека, который пришёл за знаниями, будет проблематично досмотреть до конца за раз. Но что поделать, "ходите узкими вратами", как говорится) p.s Верю и надеюсь, что никогда не увижу на этом канале "Игра за 30 мин/1час/3часа"
Не увидите)
I'm here to help. Settings - Playback speed 1.5x
@@oleksandrbespalov9713 данный подход нужен для того, чтобы половину информации мимо ушей пропустить!
Пробовали ли вы ECS unity dots, было интересно услышать ваше мнение о вообще ECS. Насколько удобно и тд.
По job system есть два ролика, скоро будет про ecs, уж больно часто спрашивают. Прийдется сделать)
@@gaitavr1992 Еее спасибо, буду ждать с нетерпением.) А вы не пользуетесь ECS для разработки на постоянной основе?
Нет подходящего проекта. Вот в tower defense попробую вставить
Максим, а если не секрет, по каким источникам вы обучались программированию на C# + Unity?
Я начинал с C++ по учебнику и статьям, пытаясь пробовать писать консольные игры. Потом мне показали юнити, и я начал читать Шилда по шарпу, а юнити везде где была информация. Реальный рост начался с первой работой в 2013м
@@gaitavr1992 Спасибо за быстрый ответ!
Нормальные такие тестовые на джуниора.
я вот тоже думаю, еще пару лет и у джуна уже будет требовать 3 года разработки хотябы на ААА проектах
конкуренция большая
@@justlama0 как и желание платить меньше за большие знания
Ну так всегда происходит. В 2012м году на юнити брали джуном любого с базовым знанием c#
Максим, расскажи пожалуйста как добавлять кастомные обработчики событий наподобии Awake, Start, Update в Unity. Толковой информации на эту тему не нашел в интернете.
А как они должны встраиваться в игровой цикл юнити?
@@gaitavr1992 в том и вопрос: что это, как оно работает и можно ли создать свои пободные кастомные обработчики?
А как производительнее при одинаковом количестве выстрелов делать выстрел пулями или рейкастами? и если потом переносить в мультиплеер правильнее?
музычка топчег - напоминает Warframe ((:
Это deus ex
сразу забрасываю удочку на будущее: вопрос по поводу паттерна состояния. Лучше писать свой конечный автомат или пользоваться StateMachineBehaviour? Уверен, что про него тоже стоит хоть немного упомянуть, чтобы знать в каких случаях он лучше, а в каких лучше использовать чистый паттерн состояние.
Не довелось использовать behavior, проверю как оно работает. А вот своих реализаций паттерна достаточно
StateMachineBehaviour используется в юнити аниматоре для обработки событий начала/окончания/перехода анимаций. Можно подвязать какое-то действие на окончание анимации (состояния), можно управлять параметрами самого аниматора, например делать случайные переходы, скорость анимации и тд. Но для чего это не вполне подходит - это для чисто логических конечных автоматов, которые не связаны с анимациями. Технически конечно можно реализовать логические стейт машины на основе юнити аниматора, но на мой взгляд это потянет за собой намного больше проблем, чем решений.
Пул игроков таки полезен если 6есть какие то особые условия создания игроков. Тем более если игроки не капсулы а что то сложное со скинами то их инициализация будет вызывать неприятный фриз, но если хранить и х в пуле прогрузив заранее то фризов уже не будет, как и лишних выделений памяти под создание игроков, а так же работы у GC по удалению игроков. 2 пула пуль странно, можно у пули хранить данные о фракции, ее стрелка, а при инициализации пули, указывать эту фракцию, либо если игроки запулены то можно и дальше держать на них ссылки прямо в обьекте пули. Менеджер пулов при том сделать универсальный а не заточенный под пули, тот же IPool выполнит задачу.
Никому не нравится ждать лишнее время на старте, если будет сразу создаваться сотня сложных объектов и их инициализация, то оно того не стоит. А пули было принципиально оставить максимально похожим в использовании на старый код
@@gaitavr1992 можно и не ждать, а асинхронно спавнить в фоне либо корутиной
Можно, и учитывая, что спавнер это отдельный компонент, то можно вынести интерфейс и работать с любой реализацией
@@gaitavr1992 вопрос геймплея. я лучше подожду 5 секунд на старте чем буду терпеть эти 5 секунд в виде микрофризов 20-50 раз в игре пока спавнятся враги. Да в целом считается плохим тоном создавать фризы в играх. и опять же убивать и потом заново создавать сложные обьекты, тоже дурость.
Когда вопрос памяти вытеснит вопрос процессора - пересмотрите свои взгляды
Сколько вы занимаетесь разработкой на Юнити?
Куда можно скинуть тестовое на код ревью? У меня в запасе несколько имеется
Ну тут лайк однозначно, но...Мне одно не понятно: Для чего вот тот Reset() кулдауна атаки, который немного нарушает логику игры. Выходит так, что при смене цели местный воин сбрасывает и остаток времени до след. атаки. Т.е. если он будет окружён толпой врагов и (предположим) его атаки хватит убить врага с удара, то он выпилит эту толпу вокруг себя сразу же как добьёт первого из них.
Hi From Sakutin!
У меня такой вопрос, на сколько быстрее работает и запускается Rider в отличие от Visual studio?
Я их не сравнивал в этом плане. Райдер выбран по причине лучшей интеграции с юнити
@@gaitavr1992 хм, скачал Rider, ну на первый взгляд, он намного быстрее запускается чем студия.
Можно ли просить автора контента, но можете записать видео по архитектуре Unity, как правильно должен выглядеть код или получить ссылку на те источники где это можно вычитать. Заранее, большое спасибо.
Единого верного решения нет
@@gaitavr1992 , то есть применяешь принципы солид и ооп, где-то паттерны если они по тематике подходят и по остальному не париться?
Это всегда компромис между качеством кода, стоимостью разработки и устойчивостью к изменениям. Все приходит с опытом
@@gaitavr1992 на самом деле НЕТ компромиссов! Главное - это экономичность системных ресурсов! всё остальное - лишь вкусовщина и чьи-то антогонистические штампы. Считаю, всем стоит пожертвовать ради производительности, а жертвовать производительностью нельзя ни ради чего. Иначе, тормознутая игра, с самым чистым и замечательным кодом, будет никому не нужна. А в Юнити как нигде, с производительностью проблемы... да и у шарпа, скорость выполнения ниже, чем у тех же С++
Оптимизировать код нужно только в узких горлышках, то что принесет максимальный эффект. А вот пожертвовав читабельностью в месте, которое выиграет пару миллисекунд обойдётся дорого при дальнейшей поддержке
У тебя терпение конечно бездонное в этом всем ковыряться)
Когда увидел енумератор - выпал в осадок на некоторое время)
Это была пасхалочка!)))
А почему? Иенумератор как-то сложно отследить?
@@user-nm5zh2zb8c Это вообще не очевидное решение, почему не брать обычную коллекцию?
А где можно увидеть код автора канала? Чисто им написанный с нуля
Нсть желание сделать код ревью?
ПРИВЕТ ОТ РОМЫ САКУТИНА
Я уже передал)
Хотелось бы про UniRX послушать
Как дать лучнику пул пуль - не использовать mono beh )
А вообще вариантов немного, синглтон, назначение зависимости при создании, инжект(SO сюда же) и все (
Тогда логика автора выкидывается полностью. Задача не переписать код, а немного порефакторить, условно на один уровень лучше сделать
О боже сколько же там if else
Зачем я смотрю рефакторинг C# кода, если я учу пайтон, и еще не прошел ни классов, ни декораторов ни ООП ))