Дневник энтузиаста — заметка 1. Как план встретился с реальностью

Итак, первая заметка. План на две недели был простой: настроить репозиторий, разобраться с базовыми компонентами Unity, написать первые скрипты, освоить ввод и физику. Я расписал свой план по дням, как примерный школьник, и приготовился методично двигаться вперёд.

Но, как это обычно и бывает, реальность внесла свои коррективы. Уже на третий день я столкнулся с обстоятельствами, которые показали: не всегда удаётся идти по плану. Порой на пути возникают вещи, которые не предусмотришь, и приходится импровизировать. Так что эта заметка получилась не совсем такой, как я задумывал, но, думаю, это нормально.

Теперь о том, как я предполагал устроить заметки. Планировал выпускать их раз в две недели, а внутри — подзаголовки «День 1», «День 2» и так далее. При этом сразу хотел, чтобы эти «дни» воспринимались как условные: они взяты из моего плана, но не означают, что я работал ровно по одному дню. Это этапы, на которые я разбиваю материал: где-то на «день» может уйти пара вечеров, а где-то, наоборот, пару «дней» закрою за один — например, в полноценный выходной. Главное — суть, а не календарная привязка.

День 1. Git и настройки Unity.

Первым делом я решил разобраться с Git. Не потому, что это интересно, а потому, что без контроля версий любой проект быстро превращается в хаос из файлов «final_final_v2». Да и в целом придерживаюсь принципа: не приступать к написанию кода, пока Git и все настройки не будут готовы.

Что за зверь такой? Все просто: Git — это система контроля версий. Она запоминает, как выглядели файлы проекта в каждый момент времени, и позволяет вернуться к любой из этих точек. Проще говоря, это сохранение/загрузка для вашего кода: что-то сломалось — загрузил последнее сохранение и продолжил.

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


Кстати, если у кого-то Git нет, но нужен, я когда-то ставил с официального сайта (git-scm.com), ничего сложного.


Я привык работать через консоль, поэтому все команды вводил вручную. Сначала — настройка пользователя, чтобы коммиты (точки сохранения) были подписаны:

git config --global user.email 'my@mail.ru'
git config --global user.name 'MyName'

Эти две строки сообщают Git, кто вы. Каждый коммит будет подписан вашим именем и почтой. Это нужно при командной разработке, чтобы не путать, кто какие изменения вносил. Но даже если работаете соло — это не лишнее: когда придёт время залить проект на GitHub, почта должна совпадать с аккаунтом, иначе коммиты не привяжутся к профилю. Да и мало ли что будет: вдруг напарник появится — тогда не придётся гадать, кто что внёс.

Дальше — инициализация репозитория в папке проекта:

git init

Эта команда создаёт скрытую папку .git, где хранится вся история. После этого я добавил все файлы в индекс и сделал первый коммит:

git add .
git commit -m "Первый коммит: пустой проект с настройками"

Проверил, что всё на месте:

git status   # показывает, что нет неотслеживаемых изменений
git log      # выводит историю коммитов (закрывается клавишей q)

Пока я остановился на локальном репозитории. В GitHub ничего не отправлял — во-первых, хотел сначала убедиться, что всё работает как надо, во-вторых, не настроил .gitignore, файл, что говорит системе какие файлы и папки проекта запоминать не следует. Хотя в плане этот пункт был. Понимаю, что для Unity это критично: без него в репозиторий попадут временные файлы (Library/, Temp/, obj/ и прочий мусор), и потом с этим будет больно работать. Но я решил не спешить — сначала разберусь с базовыми командами, а .gitignore добавлю чуть позже, перед фиксированием первых изменений. Главное — не забыть.

Что касается настроек Unity, то их я тоже выполнил: в Project Settings → Editor выставил Asset Serialization = Force Text и Version Control = Visible Meta Files. Это нужно, чтобы сцены и префабы хранились в текстовом виде и Git мог их нормально сливать. А в Project Settings → Player выбрал Active Input Handling = Both — на случай, если старый Input Manager вдруг не хватит.

