C#. — Ошибка в Unity


Содержание

Как настроить единичные тесты в Unity и исправить ошибку сбоя сборки?

Я создал следующую структуру:

Теперь, когда я нажимаю кнопку «Запустить все» в окне «Тест-Runner» в Unity, у меня есть следующая ошибка:

В Visual Studio у меня есть два проекта:

Assembly-CSharp (содержащий src)

Тесты (содержащие тесты)

Я добавил Assembly-CSharp в качестве ссылки во втором проекте. Visual Studio может создавать решение без ошибок.

Кто-нибудь знает, как правильно настроить регрессию UnitTest для проекта Unity?

Попробуйте использовать встроенный пользовательский интерфейс Test Runner для настройки папки Test Assembly и первого сценария тестирования.

Используйте Window → Test Runner → EditMode → «Create Test Assembly Folder» , и, как только вы перейдете к новой папке с тестовой сборкой, используйте кнопку » Create Test Script in current folder .

В частности, в вашем Tests.asmdef отсутствует «Редактор», Tests.asmdef по сравнению с настройкой по умолчанию (в Unity 2020.1).

Вам не нужно ничего делать вручную в проекте Visual Studio для настройки ваших тестов.

Обратите внимание, что когда мой файл сборки установлен на «Любая платформа», как показано ниже (как в вашем вопросе):

Мои тесты не отображаются в окне Test Runner.

Когда мой файл сборки явно настроен на включение только платформы «Редактор» (в соответствии с моим предыдущим примером), мои тесты правильно отображаются в окне «Средство выполнения тестов».

(Это поведение кажется мне немного нелогичным.)

Вам также необходимо настроить определение сборки для ваших сценариев. В папке » Scripts » создайте файл определения сборки MyScriptAssembly.asmdef (используя меню «Unity» » MyScriptAssembly.asmdef Assets → Create → Assembly Definition или вручную):

Затем убедитесь, что ваш Tests.asmdef ссылается на Tests.asmdef скрипта:

Вы также можете настроить это в окне инспектора Unity Editor. Смотрите «Ссылки» в Инспекторе при выборе файла .asmdef:

Наконец-то нашел правильное правильное решение для этого. И все это делается через редактор.

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

  1. Создавайте свои тесты как обычно изнутри Unity. С генерацией сборки.
  2. Перейдите в папку «Сценарии» (обычно «Активы/Сценарии») и щелкните правой кнопкой мыши → Создать определение сборки, там также будет создан файл сборки.
  3. Перейдите к информации о тестовой сборке в Unity и добавьте ссылку на вашу реальную сборку, а также убедитесь, что она помечена только для платформы Editor.

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

Имейте в виду, что вы можете безопасно удалить ВСЕ файлы .csproj и .sln в корневой папке, и Unity создаст их заново (также они не должны находиться под контролем исходного кода).


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

  1. Удалите любой файл, связанный с Visual Studio, в папке.
  2. Выберите Активы → Открыть проект С#. Пусть это сделает свое дело.
  3. Если все скомпилировано и запущено, а ваши тесты так же хорошо работают, вы все настроите правильно.

Бонус: у нас также есть несколько отладочных проектов в нашем проекте, которые расположены в Assets/DebugScenes/DebugScripts. Создавая для них отдельную сборку и ссылаясь на реальную сборку сценариев (при необходимости) и помечая ее как платформу Editor, мы гарантируем, что эти сценарии никогда не будут включены в нашу сборку без каких-либо дополнительных шагов во время сборки.

Дополнительное чтение. Вы можете подумать, что не хотите создавать сборку для ВСЕХ ваших скриптов, поскольку вы хотите протестировать только некоторые из них. И действительно, вы можете создать сборку для подпапки, но это доставит вам неприятности, так как тогда вам придется создавать ссылку из одной реальной сборки сценариев в другую. Поэтому убедитесь, что все хорошо, аккуратно и имеет смысл.

Ошибки на С# в Unity

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

У меня есть код

2 ответа

Первая ошибка заключается в том, что метод GameObject.FindGameObjectsWithTag(«Manager»); возвращает массив, и вы пытаетесь присвоить массив типу без массива. Вместо этого вы должны использовать GameObject.FindGameObjectWithTag(«Manager»); (обратите внимание, no ‘s’ в Object), который возвращает только первый GameObject, который соответствует тегу.

Последние две ошибки связаны с первым, так как они также возвращают массивы. Линейный manager.GetComponents () возвращает массивы компонентов. Чтобы вернуть только первый компонент данного типа, используйте manager.GetComponent () .

0 T. W [2020-12-26 06:11:00]

эта ошибка связана с тем, что «FindGameObjectsWithTag» (return []), измените на «FindGameObjectWithTag»

Введение в программирование C# на Unity

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

Unity поддерживает следующие языки программирования: C# и Javascript. Языки C# и Javascript считаются одними из самых популярных среди программистов. На C# пишутся программы для компьютера, веб приложения, а Javascript активно используется для создания интернет-страниц. В нашем случае:

Установка среды разработки

Чтобы писать скрипты, необходим редактор кода. В комплекте с Unity идет MonoDevelop, так что его не требуется устанавливать отдельно. Другой вариант — использовать Visual Studio — мы рекомендуем ее. Сменить среду разработки можно в настройках: Edit → Preferences, а затем выбери панель External Tools.

Вывод сообщения в консоль Unity

