Для начинающих Unity3d программистов

Полезный материал для начинающих (и не только) программистов unity3d: ссылки, мнения, литература, ресурсы для обучения, как проходить интервью и готовиться к нему. Как учиться программировать под Unity3d?

Дисклеймер

По большей части мысли, мнения и советы — мои. Они работают для меня, и, я надеюсь, сработают и для вас. Я даю субъективные оценки книгам и другим источникам информации. Даю рекомендации проверенные только моим опытом.

Решил написать эту статью, после нескольких комментариев с просьбой привести ответы на список вопросов для программистов unity3d.

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

Прямые ответы — очень плохая практика еще и потому, что некоторые HR-manager’ы могут неправильно использовать такой список в качестве тестов, чего совсем не хочется допустить. Да и для начинашек, мне кажется вредно все готовенькое, гораздо полезнее знать где ответы получить и поучиться.

В этой статье хочу привести источники, из которых нужные знания можно почерпнуть. И бонусом добавлю комментарии для самых-самых начинающих: как учиться/где/на что обратить внимание.

Просьба. Если Вам что-то не понравится, ПОЖАЛУЙСТА, высказывайтесь в комментариях к статье, а не вконтакте или на форумах). Ваши полезные комментарии тонут, а я не успеваю отвечать и вносить по ним правки в статью

Готовимся к интервью

Чтобы хорошо подготовиться к техническому собеседованию нужно вспомнить/изучить/проработать многие вопросы. Я разбил вопросы по группам, они совпадают с темами из вопросов для unity3d программиста). Давайте их подробно рассмотрим.

Общие вопросы

Техническое собеседование скорее всего начнется с простых вопросов о предыдущем опыте кандидата или не технических вопросов. Часто кандидату предлагают самому рассказать о себе и своем опыте. Мои мысли на счет этой части интервью такие: нужно быть готовым. Порепетируйте. Очень часто я пишу сопроводительные письма к отклику на вакансию на хедхантере или когда просто шлю резюме на почту. Это примерно и есть то, что Вас попросят рассказать. Расскажите заранее, заодно потренеруетесь.
Если коммерческого опыта нет: расскажите о ваших наработках, лабораторных, собственных проектах и даже принесите ноутбук с вашим кодом!

Алгоритмы и структуры данных

Эта область, кмк, которая программиста-профессионала отличает от начинашки. Лучшим ресурсом для изучения базовых алгоритмов считаю русскоязычный курс Александра Куликова в Computer Science Center: Семестр раз, Семестр два.
А сам Computer Science Center очень хороший обучающий центр, который всем очень рекомендую.
Рекомендаций по книгам в этом разделе никаких приводить не буду, их довольно много.
Видео-курс смотрится очень быстро, и на самой первой лекции рекомендации по книгам, для тех кто предпочитает читать, а не смотреть/слушать тоже дадут.

Графика/3D математика/Rendering pipeline

Программирование графики очень тесно связано с математикой. Линейной алгеброй в частности. Матрицы, векторы, кватернионы и операции над ними — это необходимый базис, без которого в программировании графики никак не обойтись.

Математика

Лучшие книги для изучения математики. Две из них можно найти в pdf, в интернете, а Foundations не встречал.
Очень советую приобрести ее на амазоне. Довольно неплохой paperback, качественная бумага, картинки. Содержание, само собой, просто супер.

Все три книги ориентированы именно на тех, кто интересуется математикой применительно к программированию графики и игр в целом. В книге 3D Math Primer for Graphics and Game Development даже главы про работу графического пайплайна и шейдеры есть.

Графика

Непосредственно посвященные программированию графики книги:

Книги

Давайте начнем с книг. Очень хороший туториал есть у nVidia, лаконичный и очень по делу.
Еще есть книга Кенни Ламмерса. Это сборник рецептов, можно пытаться повторять, можно полистывать иногда, но учиться писать шейдеры по ней нельзя с нуля. Нужно изучить математику, нужно изучить синтаксис и возможности CgFx. У Ламмерса этого нет. Поможет книга от nVidia и чтение документации Unity.

C# и .Net

Я рекомендую подойти к изучению языка основательно. Не стоит смотреть видео «как сделать платформер/три-в-ряд/другой-жанр» на ютубе от героев-скриптеров. Даже обучающие видео от Unity я не рекомендую, не нужно изучать язык по ним.

C# мощное оружие, которым нужно уметь владеть основательно. На мой субъективный взгляд лучше всего изучить C# вне Unity вообще, писать консольный, оконные приложения в студии и читать книгу Эндрю Троелсена. Поднаторев перейти на Рихтера и Скита.

Книга Джефри Рихтера — это огромный талмуд и прочитать ее очень сложно, там все тонкости CLR, .NET. А вот книга Джона Скита читается очень легко, и становится ясно почему разработчики языка привносили те или иные синтаксические удобства.

Unity3d

