Знакомство

Привет!

Я учусь разрабатывать игры на движке Unity. За моей спиной пока что 3 учебных проекта.

Предыстория

Я спокойно себе пилю проект, никого не трогаю, собираю очередную сборку iOS, открываю проект в Xcode и.... на меня обваливается шквал ошибок. Я начинаю пытаться разобраться в том, как исправить ошибку внутри проекта Xcode. Не выходит...

Бегу судорожно откатывать последние изменения в проекте Unity.... Тщетно.
Переключаюсь с текущей ветки на ветку main, собираю сборку, понимаю что битва только начинается.

Вернусь немного назад. Когда я получил ошибки в Xcode и пытался понять какие изменения в Untiy могли вызвать их, я заметил, что после сборки проекта Xcode, в консоли Untiy появляются предупреждения о том, что не были найдены какие-то скрипты рендеринга. Предполагаю, что раз не были найдены некие скрипты, то это могло повлиять на проект Xcode. Я не знал, существуют они давно или привнесены последними изменениями. Очень много времени трачу на локализацию проблемы (теперь она, как это часто бывает, выглядит пустяком для меня. И так оно и есть). Сокращая детали и подробную историю, постараюсь изложить коротко. Как оказалось, проблема в том, что изначально я создавал проект URP, чтобы просто посмотреть на него, потыкать, сравнить с неURP. Почему то в этом же проекте я начал делать игру. Позже я удалил часть ассетов URP, но как оказалось не все. И предупреждения, которые появлялись после сборки Unity билда говорили о том, что в проекте нет скриптов, используемые в оставшемся шаблоне URP. Решение простое - удалить шаблоны.

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

Ныряю рыбкой в гугл.

И происходит то, что в будущем сподвигло меня на публичное описание проблемы и ее решения... Я ничего не нахожу. Даже носители родного языка всех этих сред разработки ни разу не упомянули об этой проблеме. Так что новичкам я точно помогу.

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

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

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

Я точно понял, что фреймворк, который делает Unity или по крайней мере хедеры фреймворка - это либо чистый C++, либо он там присутствует в том или ином виде. И я полез в настройки UnityFramework связанные с С++. Исходя из прочитанных статей я понял, что искать надо в Apple Clang - Warnings - C++. Но я, естественно, не особо хорошо понимал, что на что влияет в Xcode, мог только догадываться.

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

На исходе третьего дня я в отчаянии открываю другой свой проект, меняю платформу на iOS, собираю проект Xcode, в этом проекте собираю сборку. Она собирается.... Я сравниваю хедеры фреймворка проекта с ошибками и проекта, который спокойно билдит сборки. Хм, они идентичны по использованию двойных кавычек и угловых скобок. Я расстроен. Но следующая мысль — сравнить настройки фреймворка касаемо С++. Последний день наполнен большим количеством напряженных моментов, от почти каждого действия я жду, что оно окажется решающим. Настройки в двух проектах отличаются. Я меняю два параметра с «Да» на «Нет». Запускаю сборку, готовлюсь смотреть, какие из ошибок пропадут... а может появятся другие?.. прикидываю, что попробовать дальше... и я понимаю, что сижу с лицом выражающим тупое удивление.... я вижу саксесс где сказано что‑то типа: «Невозможно запустить сборку, ваше устройство занято».

Я сижу и не знаю что думать. Уже и забыл что я там последнее разрабатывал в своем проекте. И вроде облегчение, можно дальше пилить свой проект, а не копаться в этом... ИКСкоде. А вроде возмущение, два переключателя с «Да» на «Нет»... три дня. Вместо того чтобы разрабатывать, я бился с ошибками, взявшимися из ниоткуда, а решение — переключить два жалких параметра.

Итак, это все лирика, теперь обратим внимание на техническую часть проблемы.

Проблема