Когда ты напишешь свой первый код и добавишь его в Unity, Unity проверит код и, если в нем нет ошибок, произойдет компиляция.

Консоль (англ. — Console) – это панель в Unity, которая отображает ошибки в коде (отображаются красным значком), предупреждения (отображается желтым значком) и позволяет выводить справочную информацию (белый значок). По умолчанию эта панель отображается в нижней части программы в закладке Console. Если эта панель не отображается на экране, то в главном меню выбери Window → Console.

Чтобы создать скрипт выбери Assets → Create → C# Script. Имя скрипта должно быть обязательно на английском и начинаться с большой буквы. Открой созданный скрипт и напиши:

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

Код, который должен вызываться один раз при старте программы, ты можешь написать внутри функции Start(), как в примере выше.


Код, который должен вызываться каждый кадр, ты можешь написать внутри функции Update().

Переменные

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

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

  1. Целочисленные: int (от –2 147 483 648 до 2 147 483 647), long (от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807).
  2. Символы и строки: char (элемент в кодировке UTF-16), string (последовательность элементов в кодировке UTF-16).
  3. С плавающей запятой (дробные): float (от 1,5 × 10–45 до 3,4 × 1038, с точностью до 7 цифр), double (от 5,0 × 10–324 до 1,7 × 10308, с точностью до 15 цифр).
  4. Логические: bool (значение true или false).

Инициализация переменной

Все переменные в C# должны быть объявлены (инициализированы) до их применения. Например:

Задать значение переменной можно, в частности, с помощью оператора присваивания — знак «=». Кроме того, при объявлении переменной можно сразу задать ее значение. Например:

Переменные численных типов можно складывать, вычитать, умножать и делить:

+ — операция сложения;

— операция вычитания;

* — операция умножения;

/ — операция деления.

А вот так сумму чисел можно вывести в консоль:

Счетчик времени с помощью Time.deltaTime

Практически во всех играх требуется знать сколько времени прошло с момента запуска игры (пример: игры на время). Но в Unity мы можем узнать только сколько прошло времени между кадрами (напоминаю, что игра – это набор кадров, которые быстро меняются. В одну секунду количество таких кадров может достигать 60 и больше).

Чтобы узнать сколько времени прошло между кадрами — используется Time.deltaTime.

Чтобы сделать дробное число целым, ставим перед ним (int).

Позиция объекта

Координаты объекта хранятся в компоненте Transform, свойство — position. Каждая координата имеет тип float. Вот так можно выводить координаты объекта в консоль:

C# ошибки в Unity

Привет, У меня есть некоторые ошибки для скриптов. Может быть, вы можете помочь.Ок . C# ошибки в Unity

Я хотел сделать свой текст ярким, каждый второй цвет нового цвета. Но когда я написал сценарий, он дал такие ошибки. Не могли бы вы помочь мне ? Он дал ошибки в Unity.


ошибка CS0619: UnityEngine.Component.renderer’ is obsolete: визуализатор собственности устарела. Вместо этого используйте GetComponent(). (UnityUpgradable) «

ошибка CS1061: Тип UnityEngine.Component’ does not contain a definition for материал» и не метод расширения material’ of type UnityEngine.Component»может быть найдено (вы пропали без вести с помощью директивы или ссылка на сборку?)

а также сценарий

ошибка CS0619 четко сказано, что вы должны сделать: использовать GetComponent () вместо визуализатора, так как он устарел – TheDjentleman

Цукерберг рекомендует:  Семь дней после Нового года как пережить январский застой

C# ошибки в Unity

Привет, У меня есть некоторые ошибки для скриптов. Может быть, вы можете помочь.Ок .

Я хотел сделать свой текст ярким, каждый второй цвет нового цвета. Но когда я написал сценарий, он дал такие ошибки. Не могли бы вы помочь мне ? Он дал ошибки в Unity.

ошибка CS0619: UnityEngine.Component.renderer’ is obsolete: визуализатор собственности устарела. Вместо этого используйте GetComponent(). (UnityUpgradable) «

ошибка CS1061: Тип UnityEngine.Component’ does not contain a definition for материал» и не метод расширения material’ of type UnityEngine.Component»может быть найдено (вы пропали без вести с помощью директивы или ссылка на сборку?)

а также сценарий

Создан 11 июн. 16 2020-06-11 13:52:50 OneARMINAS

ошибка CS0619 четко сказано, что вы должны сделать: использовать GetComponent () вместо визуализатора, так как он устарел – TheDjentleman 11 июн. 16 2020-06-11 13:56:54

1 ответ

Вы больше не можете получить доступ к renderer.material.color непосредственно больше, начиная с Unity 5 вверх. вы должны использовать GetComponent (); , чтобы сначала получить компонент GameObject, затем вы можете получить доступ к материалу с Renderer .

Создан 11 июн. 16 2020-06-11 14:01:32 Programmer

Thank.I будет попробовать. – OneARMINAS 11 июн. 16 2020-06-11 14:08:37

В объекте игры «Текст» нет «Renderer». Что делать сейчас ? – OneARMINAS 11 июн. 16 2020-06-11 14:10:54

@OneARMINAS Что это за ошибка? – Programmer 11 июн. 16 2020-06-11 14:12:10