Я не читал ни одной книги по Unity, но слышал о существовании «Unity в действии» (Unity in Action). Если кто-то читал, отпишитесь пожалуйста, в комментариях.

На момент моего начала с Unity я довольно хорошо был знаком с C#. Порог входа у нее очень низкий. Тоесть время, чтобы начать программировать на Unity очень небольшое, по сравнению с другими игровыми движками и .NET технологиями.

Советы от меня

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

Сначала алгоритмы, концепции, аббревиатуры (имею ввиду, почитайте про выработанные практики: SOLID, DRY, GRASP, KISS). И много-много практики, пишите код, много кода. Изучите слепой десятипальцевый метод печати и пишите код быстро. Сейчас я тьфу-тьфу-тьфу боюсь представить на сколько замедлится моя производительность если я сломаю палец (однажды в детстве ломал, почти вся кисть в гипсе). Уже очень привык и думать и печатать с определенной скоростью. Если скорость печати будет в 3-4 раза ниже, чем скорость мысли, наверняка и сконцентрироваться очень сложно. Бррр, страшно подумать.

В каокй-то момент вы доберетесь до паттернов проектирования, архитектурных паттернов и книги про рефакторинг Мартина Фаулера. Потянет лепить эти самые паттерны в самые разные места ваших программ/игр. Просто чтобы попробовать. Потому что это будет казаться верным и нужным.

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

Про устройство в студию мечты

Совсем недавно читал большую дискуссию в твиттере, которую организовала @sehurlburt, с участием известных графических инженеров и выцепил несколько хороших идей. Далее следует мой вольный их перевод. Ссылки с символом «@» ведут на оригинальные твиты, которые можно прочитать. А так же можно подписаться на их авторов в твиттере, порой там появляются очень интересные ссылки и мысли.

@sehurlburt (Stephanie Hurlburt, Graphics Engineer)
Начинайте изучать новую большой область, такую, как например, программирование графики понемногу. Ставьте себе небольшие задачи и выполняйте их, таким образом вы научитесь очень многому. Огромный плюс такого подхода заключается в том, что вы будете оставаться сфокусированы на конкретной задаче. И, что немаловажно, выполнив какое-то завершенное демо, вы сможете представить его на интервью в качестве портфолио.

@Atrix256 (Alan Wolfe, Graphics Programmer at Blizzard)
Рекомендую пробовать проходить интервью в студию мечты и в случае отказа, пытаться через полгода.

@IonSwitz (Henrik Jonsson, Graphics Programmer EA)
Посылайте резюме, даже если в данный момент открытых вакансий нет.

Особенно полезен 1й совет Стефани! Сам стараюсь придерживаться такой же тактики. Сейчас я делаю небольшой игровой движок в качестве обучения. И всегда ставлю небольшую цель для демки, например: «Сделать демо с летающим космическим кораблем». Исходя из такого определения задачи для демо, я разбил это на подзадачи: скайбокс со звездами, космическая станция относительно которой будет заметно движение корабля, загрузка моделей, загрузка текстур, математика трансформа и тд. Посмотреть, что у меня получилось: первое демо.

Конец

В конце хочу сказать, никогда не отчаивайтесь, если что-то не получается. Учитесь программировать, читайте книги по разным областям программирования: графика, AI, физика. Ходите на интервью часто, не оседайте и вообще оставайтесь голодными до новых знаний. Учитесь всегда! Ставьте под сомнение все!
Эта статью в том числе 🙂

Буду признателен более опытным коллегам за любые советы программистам в комментариях!

Полезные ссылки

Подборка ресурсов по Unity3d — собранные мной полезные материалы по теме Unity3d.

Ресурсы для программистов графики — полезнейшие ссылки по теме программирования графики: рецепты, статьи и видео.