В нескольких места, в хедерах фреймворка появляется ошибка: "double-quoted include [название хедера].h in framework header expected angle-bracketed instead". double-quoted include .h in framework header expected angle-bracketed instead

Если пойти на поводу у самонадеянного Xcode, и сменить в указанных им местах двойные кавычки на квадратные(я бы назвал их угловыми) скобки, это вызывает появление противоречивой ошибки, по причине того, что с <> указанные хедеры не находятся. Новая ошибка выглядит так: "'[название хедера].h' file not found with <angled> include; use "quotes" instead". '.h' file not found with <angled> include; use "quotes" instead

Решение давольно простое: переходим в настройки сборки фреймворка. UnityFramework > Build Settings. Листаем список до Apple Clang - Warnings - C++. И в этом разделе меняем Yes на No для Suspicious Moves, Range-based For Loops.

UnityFramework > Build Settings. Листаем список до Apple Clang - Warnings - C++
UnityFramework > Build Settings. Листаем список до Apple Clang - Warnings - C++



Так же можно на всякий случай отключить предупреждения.

Для этого никуда не уходим из Build Settings. Просто листаем до Apple Clang - Warnings - All languages и меняем Yes на No для Quoted Include In Framework Header.

 UnityFramework > Build Settings. Листаем список до Apple Clang - Warnings - All languages
 UnityFramework > Build Settings. Листаем список до Apple Clang - Warnings - All languages

Заключение

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

Это кайф!

Если вдруг кто-то столкнется с этим, не хочу чтобы этот человек потратил 3 дня или вообще не смог решить проблему. Я был бы рад преодолеть ее не за 3 дня, а за 10 минут, загуглив и переключив два - три параметра в настройках.

Комментарии (5)


  1. fedorro
    13.04.2023 18:32
    +5

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

    Вот, например, первая же позиция из гугла: тык, ну или вторая прям со скрином куда жать.

    Подсказка - вырезать из сообщений об ошибках имена конкретных файлов\путей\ид-шников, так лучше находит.

    angle-bracketed instead". double-quoted include .h in framework header expected angle-bracketed instead ... сменить в указанных им местах двойные кавычки на квадратные (я бы назвал их угловыми)

    angle-bracketed - это и есть угловые скобки.

    Ну и почему проблема неустранимая если устраняется в один клик?


    1. 1RC Автор
      13.04.2023 18:32

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


    1. 1RC Автор
      13.04.2023 18:32

      Как раз первые две позиции из Гугла и были одними из тыков о которых я писал в посте. Мою проблему информация в этих источниках не решила.

      Подсказка полезная. Я не сразу понял, что там есть имя файла.


  1. MatveiKyzin744
    13.04.2023 18:32

    Если проблема не удается решить путем переименования файлов или использования экранирования символов, то возможно это связано с ошибкой в самом UnityFramework. В таком случае, решением может быть обновление UnityFramework до последней версии или обращение к службе поддержки Unity для получения дополнительной помощи. Также можно попробовать удалить и повторно добавить UnityFramework в проект Xcode, чтобы устранить возможные ошибки при установке.


    1. 1RC Автор
      13.04.2023 18:32

      Я множество раз пересобирал этот проект в Unity. И собирал сборки из старых коммитов, которые до этого собирались нормально.

      В общем Unity стал собирать сборки с настройками фреймворка, которые не позволяли собрать билд. Либо это Xcode все же стал проставлять их.

      Но после того как я изменил настройки и билд на устройство собрался, новые сборки из Unity перестали собираться/открываться с предустановленными некорректными настройками. Правда раньше иногда я использовал Replace, а не Append при указании места создания проекта Xcode. Теперь же я жму только Append.

      Unity и Xcode были последних версий. Обращение в поддержку было бы крайним шагом. Различные поддержки обычно долго и невнятно отвечают. Еще одним хорошим вариантом являются чаты по Unity в телеграмме. Мне там уже один раз помогали, с вопросом, до который я сам не скоро бы решил.