MissingComponentException: В объекте «Текст» нет «Renderer», но скрипт пытается получить к нему доступ. Возможно, вам нужно добавить рендерера в игровой объект «Текст». Или ваш скрипт должен проверить, прикреплен ли компонент до его использования. Colors.Update() (at Assets/Colors.cs: 24) – OneARMINAS 11 июн. 16 2020-06-11 14:13:32

@OneARMINAS Это потому, что объект, к которому вы прикрепляли скрипт, не имеет «Mesh Renderer». Удалите скрипт с того места, где вы его прикрепляли, и подключите его к игровому объекту с помощью «Mesh Renderer». Создайте простой куб и приложите к нему сценарий. он должен работать, потому что куб имеет «Mesh Renderer» – Programmer 11 июн. 16 2020-06-11 14:18:21

Ok.I попробую. – OneARMINAS 11 июн. 16 2020-06-11 14:19:17

Интеграция Visual Studio C#

Что мне даст эта функция?

Более профессиональную среду разработки C#. Интеллектуальное автодополнение, автоматизированное изменение исходных файлов, умная подсветка синтаксиса и многое другое.


Какое различие между Express и Pro?

VisualStudio C# 2010 это продукт компании Microsoft. Он выпускается в двух версиях — Express и Professional. Редакция Express бесплатна и вы можете скачать её отсюда: http://www.microsoft.com/express/vcsharp/ Редакция Professional не бесплатная, вы можете более подробнее узнать здесь: http://www.microsoft.com/visualstudio/en-us/products/professional/default.mspx

Интеграция Unity с VisualStudio позволит вам создавать и поддерживать файлы VisualStudio проекта автоматически. Кроме того, VisualStudio будет открыт после двойного щелчка по скрипту или по сообщению об ошибке в сонсоли Unity.

У меня есть Visual Studio Express, как я могу её использовать?

  • В Unity выберите меню Assets->Sync MonoDevelop Project
  • Найдите новый файл .sln в дирректории Unity проекта (на одну папку выше папки Assets)
  • Откройте этот файл в Visual Studio Express.
  • Теперь вы можете редактировать ваши файлы скриптов, и переходить назад в Unity чтобы их использовать.

У меня Visual Studio Profesional, как мне использовать её?

  • В Unity, перейдите в Edit->Preferences, и убедитесь, что Visual Studio выбран как предпочтительный внешний редактор.
  • Дважды кликните по C# файлу в вашем проекте. Visual Studio автоматически откроет этот файл для вас.
  • Вы можете редактировать файл, сохранить и перейти обратно в Unity.

Важные пункты:

Не смотря на то, что Visual Studio поставляется со своим собственным компилятором C#, и вы можете использовать его для проверки ваших скриптов на ошибки, Unity по прежнему использует собственный компилятор C# для компиляции ваших скриптов. Однако использование компилятора Visual Studio все равно очень эффективно, потому что вам не нужно постоянно переключаться в Unity чтобы проверить свои скрипты на наличие ошибок.

Компилятор C# в Visual Studio обладает большим количеством возможностей чем C# компилятор в Unity. Это означает, что код (содержащий новейшие возможности C#) не вызовет ошибок в Visual Studio, но может вызвать ошибки в Unity.

Unity автоматически создает и поддерживает файлы .sln и .csproj для Visual Studio. Когда кто-либо добавляет/переименовывает/перемещает/удаляет файлы из под Unity, Unity восстанавливает .sln и .csproj файлы. Так же вы можете добавить файлы в ваш проект Visual Studio. Unity импортирует эти файлы и в следующий раз создаст файлы проекта снова, включив в них добавленные вами файлы.

Unity не обновит файлы проекта Visual Studio после обновления AssetServer или SVN. Вы можете вручную заставить Unity обновить файлы проекта Visual Studio через меню: Assets->Sync MonoDevelop Project

Unity + C# = кликкер? Проблема с большими цифрами

Advanced: Тема повышенной сложности или важная.

Добрый день всем знатокам Unity и C#.

Делаем игру-кликкер на мобилки, необходимо считать большие цифры. Переменная с плавающей запятой, тип double. Проблема возникает когда подсчет доходит до степени E+130 — игра воспринимает число как бесконечность.
Другая проблема при возведении в степень. Если возведение числа доходит до E-49, оно становится таким маленьким, что обнуляется.


Нужны цифры в раза 3 больше. Хочется добиться максимальной точности. Возможно ли решить проблему с обнулением и крашем? Если есть примеры решения этой проблемы, — буду очень признателен за ссылку.

Изображение врага из игры для привлечения внимания

kipar
Да, спасибо, но нужны вычисления и числа с плавающей запятой

Other11
> Да, спасибо, но нужны вычисления и числа с плавающей запятой
Можете назвать хоть одну актуальную причину, почему в игре на мобилке нужна точность как для расчета космологических постоянных для черных дыр?

Kripto289
Коэффициент 1,05 возводится в степень и домножается на показатель урона, который суммируется из ряда критериев. На больших степенях коэффициент ооочень маленький домножается на ооочень большое число. В результате этого если домножать с округлением будут потери. Потери приведут к изменению графика апроксимации, что нельзя допускать.

В общих чертах так.

Other11
Вам действительно необходима точность до n-ого знака после запятой при рассчетах значений порядка > 300?
В смысле, это ж из пушки по воробьям. Ну и вообще, возьмите Decimal и не делайте голову :D