Ребята, без вашей помощи блогу не обойтись, sharing особенно в Google+ очень нужен! Пошарьте, если Вам понравилась статья.
  • Eugene Shramko
    • Все в порядке 🙂 Это не баг, это стандартное средство WordPress, использовал чтобы показать нескольким ребятам черновик статьи. А сейчас решил открыть всем, чтобы больше фидбека собрать и подредактировать.

  • Sasha Domase

    Можно больше ссылок на сами книги и конечно доработать все моменты, а так статья отличная. Можно еще поподробнее о каждой из книг?

    • Привет, Саша, а что именно нужно рассказать о каждой из книг?

      • Sasha Domase

        Вот прям по пунктам, что в каждой книге описано, так же на вакансиях требуют математическую подготовку, у вас указаны книги по Графике, а можно что-то общее или это вообще не требуется

        • Обычно математика в играх это векторная алгебра, матричные преобразования. Они в этих книгах как раз и рассматриваются, пусть Вас не смущает, что они указаны как «математика для программистов графики», для «программистов геймплея» все очень применимо. Тоесть это общее как раз.

      • Hack

        Привет, скажи как относишься к книге Изучаем С# 3-издание, вроде так называется?)

  • MacKot

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

    • Привет, давай на «ты» 🙂 ?

      Хорошая архитектура приложения это скорее академическая величина.
      В книгах описываются подходы, чтобы решить ту или иную задачу, но в реальных условиях это чаще всего не работает. Меняются требования к игре, добавляются фичи, накапливается технический долг, который не всегда выгодно решать. Всегда есть trade-off со скоростью реализации фичи/бюджетом и качеством кода.

      Пример хорошего кода? На unity3d, я мало видел открытых репозиториев. Те что видел, язык не повернется назвать примером хорошего кода. Видел на хабре хорошие статьи про Entity Component system (примерно так называлась), идея вроде хорошая, но в большинстве проектов излишняя сложность.

      Если не в разрезе Unity3d — исходный код Doom3 классный. Но опять, как посмотреть, какие задачи команда решала, какие аппаратные ограничения были в то время, сейчас многие из них уже не актуальны.

      Универсально хорошего кода/подхода, наверное нет. Игры разные ведь: жанры, требования к производительности, всякий социальный обвес, все это накладывает след.
      Мне кажется все с опытом приходит, программист становится по хорошему «ленивым». Делает все ровно как в ТЗ, с минимальным закладыванием на изменения, а уровни косвенности вводит только когда это действительно требуется.

      • MacKot

        Давай)
        Ну проблема как раз в том что не видно хорошишь репозиториев именно по Юнити. Про компонентно ориентированное програмирования я знаю, тогда возникает следущий вопрос к чему тогда везде требуют знания ООП если по сути, использовать компоненты из Юнити куда более полезно и расширяет функционал нежели пытатся построить монстра из ООП, и не понятно чего хотят увидеть в следствии выполнения тестового задания.

        • А какие задания примерно? Можешь условия написать?

          Обычно тестовые задания — маленькие игры, настолько, что даже не задумываешься о каких-либо сложных иерархиях.
          И дают их очень редко (из моего опыта). Я посетил несколько десятков интервью: и всего пару раз меня просили сделать тестовое задание.
          Одно ТЗ я помню. Мне понравилось, что попросили прямо на месте (дали компьютер, разрешили пользоваться интернетом) его выполнить.
          Задание было такое: Проверить является ли скобочная последовательность правильной. Есть разные скобки [, (, { и в последовательности каждой открытой скобке определенного типа должна соответстовать закрытая скобка такого же типа.
          Кмк, просто, вкусно и быстренько проверить умеет ли человек программировать.

          • MacKot

            Походу сайт не дает ответить потому что я кидаю картинку с тестовым или ссылку а он ее не пропускает

          • Видимо, что-то непонятно с системой комментирования, происходит. Это сторонний сервис Disquss. Я пару раз на почте видел твои сообщения,- представил что за задача 🙂
            Думал, что ты сам удаляешь комментарии, и в модераторской панели их не вижу почему-то, как будто действительно фильтруются 🙁

            * Ссылка для читающих комментарии вот: goo.gl/KboSdW

            По твоему описанию в комментарии на почте — вполне достаточно и хорошо решил задачу, отказали? Что-то в ответном письме/звонке сказали? А что за студия? В каком городе?

          • MacKot

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

          • Так бывает, ничего не поделать. У меня есть примеры гораздо более неприятных опытов. А есть и наоборот очень приятный опыт именно отказов!
            Это в целом как с людьми 🙂
            Не знаю насколько Nekki хорошая компания в плане работы, но вроде неплохие игры делают. А ты сейчас где работаешь?

          • MacKot

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

          • А что за статья?) О чем?

          • MacKot

            Твоя 😀

          • Хаха) Польстил 🙂 Постараюсь, кого-то привлечь, чтобы улучшить ее

  • Pingback: Вопросы для собеседования Unity3d программиста | Coremission()

  • Порекомендую книжку:
    3D Graphics for Game Programming, автор JungHyun Han https://www.amazon.com/Graphics-Game-Programming-JungHyun-Han/dp/1439827370

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

    • Привет! По содержанию (нашел на сайте автора: goo.gl/FDFmvW) очень интересный материал! А Вы графический программист?

      • Нет, не графический. Но осознание необходимости почитать такую книжку, думаю рано или поздно приходит к любому, кто работает с 3d, с юнити в частности 🙂
        Саму книгу можно найти в сети, в виде pdf.

      • Hack

        Подскажи, а есть на русском книги какие то по Графика/3D математика/Rendering pipeline? И что делать если не очень знаешь английский?)

        • Однозначно, если у Вас серьезные намерения в программировании, причем любом программировании — английский учить. Лучше чтобы от зубов отлетал. Чтобы бегло любую документацию читать.
          По книгам — ничего порекомендовать на русском не могу. Может кто из коллег набредет на этот комментарий — откликнется. Я ни одной книги не встречал.

  • Pingback: Игровой движок Banshee. Интервью с разработчиком – Coremission()

  • Pingback: Что такое шейдеры? Разбираемся! – Coremission()