На этом «День 1» можно считать закрытым. Репозиторий есть, коммит сделан, настройки выставлены. Осталось только не забыть про .gitignore и GitHub — но это уже в следующих заметках.

День 2. GameObject и компоненты.

Первое, что делаю — просто смотрю на интерфейс. Слева Hierarchy — там пока только Main Camera. В центре Scene и Game. Справа Inspector — пустой, потому что ничего не выбрано. Внизу Project — папка Assets. Консоли не видно — значит, её надо открыть отдельно: Window → General → Console. Открываю, закрепляю внизу рядом с Project.

Кликаю правой кнопкой в Hierarchy → 2D Object → Sprites → Square. Появляется объект Square. Переименовываю: F2 или правой кнопкой → Rename → Player. Готово.

Теперь кликаю на Player и смотрю в Inspector. Вижу два компонента:

Transform — Position (0, 0, 0), Rotation (0, 0, 0), Scale (1, 1, 1).

Sprite Renderer — там цвет, спрайт, sorting layer.

Вот тут до меня доходит главное: GameObject — это просто контейнер. Всё, что у него есть, — это компоненты. Главный из них — Transform, его нельзя убрать, то есть объект всегда будет иметь координаты и положение в пространстве. Другой важный компонент, Sprite Renderer — это то, что делает объект видимым. Без него можно обойтись, если объект нужен чисто для управления другими объектами и игроку о нём знать не надо.

Дальше по плану были HelloUnity.cs с Debug.Log, привязка скрипта к Player, эксперименты с transform.position и localScale, проверка того, что Play не сохраняет изменения, и коммит. Скрипт я написал и повесил в тот же вечер — консоль ответила «Работает». Эксперименты и коммит тоже успел сделать. А на следующий день Hub перестал пускать.

Дни 3–10. Блокировка, или как я потерял неделю, но приобрёл полезную привычку.

Детали плана на следующие дни были: ввод, физика, триггеры — остались невыполненными. Вместо них я почти неделю разбирался с блокировкой аккаунта Unity.

Как всё началось

На третий день по плану я просто не смог зайти в Unity Hub. Приложение запросило повторную авторизацию — и на этом всё остановилось. Я вхожу через аккаунт Google, и после стандартной процедуры в браузере Hub просто отказывался подвязываться. Ни ошибки, ни объяснения — просто ничего не происходило.

Первая мысль — техническая. Проверил обновления приложения: актуальная версия, обновлять нечего. Дальше — версия про местоположение. Я живу и работаю в регионе, который сейчас находится в серой зоне с точки зрения доступности западных сервисов. В голову полезли мысли: может, из моего региона больше нельзя, может, местный IP блокируют. Неприятно, но не смертельно — подумал, что как-нибудь обойду. Однако все известные мне обходные маршруты результата не дали.

Следующие два вечера ушли на попытки. Потом я вспомнил про уведомление на телефоне: на Gmail пришло письмо от Unity. Открыл, прочитал — и вот тут стало совсем не по себе. Меня заблокировали. Попытался зайти в личный кабинет на сайте — то же самое, аккаунт заблокирован. Перманентно, без права на апелляцию? Я не знал. В голове крутилась только одна мысль: «Это из-за региона. Всё, приехали».

Переписка с поддержкой

Решил написать в техподдержку. Место проживания и работы упоминать не стал — просто спросил, в чём причина, и отметил, что правил не нарушал. Ответ пришёл на следующий день, и он меня сильно удивил.

Оказалось, дело не в регионе. До 13 октября нужно было обязательно включить двухфакторную аутентификацию (2FA). Я этого не сделал — и аккаунт заблокировали. Чтобы разблокировать, требовалось подтвердить, что аккаунт действительно мой: предоставить ник, название организации, список купленных ассетов и любые другие данные, которые могут это доказать.

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