Bk Other11
> Да, спасибо, но нужны вычисления и числа с плавающей запятой
Ну, или GMP подключить или сделать свои вещественные числа, с мантиссой и порядком нужного размера.

Хотя судя по тому что диапазон double от 10e−324 до 1e308 а проблемы возникли намного раньше, ошибка в схеме вычислений.

Всем спасибо за подсказки, будем пробовать :)

Decimal для точных расчетов, double будет искажать часть числа при больших значениях.
Точность double 15-16 значащих цифр, в то время как точность decimal 28-29. Единственно у последнего обработка чуть помедленнее (примерно раз в 10), но учитывая что это все равно практически мгновенно то можно это не учитывать.

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

Я кстати просто сделал в подобной ситуёвине статичный класс, которому передавал значение которое хотел конвертировать, и получал новое значение в string, которое уже можно было спокойно выводить на интерфейсе — типо 9000000000000 передавался как 9Т (9 триллионов).
Т.е. за ширмой хранилось невбенно большое число, а на интерфейс уже не число передавалось, а строка после конвертации числа.
Сам гнкод выглядел навроде:

public string GetConvertValue (int value)<
string convertValue;
if (value >= 1000000) convertValue = (1f * value / 1000000).ToString(‘тут можно указать формат’) + «M»;
else if (value >= 1000) convertValue = (1f * value / 1000).ToString(‘формат’) + «K»;
else convertValue = value.ToString(‘формат’);
return convertValue;
>

Other11
>На больших степенях коэффициент ооочень маленький домножается на ооочень большое число. В результате этого если домножать с округлением будут потери.
Само собой. Чтобы на плавающих числах иметь точность, надо стараться держать порядок всегда как можно ближе к нулю. Поэтому например в чисметах есть такая вещь, как обезразмеривание.

Поэтому либо использовать BigDecimal (точность которого не ограничена), либо при подобных величинах (раз у вас там на 49 порядков различается) просто начинать считать урон внутри в других единицах начиная с определенного момента. Как показывать дело другое.

Только вот в юнити нет BigInteger. :trf:

Sbtrn. Devil
> Только вот в юнити нет BigInteger.
Куда дели?

Приветствую камрады! Спасибо что откликнулись на данную тему! Чутка подробнее о проблеме.

Проблема №1
При возведении в степень числа например Mathf.Pow(0.904f, level), где level 1. 3000, значение стремится к нулю и уже (точно не знаю, на вскидку) при level равном 400, double легким движением превращается в 0.
Поэтому об умножении на например 5.51E-49 можно забыть.
Зачем это нужно спросите Вы. Требуется в формуле аппроксимации для получения требуемого нарастания.

Проблема №2
double от

10-308 использует 15-16 знаков после запятой.
decimal может содержать до 28-29 знаков после запятой.
Одним словом — это не подходит.

9К720
По BigDecimal не нашел внятной информации, да еще и надо как-то умудриться прикрутить к юнити. В C# нет его аналога если меня гугл не подвел.

Dan Diamond
Например нарастить доход 5.51E+99 + 5.51E+7. Как вы поняли в этом случае никакого прироста не будет;)


kipar
Sbtrn. Devil
BigInteger. В данный момент частично используется он. Сразу скажу что показывает он себя очень даже неплохо. Даже на стареньком телефоне нет задержек в подсчетах. Но, это целые числа. Ладно дикие округления, хрен с ними, проблема в другом. Чтобы получить значение нужны промежуточные расчеты с плавающей запятой. А это опять стандартные типы.
На сколько я знаю (хотя из меня еще тот математик) целыми числами аппроксимацию не построить.

Да, кстати, чтобы подключить этот тип нужно в PlayerSettings->Other Settings выставить:
Scripting Runtime Version .NET 4.x Equivalent
Api Compatibility Level .NET Standard 2.0
Не помню, возможно еще что-то сделать (версия юнити и VS). Это гуглится.

Tokarn
Алфавитная нумерация не проблема. Вот мой вариант.

kipar
Покопал в сторону GMP. Есть обертка gnumpnet. Надо пробовать собирать и тестить на андроиде, как себя поведет.
На их сайте не совсем понял какова точность данного типа. В тексте пишут что посчитали 10 в 15 степени, а в таблице от 100 000 чисел. PowerPC 970
1.8 GHz за 0.13 секунды. Даже если так, этого должно хватить. В общем надо как-то цеплять и тестить.

А пока есть еще вариант, с которого я скорее всего начну. Посчитать все возможные значения по основным формулам и занести в код в виде E+n и переводить при старте в BigInteger. Т.е. миновать стандартные типы с плавающей запятой. Меньше расчетов, меньше нагрев, меньше нагрузка на батарею и т.д.
Если и BigInteger подведет буду пробовать GMP, а на худой конец городить свой велосипед из массивов. Боль.

Ошибки C # в Unity

У меня ошибки в скрипте. Но сначала то, что я делаю.

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

ошибка CS0619: ***********.Component.renderer’ is obsolete: средство визуализации свойства устарело. Вместо этого используйте GetComponent (). (UnityUpgradable)»

ошибка CS1061 : тип ***********.Component’ does not contain a definition for материала» и не найден material’ of type метода расширения material’ of type ***********.Component» (отсутствует директива using или ссылка на сборку?)

Цукерберг рекомендует:  Вакансии Artezio

C# ошибки в Unity

