Вопросы на собеседовании к вакансии Middle Unity-разработчик + полезная информация

в 15:06, , рубрики: C#, solid, unity, вакансии, вопросы, новичкам, обучение, ооп, Программирование, разработка игр, тестовые задания

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

Список вопросов

Что такое Game Object? Что такое scene?
Что такое canvas? Где и для чего его нужно использовать?

Что такое MonoBehaviour? От чего он наследуется?
Расскажите Жизненный цикл MonoBehaviour.
В каком порядке вызываются события MonoBehaviour в процессе рендеринга кадра?
Зачем нужны отдельные Update и FixedUpdate?
Что такое deltaTime и fixedDeltaTime? Отличия между ними.

Для чего нужны корутины и какую проблему они решают?

Какие компоненты позволяют работать с физикой?

Какие знаете типы камер и параметры для их настройки?

Зачем нужен аниматор?
Можно ли дописывать логику к состояниям аниматора?

Для чего нужны нормали?
Что такое mesh?
Какие данные в себе хранит меш?

Опыт работы с шейдерами. Приходилось ли писать шейдеры?

Что такое drawcall, batching? Какие возможности предоставляет Unity?

Для чего используется асетс бандл?

Какие инструменты для диагностики проблем производительности вы знаете(profiler, deep profiling, frame debugger, memory profiling, profiling on device)?
Unity Web Requests. Что это? Приходилось ли работать с клиент-серверным взаимодействием? Если да, то расскажите про этот опыт.

Есть ли опыт работы с нативным слоем? Android Studio, XCode.

Есть ли опыт интеграции SDK(реклама, аналитика, конфиги, БД, пуш уведомления)?


Какие типы данных вы знаете?

Что такое Nullable-тип?

Что такое Array, List, HashSet, Dictionary? Приведите примеры использования этих структур данных.
Какая разница между Array, List?
Как работает Dictionary, почему он работает быстрее чем List?

Можно ли хранить разные типы данных в объекте класса System.Array?

Что такое Key-value структуры?

Что такое enum flags?

Что такое ООП?
Основные принципы ООП и рассказать про каждый принцип с примерами.

Как вы понимаете SOLID (СОЛИД)?
Какие знаете паттерны? Расскажите про каждый из перечисленных.

Как можно получить доступ к private переменной из другого класса?

Чем абстрактный класс отличается от интерфейса?

В чем различие между классом и структурой?
Почему в структуре нет конструктора по умолчанию?

Может ли класс реализовать два интерфейса, у которых объявлены одинаковые методы? Каким образом?

Какая разница между перегрузкой и переопределением методов?

Что такое Boxing и Unboxing?

Что означает модификатор virtual?
Что обозначает ключевое слово “virtual” для метода или свойства?

Что такое immutable object? Какие преимущества дает использование immutable object?
Как создать собственный immutable-тип?

Чем отличается event от delegate?

Что такое замыкание?

Кому доступны переменные с модификатором protected на уровне класса?

Можно ли наследовать переменные с модификатором private?

Когда использовать StringBuilder, а когда string? Как работает StringBuilder?

В чем разница между throw ex; и throw;?

В чём разница между ключевыми словами final, finally, finalize?

Какая разница между checked и unchecked Exception ?

Что такое дженерики? Какие проблемы они решают?

Приведите пример использования Graphs и Trees.

Что такое коллизии и как с ними бороться?

В чем разница между IEnumerable и IQueryable?

Что такое рефлексия? Расскажите где она используется и для чего.

ООП, interface, SOLID

Если ты, как и я обучался по видосикам на етубе, то вероятнее всего не слышал о подобных БАЗОВЫХ понятиях, звучат они страшно и непонятно, но на самом деле, все куда проще чем кажется. В сети много информации по этим вопросам, однако все они разрознены. 
Пока читаешь одно, другое уже забывается, поэтому решил собрать свой вариант буклета, который должен помочь быстрее въехать в эти странные понятия.

ООП

Вопросы на собеседовании к вакансии Middle Unity-разработчик + полезная информация - 1

(развернутая информация дальше по ссылкам)
(ссылки оставляю полные, если так неудобно, пишите в комментарии - сокращу)

(маленькие статьи про все принципы ООП)

https://habr.com/ru/post/87205/ - ООП с примерами (словесные примеры, без кода)
https://vertex-academy.com/tutorials/ru/chto-takoe-oop/ - (словесные примеры, без кода)
https://training.epam.ua/#!/News/275?lang=ru - ООП с примерами (немножко кода) https://www.youtube.com/watch?v=od_hbf_sdvU - (видео) примеры принципов ООП

(большие текстовые статьи с кучей примеров - отдельно про каждый принцип)

- инкапсуляция

https://skillbox.ru/media/code/oop_chast_3_modifikatory_dostupa_inkapsulyatsiya/
https://metanit.com/sharp/tutorial/3.2.php

- полиморфизм

https://habr.com/ru/post/37576/
https://skillbox.ru/media/code/oop_chast_4_polimorfizm_peregruzka_metodov/