И на фоне всего этого — неприятная мысль: неужели придётся заводить новый аккаунт? Мне этого очень не хотелось. Сейчас такая обстановка, что блокировка может прилететь с любой стороны: иностранные сервисы могут закрыться для пользователей нашего региона, а наши — ограничить доступ к зарубежным ресурсам. Поэтому все иностранные сервисы стараюсь регистрировать через Google-аккаунт и не распыляться на другие почтовые сервисы. Заводить ещё одну учётку — значит добавлять себе точку отказа, которую потом снова придётся разблокировывать или терять. Так что я не спешил сдаваться и продолжил собирать информацию.

Как я выкрутился

Решение пришло не сразу. Я вспомнил, что для предыдущей заметки (той самой, «День 0») делал скриншот: поднимал новый проект, и на экране было видно название организации, привязанной к аккаунту. Это уже половина дела.

Дальше — гугл в помощь. В файле %LOCALAPPDATA%\Unity\Editor\Editor.log я нашёл строку UPID Received, а в ней — длинную последовательность шестнадцатеричного числа. Это был тот самый ID проекта. Собрал всё в кучу: указал этот идентификатор, предположил, что ник должен совпадать с именем Google-аккаунта, прикрепил скриншот из своей же статьи. Отправил.

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

И вот что самое обидное. Когда я разгребал почту в Gmail, то нашёл несколько писем от Unity. Они неоднократно предупреждали: включите 2FA, иначе будут последствия. Но я давно забросил этот ящик и использую только сам аккаунт для авторизации на зарубежных ресурсах. Там такой бардак, что письма от Unity просто утонули в спаме.

Вывод

Блокировка не была связана с регионом — это оказалось банальное несоблюдение требований безопасности. В такой момент чувствуешь себя беспомощным, когда доступ к аккаунту зависит от данных, которые ты не помнишь и не хранишь. Но эта история дала мне неожиданный стимул: привести в порядок не только личную и рабочую почту, но и ящики в других сервисах. Потому что вот так, из-за одного пропущенного предупреждения, можно потерять неделю и изрядно потрепать себе нервы. Дорогой урок, но полезный: теперь я не откладываю 2FA и читаю письма от сервисов, которыми пользуюсь.

Дни 11–14. Когда электричество важнее Unity.

После разблокировки аккаунта я было воспрянул духом и собирался наверстать упущенное. Но не тут-то было. Регион, в котором я живу и работаю, на этот раз вмешался по-настоящему — начались веерные отключения электричества. Вечерами и на выходных, то есть именно тогда, когда у меня есть время на Unity, свет почти отсутствовал. Работать на ноутбуке с севшей батареей, сидя в темноте, — сомнительное удовольствие. Так что дни 11–14 из плана прошли практически без практики. Я успел разве что перечитать свои же заметки да повтыкать в пустую сцену, пока не вырубился ноутбук.

Именно поэтому эта заметка выходит с задержкой. Но веерные отключения — не повод сбавлять обороты: энтузиазм остаётся, а практика продолжится, как только появится свет. Дневник есть дневник: если в нём писать только про успехи, он превращается в рекламный проспект. Так что фиксирую как есть — дни 11–14 прошли в режиме энергосбережения. Надеюсь, в следующей заметке будет больше практики и меньше форс-мажоров.

ИТОГ

Возвращаясь к теме из начала, правило про «дни» пришлось расширить: теперь «Дни N–M» могут обозначать не только плановую тему, но и внеплановый период — блокировку, отключения, отпуск. «Дни 3–10. Блокировка» — это не ошибка нумерации, а осознанный формат: плановые дни 3–10 ушли на блокировку. Когда вернусь к плановым темам (ввод, физика, триггеры), они получат свои номера — как именно, решу по ходу, но принцип такой: «день» — это маркер раздела, а не дата в календаре.


Темы, которые должны были идти под маркерами дней 3–10 и 11–14 и которых я так и не коснулся, никуда не делись — просто ждут следующей заметки и получат новые номера. Следующую выпущу вовремя, тут план в силе, но первый месячный отчёт, скорее всего, сдвинется на конец ноября. Планы меняются, а дневник нужен, чтобы фиксировать реальность.