Привет, У меня есть некоторые ошибки для скриптов. Может быть, вы можете помочь.Ок . C# ошибки в Unity

Я хотел сделать свой текст ярким, каждый второй цвет нового цвета. Но когда я написал сценарий, он дал такие ошибки. Не могли бы вы помочь мне ? Он дал ошибки в Unity.

ошибка CS0619: UnityEngine.Component.renderer’ is obsolete: визуализатор собственности устарела. Вместо этого используйте GetComponent(). (UnityUpgradable) «

ошибка CS1061: Тип UnityEngine.Component’ does not contain a definition for материал» и не метод расширения material’ of type UnityEngine.Component»может быть найдено (вы пропали без вести с помощью директивы или ссылка на сборку?)

а также сценарий

ошибка CS0619 четко сказано, что вы должны сделать: использовать GetComponent () вместо визуализатора, так как он устарел – TheDjentleman

Использование .NET 4.x в Unity Using .NET 4.x in Unity

C# и .NET, технологии, лежащие в основе базовых сценариев Unity, получают обновления с тех пор, как корпорация Майкрософт выпустила их в 2002 году. C# and .NET, the technologies underlying Unity scripting, have continued to receive updates since Microsoft originally released them in 2002. При этом разработчики Unity могут не знать о постоянном потоке новых функций, добавляемых в язык C# и .NET Framework. But Unity developers may not be aware of the steady stream of new features added to the C# language and .NET Framework. Это связано с тем, что до выхода Unity 2020.1, в Unity использовалась среда выполнения сценариев, эквивалентная .NET 3.5, которая не обновлялась годами. That’s because before Unity 2020.1, Unity has been using a .NET 3.5 equivalent scripting runtime, missing years of updates.

В выпуске Unity 2020.1 появилась экспериментальная версия среды выполнения сценариев, обновленная до версии, совместимой с .NET 4.6 и C# 6. With the release of Unity 2020.1, Unity introduced an experimental version of its scripting runtime upgraded to a .NET 4.6, C# 6 compatible version. В Unity 2020.1 аналогичная среда выполнения .NET 4.x уже не считается экспериментальный, а вот более ранняя аналогичная среда выполнения .NET 3.5 теперь считается устаревшей. In Unity 2020.1, the .NET 4.x equivalent runtime is no longer considered experimental, while the older .NET 3.5 equivalent runtime is now considered to be the legacy version. Ожидается, что в версии Unity 2020.3 обновленная среда выполнения сценариев будет обновлена до C# 7 и станет использоваться по умолчанию. And with the release of Unity 2020.3, Unity is projecting to make the upgraded scripting runtime the default selection, and to update even further to C# 7. Дополнительную информацию и последние новости о стратегии этого продукта см. в этой записи блога Unity и на форуме о предварительных версиях экспериментальных сценариев. For more information and the latest updates on this roadmap, read Unity’s blog post or visit their Experimental Scripting Previews forum. А пока прочтите следующие разделы этой статьи и узнайте о новых функциях, появившихся в среде выполнения сценариев .NET 4.x. In the meantime, check out the sections below to learn more about the new features available now with the .NET 4.x scripting runtime.

Предварительные требования Prerequisites

  • Unity 2020.1 или более поздней версии (рекомендуется 2020.2) Unity 2020.1 or above (2020.2 recommended)
  • Visual Studio 2020 Visual Studio 2020

Включение среды выполнения сценариев .NET 4.x в Unity Enabling the .NET 4.x scripting runtime in Unity

Чтобы включить среду выполнения сценариев .NET 4.x, выполните следующие действия. To enable the .NET 4.x scripting runtime, take the following steps:

Откройте «Параметры проигрывателя» в инспекторе Unity, выбрав параметры Правка > Параметры проигрывателя > Проигрыватель. Open PlayerSettings in the Unity Inspector by selecting Edit > Project Settings > Player.

В разделе Конфигурация откройте раскрывающийся список Версия среды выполнения сценариев и выберите пункт Эквивалент .NET 4.x. Under the Configuration heading, click the Scripting Runtime Version dropdown and select .NET 4.x Equivalent. Программа предложит перезагрузить Unity. You will be prompted to restart Unity.

Выбор между профилями .NET 4.x и .NET Standard 2.0 Choosing between .NET 4.x and .NET Standard 2.0 profiles

После переключения на эквивалентную среду выполнения сценариев .NET 4.x можно указать Уровень совместимости API с помощью раскрывающегося списка в «Параметрах проигрывателя» (Правка > Параметры проигрывателя > Проигрыватель). Once you’ve switched to the .NET 4.x equivalent scripting runtime, you can specify the Api Compatibility Level using the dropdown menu in the PlayerSettings (Edit > Project Settings > Player). У вас есть два варианта: There are two options:

.NET Standard 2.0. .NET Standard 2.0. Этот профиль соответствует профилю .NET Standard 2.0, опубликованному .NET Foundation. This profile matches the .NET Standard 2.0 profile published by the .NET Foundation. Unity рекомендует использовать для новых проектов .NET Standard 2.0. Unity recommends .NET Standard 2.0 for new projects. Эта версия ниже, чем .NET 4.x, что полезно для платформ ограниченного размера. It’s smaller than .NET 4.x, which is advantageous for size-constrained platforms. Кроме того, Unity обеспечивает поддержку этого профиля на всех поддерживаемых Unity платформах. Additionally, Unity has committed to supporting this profile across all platforms that Unity supports.