https://qna.habr.com/q/319480 - (первый комментарий) текстовое описание разных видов
https://medium.com/devschacht/polymorphism-207d9f9cd78 - в целом про полиморфизм (и его разные виды)

- наследование

https://skillbox.ru/media/code/oop_chast_5_polimorfizm/
https://ppt-online.org/22757 - разбор большого примера

(дополнительно)
https://forum.unity.com/threads/c-overriding-interface-virtual-usage-situation.245880/ -
(англ) некоторое объяснения понятий - interface, internal, virtual, override, abstract

Interface

Вопросы на собеседовании к вакансии Middle Unity-разработчик + полезная информация - 2
Вопросы на собеседовании к вакансии Middle Unity-разработчик + полезная информация - 3

(дальше идет много статей, практически об одном и том же, но в каждой есть что-то новое)

(маленькие статьи)
https://thecode.media/oop-abstract/ - “зачем нужны абстракции и интерфейсы?”
https://metanit.com/sharp/tutorial/3.9.php - короткий текст с примерами
https://zen.yandex.ru/media/zdgzdgzdg/oop-interfeisy-5eebc544f4871a7b4d9a2c3f - короткий текст с примерами
https://skillbox.ru/media/code/oop_chast_6_abstraktnye_klassy_i_interfeysy/ - короткий текст с примерами

(большие статьи)
https://vectree.ru/text/132/4/0 - большой текст с примерами
https://highload.today/zachem-v-c-nuzhny-interfejsy/ - большой текст с кучей примеров
https://shwanoff.ru/practice-interface-csharp/ - большой текст с другими примерами
https://circuitstream.com/blog/learn-c-for-unity-lesson-6-inheritance-and-interfaces/ - (англ) - большой текст
https://ru.stackoverflow.com/questions/136909/Интерфейсы-в-ООП-java-по-простому - много разного о интерфейсах

(видео)
https://www.youtube.com/watch?v=50_qBoKGKxs - (англ) туториал от юнити
https://www.youtube.com/watch?v=2LA3BLqOw9g - (англ) interactble
https://youtu.be/MZOrGXk4XFI?t=503 - (англ) пример с пулями и IDamageble
https://www.youtube.com/watch?v=qkwGpXtUvIs - (англ) пример IClickable

(дополнительно)
https://www.youtube.com/watch?v=gb3r__izKuI - отличие интерфейса от абстрактного класса

SOLID

(супер упрощённое описание принципов)

Вопросы на собеседовании к вакансии Middle Unity-разработчик + полезная информация - 4

https://itnan.ru/post.php?c=1&p=353840 - короткие текстовые описания принципов
https://web-creator.ru/articles/solid - другие короткие текстовые описания
https://habr.com/ru/company/productivity_inside/blog/505430/ -текстовые описания с картинками

https://professorweb.ru/my/it/blog/net/solid.php - средняя статья с примерами
https://metanit.com/sharp/patterns/5.1.php - несколько статей с примерами (кнопка вперед)
https://ru.stackoverflow.com/questions/900455/Принципы-solid-доступным-языком-на-ПРОСТЫХ-примерах-кода-С - еще примеры

https://en.ppt-online.org/543101 - слайды с примерами

https://docs.microsoft.com/ru-ru/archive/msdn-magazine/2014/may/csharp-best-practices-dangers-of-violating-solid-principles-in-csharp - Опасность нарушения принципов SOLID в C#

(на мой взгляд один из самых сложных принципов (Барбары Лисков) для понимания, поэтому дополнительный небольшой текст с примерами)
https://telegra.ph/Princip-podstanovki-Barbary-Liskov-predusloviya-i-postusloviya-04-24 -
Принцип подстановки Барбары Лисков (предусловия и постусловия)

(видео)
https://www.youtube.com/watch?v=TxZwqVTaCmA - длинное видео с кучей примеров
https://www.youtube.com/watch?v=ll6bxQGkyCk - (англ) разбор большого примера
https://www.youtube.com/watch?v=_yf5vzZ2sYE - (англ) часть0 - Selecting Objects with Raycast
https://www.youtube.com/watch?v=QDldZWvNK_E - (англ) часть1 - рефакторинг в SOLID
https://www.youtube.com/watch?v=Fs8jy7DHDyc - (англ) часть2 - продолжение рефакторинга

(полезное видео для ознакомления)
https://www.youtube.com/watch?v=jqeoq6X-5S8 - "От джуниор/инди разработчика до мидл+"

P.S.

Какие у меня были тестовые задания.

Анимация передвижения и рагдольное падение.

Краткое описание:  

Человек стреляет в другого человека. Пуля дает импульс в место попадания.  Рагдольное падение. Передвижение.  

Полное описание:  

! На небольшой поверхности находится герой, враг и башня в разных местах.  ! При нажатии мышкой в любое место карты, герой бежит в это место.  

! Если герой забегает на верх башни (и может попасть во врага), то его режим переключается в стрельбу.  

! При нажатии на экран в любое место из вытянутой вперед руки игрока вылетает пуля и летит в место нажатия на экране.  

! Если зажать экран, пули летят без перерыва, направление руки меняется соответственно.  

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

! При желании можно добавить выброс партиклов на выстрел.  

Важные примечания:  

! ТЗ будет проверяться в эдиторе версии 2020.1.. (не используйте альфа и бета релизы юнити).  

! Башню для задания можно найти по ссылке:  (была приложена ссылка)

! Необходимо сделать кнопку, которая перезапустит уровень. 

! Необходима 3д модель для игрока и врага. Можно использовать любые бесплатные модели и анимации. 

Пример ресурсов для моделей и анимаций: 

https://assetstore.unity.com/packages/3d/characters/humanoids/zombie-30232  http://mixamo.com/  

! Камеру настройте на свой вкус + играбельно.  

Мы делаем игры, поэтому ценим творческий подход не меньше, чем четкую реализацию =) 

Оружее в двух руках + "магия".

Необходимо сделать десктопный прототип.

Игрок может ходить.

Рядом с игроком в воздухе висит пара пистолетов и две пары камней: огненные и водные.

Пистолет может стрелять и наносить 20 урона за простое попадание (хит-скан или прожектель, не важно, как будет удобно), за попадание по мокрому на 10 урона меньше и на 10 больше за попадание по горящему.

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

Он может брать камни или пистолет в левую или правую руку кнопками Q и E соответственно. Повторное нажатие отпускает предмет.

Перед игроком стоит пугало с 1000hp. Если hp кончаются, оно исчезает.

 Если нажать на клавиатуре R пугало восстановится или вылечится. HP должно быть видно.

Также пугало может намокать по шкале от 0 до 100 и гореть. 

Когда пугало мокрое, оно имеет синий оттенок, когда горит — красный, 

*Можно намутить hp-bar и шкалу мокрости, меняющий цвет в зависимости от оставшегося hp.

Огненный камень позволяет пускать огонь из  руки (простенькая система частиц с эмиссией в 10 частиц/секунду). Попадая по врагу частица наносит 1 урона и поджигает его/обновляет горение. Если цель мокрая, то не поджигает его, а сушит на одну единицу. Когда пугало загорается, оно теряет 5hp/секунду в последующие 10 секунд.

Водный камень выпускает водный шарик, который при касании тушит огонь и мочит цель на 10 единиц. При этом сам шарик исчезает (даже если ничего не намочил). Движется он, как брошенный мячик.

Требуемая версия Unity: 2020.3.20

В каком виде нужно прислать решение: билд + проект на гитхабе + сопроводительный ролик, как это все работает.

Текстовая игра "угадай слово".

Сделать простую quiz-игру на Unity.

 Игра должна брать читать текст (был приложен), выделять уникальные слова и предлагать игроку их угадать. 

Для угадывания у игрока есть набор букв (английский алфавит) на кнопках, слово закрытое за квадратами (на манер «Поле Чудес»), количество попыток и очки. 

Когда игрок нажимает на букву то она исчезает и, если встречается в слове, то соответствующие квадраты открываются. 

Если не встречается — то уменьшается число попыток. Если число попыток 

становится отрицательным — то игрок проигрывает, показывается сообщение и игра начинается снова с нулевого количества очков.

Если слово полностью угадано — то количество очков игрока увеличивается на количество оставшихся попыток и игра начинается снова.

Доступные буквы и количество попыток так же сбрасываются.

Слова которые были использованы не должны повторятся до тех пор пока игрок не проиграет. 

Если подходящих слов больше нет — то игроку сообщается что он прошёл игру и игра начинается снова с полным сбросом очков и использованных слов. 

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

Регистр так же игнорируется, слова "the” и “The” считаются одним и тем же.

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

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

Предоставить проект или в архиве с папками Assets и ProjectSettings

Шарик на бесконечной лестнице

Концепция и функциональность 

Игрок это шарик на бесконечной лестнице.  

Игрок контролирует шарик нажатием на экран, шарик прыгает через ступеньку, свайпом шарик прыгает в сторону, на шарик сверху  нападают “враги” - прямоугольники, при столкновении игрок умирает и игра начинается заново.  

Цель игры - пройти как можно больше ступенек. 

Дополнительная (необязательная) функциональность: 

Разработать топ игроков (игроки вводят свой ник, и могут добавлять свои результаты в общий топ). 

Пример :http://apple.co/2mVu2JP 

Требования: 

  • Unity 5.4.3, C# 

  • ООП 

  • Результатом должна быть сборка под Android 

Время, отведенное на выполнение тестового задания — несколько дней, но не более недели. Нам нужно оценить Ваш результат как  разработчика, который не просто пишет код, а решает задачу. Глубину проработки и объем необходимого функционала Вы определяете  сами, исходя из возможностей по времени и собственных представлений о том, что минимально необходимо для решения данной задачи.  Желаем удачи! 

P.P.S.

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

Автор: Александр

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js