.NET 4.x. .NET 4.x. Этот профиль предоставляет доступ к последней версии API .NET 4. This profile provides access to the latest .NET 4 API. Он включает все коды, доступные в библиотеках классов .NET Framework, и поддерживает профили .NET Standard 2.0. It includes all of the code available in the .NET Framework class libraries and supports .NET Standard 2.0 profiles as well. Выбирайте профиль .NET 4.x, если для вашего проекта требуется та часть API, которая не входит в профиль .NET Standard 2.0. Use the .NET 4.x profile if your project requires part of the API not included in the .NET Standard 2.0 profile. При этом некоторые части этого API могут поддерживаться не на всех платформах Unity. However, some parts of this API may not be supported on all of Unity’s platforms.

Дополнительные сведения об этих вариантах см. в этой записи блога Unity. You can read more about these options in Unity’s blog post.

Добавление ссылок на сборки при использовании уровня совместимости API .NET 4.x Adding assembly references when using the .NET 4.x Api Compatibility Level

Если в раскрывающемся меню Уровень совместимости API будет выбран параметр .NET Standard 2.0, все сборки в профиле API станут ссылаемыми и доступными для использования. When using the .NET Standard 2.0 setting in the Api Compatibility Level dropdown, all assemblies in the API profile are referenced and usable. При выборе профиля более поздней версии .NET 4.x ссылки на некоторые сборки, которые входят в Unity, по умолчанию не включаются. However, when using the larger .NET 4.x profile, some of the assemblies that Unity ships with aren’t referenced by default. Чтобы использовать эти API, необходимо добавить ссылку на сборку вручную. To use these APIs, you must manually add an assembly reference. Вы можете просмотреть сборки, которые входят в каталог MonoBleedingEdge/lib/mono вашей установки редактора Unity: You can view the assemblies Unity ships with in the MonoBleedingEdge/lib/mono directory of your Unity editor installation:

Например, если вы используете профиль .NET 4.x и хотите использовать HttpClient , необходимо добавить ссылку на сборку System.Net.Http.dll. For example, if you’re using the .NET 4.x profile and want to use HttpClient , you must add an assembly reference for System.Net.Http.dll. Если этого не сделать, компилятор выдаст сообщение об отсутствующей ссылке на сборку: Without it, the compiler will complain that you’re missing an assembly reference:

Visual Studio создает файлы.csproj и .sln для проектов Unity каждый раз, когда они открываются. Visual Studio regenerates .csproj and .sln files for Unity projects each time they’re opened. Это значит, что добавить ссылки на сборки в Visual Studio напрямую нельзя, поскольку при повторном открытии проекта они будут потеряны. As a result, you cannot add assembly references directly in Visual Studio because they’ll be lost upon reopening the project. Вместо этого необходимо использовать специальный текстовый файл с именем mcs.rsp: Instead, a special text file named mcs.rsp must be used:

Создайте текстовый файл с именем mcs.rsp в корневом каталоге Assets проекта Unity. Create a new text file named mcs.rsp in your Unity project’s root Assets directory.

В первой строке пустого текстового файла введите: -r:System.Net.Http.dll , а затем сохраните файл. On the first line in the empty text file, enter: -r:System.Net.Http.dll and then save the file. Вместо System.Net.Http.dll можно указать любую добавленную сборку с отсутствующей ссылкой. You can replace «System.Net.Http.dll» with any included assembly that might be missing a reference.

Перезапустите редактор Unity. Restart the Unity editor.

Преимущества совместимости с .NET Taking advantage of .NET compatibility

Помимо новых возможностей синтаксиса и языка C#, среда выполнения сценариев .NET 4.x предоставляет пользователям Unity доступ к огромной библиотеке пакетов .NET, несовместимых с устаревшей средой выполнения сценариев .NET 3.5. In addition to new C# syntax and language features, the .NET 4.x scripting runtime gives Unity users access to a huge library of .NET packages that are incompatible with the legacy .NET 3.5 scripting runtime.

Добавление пакетов из NuGet в проект Unity Add packages from NuGet to a Unity project

NuGet — это диспетчер пакетов для .NET. NuGet is the package manager for .NET. NuGet интегрирована в Visual Studio. NuGet is integrated into Visual Studio. При этом для добавления пакетов NuGet в проекты Unity требуется специальный процесс. However, Unity projects require a special process to add NuGet packages. Это связано с тем, что при открытии проекта в Unity все файлы проектов Visual Studio формируются заново, а ненужные конфигурации отменяются. This is because when you open a project in Unity, its Visual Studio project files are regenerated, undoing necessary configurations. Чтобы добавить пакет из NuGet в проект Unity, выполните следующие действия. To add a package from NuGet to your Unity project do the following:

Откройте NuGet и найдите совместимый пакет, который вам нужно добавить (.NET Standard 2.0 или .NET 4.x). Browse NuGet to locate a compatible package you’d like to add (.NET Standard 2.0 or .NET 4.x). В этом примере показано добавление Json.NET (популярного пакета для работы с JSON) в проект .NET Standard 2.0. This example will demonstrate adding Json.NET, a popular package for working with JSON, to a .NET Standard 2.0 project.

Нажмите кнопку Загрузить: Click the Download button:

Найдите загруженный файл и измените его расширение с .nupkg на .zip. Locate the downloaded file and change the extension from .nupkg to .zip.


В ZIP-файле зайдите в каталог lib/netstandard2.0 и скопируйте файл Newtonsoft.Json.dll. Within the zip file, navigate to the lib/netstandard2.0 directory and copy the Newtonsoft.Json.dll file.

В папке Assets в корневом каталоге проекта Unity создайте папку с именем Plugins (Подключаемые модули). In your Unity project’s root Assets folder, create a new folder named Plugins. В Unity «Plugins» — это имя специальной папки. Plugins is a special folder name in Unity. Дополнительные сведения см. в документации по Unity. See the Unity documentation for more information.

Скопируйте файл Newtonsoft.Json.dll в каталог Plugins проекта Unity. Paste the Newtonsoft.Json.dll file into your Unity project’s Plugins directory.

Создайте файл с именем link.xml в каталоге Assets проекта Unity и добавьте приведенный ниже код XML. Create a file named link.xml in your Unity project’s Assets directory and add the following XML. Это нужно для того, чтобы процесс удаления байт-кода в Unity не удалял необходимые данные при экспорте в платформу IL2CPP. This will ensure Unity’s bytecode stripping process does not remove necessary data when exporting to an IL2CPP platform. Несмотря на то что это действие относится только к данной библиотеке, проблемы могут возникнуть и с другими библиотеками, которые используют отражение подобным образом. While this step is specific to this library, you may run into problems with other libraries that use Reflection in similar ways. Дополнительные сведения на эту тему см. в документации по Unity. For more information, please see Unity’s docs on this topic.

Теперь пакет Json.NET готов к работе. With everything in place, you can now use the Json.NET package.

Это простой пример использования библиотеки без зависимостей. This is a simple example of using a library which has no dependencies. Если одни пакеты NuGet зависят от других, необходимо вручную загрузить эти зависимости и добавить их в проект таким же образом. When NuGet packages rely on other NuGet packages, you would need to download these dependencies manually and add them to the project in the same way.

Новые возможности синтаксиса и языка New syntax and language features

Обновленная среда выполнения сценариев предоставляет разработчикам Unity доступ к C# 6 и целому ряду новых возможностей синтаксиса и языка. Using the updated scripting runtime gives Unity developers access to C# 6 and a host of new language features and syntax.

Инициализаторы автосвойств Auto-property initializers

Синтаксис автосвойств в среде выполнения сценариев Unity .NET 3.5 позволял быстро определить неинициализированные свойства, но саму инициализацию нужно прописывать в сценарии отдельно. In Unity’s .NET 3.5 scripting runtime, the auto-property syntax makes it easy to quickly define uninitialized properties, but initialization has to happen elsewhere in your script. В среде выполнения .NET 4.x автосвойства можно инициализировать в той же строке: Now with the .NET 4.x runtime, it’s possible to initialize auto-properties in the same line:

Интерполяция строк String interpolation

В более ранней среде выполнения .NET 3.5 синтаксис объединения строк был громоздким. With the older .NET 3.5 runtime, string concatenation required awkward syntax. В новой среде выполнения .NET 4.x есть функция $ интерполяции строк, которая позволяет вставлять выражения в строки, используя более прямой и удобочитаемый синтаксис: Now with the .NET 4.x runtime, the $ string interpolation feature allows expressions to be inserted into strings in a more direct and readable syntax:

Элементы, воплощающие выражение Expression-bodied members

Новый синтаксис C# в среде выполнения .NET 4.x позволяет заменять тело функций на лямбда-выражения и, таким образом, делать их более краткими: With the newer C# syntax available in the .NET 4.x runtime, lambda expressions can replace the body of functions to make them more succinct:

Члены, заданные выражениями, теперь можно использовать также в свойствах, доступных только для чтения: You can also use expression-bodied members in read-only properties:

Асинхронный шаблон, основанный на задачах (TAP) Task-based Asynchronous Pattern (TAP)

Асинхронное программирование позволяет выполнять длинные операции без зависания приложений. Asynchronous programming allows time consuming operations to take place without causing your application to become unresponsive. Кроме того, с помощью этой функции можно сделать так, чтобы код, в котором используются результаты ресурсоемких операций, выполнялся только после того, как будут выполнены эти операции, This functionality also allows your code to wait for time consuming operations to finish before continuing with code that depends on the results of these operations. например после загрузки определенного файла или завершения сетевой операции. For example, you could wait for a file to load or a network operation to complete.

В Unity асинхронное программирование обычно выполняется с соподпрограммами. In Unity, asynchronous programming is typically accomplished with coroutines. Однако начиная с C# 5 предпочтительным методом асинхронного программирования в среде разработки .NET стал Асинхронный шаблон, основанный на задачах (TAP), с использованием ключевых слов async и await в System.Threading.Task. However, since C# 5, the preferred method of asynchronous programming in .NET development has been the Task-based Asynchronous Pattern (TAP) using the async and await keywords with System.Threading.Task. Таким образом, для функции async можно задать ожидание завершения задачи ( await ) без запрета обновлений в остальной части приложения: In summary, in an async function you can await a task’s completion without blocking the rest of your application from updating:

TAP — это сложная тема с определенными характерными для Unity нюансами, которые разработчикам необходимо учитывать, TAP is a complex subject, with Unity-specific nuances developers should consider. поэтому его нельзя назвать универсальной заменой соподпрограммам в Unity. Тем не менее это полезный инструмент. As a result, TAP isn’t a universal replacement for coroutines in Unity; however, it is another tool to leverage. Сфера применения этого компонента выходит за рамки данной статьи, но некоторые общие рекомендации и советы вы найдете ниже. The scope of this feature is beyond this article, but some general best practices and tips are provided below.

Начало работы с TAP в Unity Getting started reference for TAP with Unity

Эти советы помогут вам приступить к работе с TAP в Unity. These tips can help you get started with TAP in Unity:

Различия между соподпрограммами и TAP Differences between coroutines and TAP

Между соподпрограммами и TAP (async-await) есть несколько важных различий. There are some important differences between coroutines and TAP / async-await:

  • Соподпрограммы не могут возвращать значения, а Task может. Coroutines cannot return values, but Task can.
  • Вставить yield в оператор try-catch нельзя, что затрудняет обработку ошибок при использовании соподпрограмм. You cannot put a yield in a try-catch statement, making error handling difficult with coroutines. При этом try-catch работает с TAP. However, try-catch works with TAP.
  • Функция соподпрограмм в Unity недоступна в классах, которые не являются производными от MonoBehaviour. Unity’s coroutine feature isn’t available in classes that don’t derive from MonoBehaviour. Для асинхронного программирования в таких классах отлично подходит TAP. TAP is great for asynchronous programming in such classes.
  • В настоящее время Unity не предлагает TAP как полную замену соподпрограмм. At this point, Unity doesn’t suggest TAP as a wholesale replacement of coroutines. Узнать результаты применения одного или другого подхода для конкретного проекта можно только путем профилирования. Profiling is the only way to know the specific results of one approach versus the other for any given project.

В Unity 2020.2 отладка асинхронных методов с использованием точек останова не поддерживается в полном объеме; эта возможность будет реализована в Unity 2020.3. As of Unity 2020.2, debugging async methods with break points isn’t fully supported; however, this functionality is expected in Unity 2020.3.

Оператор nameof nameof operator

Оператор nameof получает строковое имя, тип или член переменной. The nameof operator gets the string name of a variable, type, or member. В некоторых случаях nameof удобно использовать для регистрации ошибок и получения строкового имени перечисления. Some cases where nameof comes in handy are logging errors, and getting the string name of an enum:

Информационные атрибуты вызывающего объекта Caller info attributes

Информационные атрибуты вызывающего объекта содержат информацию о вызывающем объекте метода. Caller info attributes provide information about the caller of a method. Для каждого параметра, который вы хотите использовать c информационным атрибутом вызывающего объекта, необходимо указать значение по умолчанию. You must provide a default value for each parameter you want to use with a Caller Info attribute:

Директива using static Using static

Директива using static позволяет использовать статические функции, не указывая имя класса. Using static allows you to use static functions without typing its class name. Директива using static помогает сэкономить место и время при использовании нескольких статических функций одного класса. With using static, you can save space and time if you need to use several static functions from the same class:

Рекомендации по IL2CPP IL2CPP Considerations

При экспорте ваших игр в такие платформы, как iOS, Unity с помощью IL2CPP «транскомпилирует» IL в код C++, который затем компилируется собственным компилятором целевой платформы. When exporting your game to platforms like iOS, Unity will use its IL2CPP engine to «transpile» IL to C++ code which is then compiled using the native compiler of the target platform. Некоторые функции .NET при этом не поддерживаются — это части функции отражения и ключевое слово dynamic . In this scenario, there are several .NET features which are not supported, such as parts of Reflection, and usage of the dynamic keyword. Вы можете использовать их для управления в собственном коде, но при работе с DLL и SDK других разработчиков, созданными без расчета на Unity и IL2CPP, вы можете столкнуться с проблемами. While you can control using these features in your own code, you may run into problems using 3rd party DLLs and SDKs which were not written with Unity and IL2CPP in mind. Дополнительные сведения на эту тему см. в документации об ограничениях сценариев на веб-сайте Unity. For more information on this topic, please see the Scripting Restrictions docs on Unity’s site.

Кроме того, как уже говорилось в приведенном выше примере Json.NET, во время экспорта IL2CPP Unity попытается удалить неиспользуемый код. Additionally, as mentioned in the Json.NET example above, Unity will attempt to strip out unused code during the IL2CPP export process. Обычно это не страшно, но в случае с библиотеками, где используется отражение, это может привести к случайному удалению свойств или методов, которые будут вызываться в среде выполнения и не могут быть заданы во время экспорта. While this typically isn’t an issue, with libraries that use Reflection, it can accidentally strip out properties or methods that will be called at run time that can’t be determined at export time. Для решения этой проблемы добавьте в свой проект файл link.xml, содержащий список сборок и пространств имен, к которым не нужно применять процесс удаления. To fix these issues, add a link.xml file to your project which contains a list of assemblies and namespaces to not run the stripping process against. Дополнительные сведения см. в документации Unity по удалению байт-кода. For full details, please see Unity’s docs on bytecode stripping.

Образец проекта Unity в .NET 4.x .NET 4.x Sample Unity Project

Данный образец содержит примеры использования нескольких функций .NET 4.x. The sample contains examples of several .NET 4.x features. Загрузить проект или просмотреть исходный код можно в GitHub. You can download the project or view the source code on GitHub.

Цукерберг рекомендует:  Почему быть фрилансером плохо
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих