Обновление до Unity 2021 LTS
На этой странице перечислены изменения в версии Unity 2021 LTS, которые могут повлиять на существующие проекты при обновлении с версии 2020 на 2021 LTS.
Примечание: 2021 LTS также известен как 2021.3.
Контуры страницы
- Конвейеры рендеринга
- Симулятор устройства
- Окружающая среда освещения
- Освещение окружающей среды: зонд окружающей среды и зонд отражения Skybox теперь автоматически запекаются
- Включить предпочтение покрытия кода
- Particle System Силовые поля
- Particle System Задержка начала + скорость на расстоянии эмиссии
- BuildReport - PackedAssets
- Территория APIs вне экспериментальной (WIP)
- Texture2D.Resize переименован в Переинициализация
- Android изменения
- UI Toolkit — По умолчанию scaleMode для Изображение изменено
- Mono изменения поведения обновления
- Адаптивная производительность
- RenderTexture DepthStencilFormat
- Графические форматы DepthAuto, ShadowAuto и VideoAuto устарели
- WebGL: Обновленный Emscripten до 2.0.19
- Progressive GPU Lightmapper отказалась от поддержки CPU OpenCL устройств
- OnPostprocessAllAssets изменения поведения
- Смешанные точечные и спотовые источники света без теней, прямой свет в субтрактивном режиме освещения
- Улучшения системы ключевых слов для шейдеров
- Unity поддерживает .NET стандарт 2.1 APIs
- Windows XR плагин удален
Конвейеры отображения
Это руководство по обновлению описывает, как обновить до версии 2021 встроенный конвейер рендеринга Unity. Чтобы обновить другие конвейеры рендеринга до версии 2021, см.:
- Руководство по обновлению URP
- Руководство по обновлению HDRP
Чтобы обновить другие пакеты, обратитесь к документации для используемых пакетов.
Симулятор устройства
Симулятор устройства теперь входит в состав Editor и доступен из окна Game. Чтобы настроить Device Simulator, добавьте пространство имён UnityEngine.Device к классам Screen, Application и SystemInfo: UnityEngine.Device.Screen; UnityEngine.Device.Application; UnityEngine.Device.SystemInfo;
Чтобы переключиться на UnityEngine.Device, добавьте следующую логику в каждый скрипт, который вы хотите использовать с симулятором: lang-cs
using Screen = UnityEngine.Device.Screen;
using Application = UnityEngine.Device.Application;
using SystemInfo = UnityEngine.Device.SystemInfo;
Новое пространство имен UnityEngine.Device плавно переходит из Симулятора (в Редакторе) на фактическое устройство API с сборкой времени выполнения.
Освещение окружающей среды
Редактор теперь автоматически запекает по умолчанию Skybox зонд и зонд окружающей среды и сохраняет эти данные до тех пор, пока вы вручную запекать Scene. Когда вы обновляете, сцены с никаким вкладом окружающего света могут визуально изменить. Для того чтобы восстановить первоначальный вид этих сцен, установите освещение окружающей среды множитель интенсивности 0. В качестве альтернативы, установите skybox на черный, запечь сцену, а затем сбросить skybox на ваш предпочтительный цвет неба.
Освещение окружающей среды: зонд окружающей среды и зонд отражения Skybox теперь автоматически выпекаются
UnityПрогрессивный Lightmapper теперь автоматически генерирует зонд окружающей среды и зонд отражения skybox для каждой сцены по умолчанию. Это означает, что сцена автоматически получает окружающее освещение в соответствии с настройками в Окружающая среда вкладка в Освещение Editor обновляет данные зонда окружающей среды и зонда отражения skybox каждый раз, когда изменяется освещение окружающей среды, до тех пор, пока вы не генерируете освещение. Создание освещения редактор прекращает обновление зондов, и обновляет их только при следующем выпекании. Когда вы включаете Автогенерировать Если вы создаете освещение, а затем удаляете эти данные освещения, удаляя из проекта объект Lighting Data Asset, Редактор автоматически создает зонд окружающей среды и зонд отражения skybox снова.
Существует одна ситуация, которая требует действий при обновлении проекта. Это когда вы не хотите иметь любой вклад освещения окружающей среды в проекте, который также:
- Не имеет ассета данных освещения.
- Нет Auto Generate включено.
- Имеет вклад в окружающую среду, установленный на цвет, отличающийся от черного.
В этой ситуации перейдите в Окно > Рендирование > Освещение > Окружающая среда и отключите вклад автоматически генерируемых зондов окружающей среды и зонда отражения skybox, сделав одно из следующих изменений:
- Вариант 1: Установите Множитель Интенсивности на 0.
- Вариант 2: Используйте черный Skybox Материал.
- Вариант 3: Используйте черный цвет в режиме Цвет или Градиент для Источник.
Включить настройку "Охват кода"
Интерфейс управления Code Coverage перенесён из General Preferences в Пакет кодового охвата.
Пакет Code Coverage доступен в виде выпущенного пакета через Package Manager для Unity 2019.3 и выше. Последняя версия — 1.0.0.
Для включения покрытия кода можно использовать один из следующих методов:
- Установка пакета Code Coverage, откройте Окно охвата кода (Окно > Анализ > Охват кодов) и выберите Включить покрытие кода.
- Используйте Аргумент командной строки
-enableCodeCoverageв пакетном режиме. - Используйте
Coverage.enabledAPI. Пример класса:
// Create a new C# script called CodeCoverageMenuItem and place it
// under the Editor folder.
// This class creates a toggle menu item under Code Coverage > Enable
// Code Coverage. Use it to enable/disable Code Coverage.
using UnityEditor;
using UnityEngine.TestTools;
class CodeCoverageMenuItem
{
const string EnableCodeCoverageItemName = "Code Coverage/Enable Code Coverage";
[MenuItem(EnableCodeCoverageItemName, false)]
static void EnableCodeCoverage()
{
Coverage.enabled = !Coverage.enabled;
}
[MenuItem(EnableCodeCoverageItemName, true)]
static bool EnableCodeCoverageValidate()
{
Menu.SetChecked(EnableCodeCoverageItemName, Coverage.enabled);
return true;
}
}
Particle System Силовые поля
Раньше некоторые свойства Силового поля по-разному действовали при различных частотах кадров (или при использовании шкалы времени в настройках Менеджера времени).
Particle System теперь использует базовую частоту кадров в 30 кадров в секунду в качестве основы для моделирования. Если ваше приложение работает с другой частотой кадров, следующие настройки могут вести себя иначе по сравнению с предыдущими версиями Unity:
- Гравитация
- Ротация
- Векторные поля
Если эти настройки затронуты, отрегулируйте силу пострадавших областей, чтобы получить желаемый вид.
Particle System Задержка начала + скорость на расстоянии эмиссии
Раньше скорость передачи по расстоянию игнорировала настройку задержки начала. Теперь, если настройка задержки начала определена, она задерживает начало передачи по расстоянию.
Если это поле было установлено ранее, возможно, потребуется его изменить.
BuildReport - PackedAssets
PackedAssets.file был помечен как устаревший без прямой замены. Ранее он содержал целое число, обозначающее идентификатор файла или индекс в BuildReport.files Для поиска файлов BuildReport теперь используйте PackedAssets.shortPath.
Территория APIs из экспериментальной (WIP)
Экспериментальная местность APIs была перемещена в неэкспериментальное пространство имен. Также произошли некоторые небольшие изменения в местности API. Если вы использовали экспериментальную местность APIs, используйте следующую APIs вместо нее:
-
UnityEngine.TerrainTools; -
UnityEditor.TerrainTools; -
UnityEngine.TerrainUtils;
Вот полный список изменений API:
- В большинстве случаев
UnityEngine.Experimental.TerrainAPIиUnityEditor.Experimental.TerrainAPIтеперь являютсяUnityEngine.TerrainToolsиUnityEditor.TerrainToolsсоответственно. Некоторые APIs времени выполнения переместились в новое пространство именUnityEngine.TerrainUtils. -
GetDesc()1998 годаTerrainPaintTool<T>класс переименован вGetDescription(). -
TerrainUtilityкласс перенесён изUnityEngine.Experimental.TerrainAPIдоUnityEngine.TerrainUtils. -
TerrainUtility.TerrainMapкласс больше не является внутренним и принадлежитUnityEngine.TerrainUtilsпространство имен. -
TerrainMap.TileCoordструктуры более не входит вTerrainMapкласс переименован вTerrainTileCoord, и в настоящее время является также частьюUnityEngine.TerrainUtilsпространство имен. -
UnityEditor.Experimental.TerrainAPI.BrushPreviewModeперечисление переименовано вTerrainBrushPreviewModeи переехал вUnityEditor.TerrainToolsпространство имен. -
TerrainPaintUtilityEditor.BuiltinPaintMaterialPassesперечисление перенесено изTerrainPaintUtilityEditorкласс и вUnityEditor.TerrainToolsпространства имен. Он также был переименован вTerrainBuiltinPaintMaterialPasses. - Три функции
ShowBrushGUIвIOnInspectorGUIбыли объединены в одну функцию со значениями параметров по умолчанию вместо различных перегруженных функций. TerrainFilterудален. ИспользуйтеSystem.Predicate<Terrain>вместо него.
Texture2D.Resize переименован в Переинициализация
Texture2D.Resize и его перегрузки были переименованы в Texture2D.Reinitialize.
Обновитель API должен переименовать его автоматически. Если нет, измените любое использование Texture2D.Resize на Texture2D.Reinitialize.
Android изменения
Большая часть конвейера сборки Android теперь является постепенной, а Unity удалил следующие возможности, которые были в предыдущем конвейере сборки:
- Unity больше не копирует ассеты проекта Gradle, расположенные в Ассеты/Плагины/Android/[рес, ассеты] к проекту Gradle.
- Раньше вы могли помещать ресурсы Gradle в эту папку и Unity копировал их в проект Gradle. Теперь вы должны использовать плагины AAR или androidlib для передачи приложению дополнительных ресурсов Gradle.
- Если вы помещаете ресурсы проекта в эту папку, Unity показывает сообщение об ошибке сборки.
- Unity больше не игнорирует файлы внутри GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN комментарии.
- Ранее Unity не перезаписывал файлы, если вы удаляли этот комментарий. Если вы не удаляли комментарий, Unity всегда регенерировал файлы build.gradle, manifest и UnityPlayerActivity.
- Если требуется, чтобы изменения сохранялись с помощью нового конвейера построения, используйте шаблоны.
- При экспорте проекта Android Unity больше не создает zip-пакет символов. Символы теперь доступны в каталоге unityLibrary\symbols, который можно распаковать. Причина этого изменения в том, что при экспорте проекта доступны не все файлы символов; Gradle создает символы
libil2cpp.soпри сборке приложения. - Изменено, как Unity проверяет, совместим ли obb с apk. Как apk, так и obb теперь имеют файл unity_obb_guid внутри них, и если содержимое соответствует между ними, Unity рассматривает их как совместимые.
- Для пользовательских скриптов сборки, которые используют PatchPackage, обратите внимание, что Patch/Patch & Run теперь работает со всеми типами ассетов и не требует сборки только скриптов.
Файл по умолчанию mainTemplate.gradle изменился. Если вы используете пользовательский главный шаблон, вы должны воссоздать его и повторно применить изменения сверху. В противном случае ваше приложение может испытывать регрессию производительности, если оно использует Resources.Load.
UI Toolkit — По умолчанию scaleMode для изменения изображения
По умолчанию Image.scaleMode был изменен с ScaleAndCrop на ScaleToFit.
Ожидается, что изображение будет масштабироваться под размер элемента, поэтому мы изменили значение Image.scaleMode по умолчанию на ScaleToFit. Если вы не переопределяли режим масштабирования Image, часть обрезанных изображений может уменьшиться до размера элемента. Если для ваших изображений нужен режим ScaleAndCrop, переопределите их стиль, добавив следующее значение во встроенный стиль в файле UXML:
-unity-background-scale-mode: scale-and-crop;
Можно также создать стилевой класс с этим переопределением и применить его к изображениям, которым нужен ScaleAndCrop.
Mono изменения поведения обновления
Базовое время выполнения C#, Mono, было обновлено в последней версии. Это включает в себя много исправлений из первоначальной версии Mono, и некоторые заметные изменения в поведении.
-
Directory.GetFilesбольше не гарантирует возвращение сортированного списка.- Раньше это всегда возвращало алфавитно-сортированный список элементов. Если ваш проект требует, чтобы элементы возвращались в одном и том же порядке каждый раз, сортируйте возвращаемый список. Например: var files =
Directory.GetFiles(dir).OrderBy(f => f);
- Раньше это всегда возвращало алфавитно-сортированный список элементов. Если ваш проект требует, чтобы элементы возвращались в одном и том же порядке каждый раз, сортируйте возвращаемый список. Например: var files =
-
Object.GetHashCodeтеперь возвращает другое значение и не следует полагаться на него как на детерминированный алгоритм хэширования между операционными системами.- В целом, вы не должны использовать результат
GetHashCodeвне текущего процесса, то есть не сериализируйте его и не ожидайте, что он будет таким же в следующий раз, когда код запускается в новом процессе. Unity рекомендует использовать детерминистический алгоритм хеширования, такой как MD5.
- В целом, вы не должны использовать результат
- Некоторые исправления ошибок привели к появлению новых исключений. Кроме того, изменилось содержание некоторых сообщений об исключениях.
- Это новое поведение будет особенно заметно в сценариях автоматического тестирования и может потребовать изменения ожидаемого поведения, если тесты анализируют журналы для определенных сообщений об исключениях.
Адаптивная производительность
Версия 3.0 Для получения информации о том, как обновить до версии 1.0.0, смотрите статью Обновление до версии 1.0.0. 3.0, см. Руководства по обновлению адаптивной производительности.
RenderTexture DepthStencilFormat
Раньше, если вы установили свойство RenderTexture.depth на 32 бита, вы могли получить D24_S8 в зависимости от платформы. Теперь, если вы установили его на 32 бита, вы получите D32_S8 с 32 битами для компонента глубины, если этот формат поддерживается текущей платформой. Однако это удвояет использование памяти для этого буфера глубины.
Новое свойство RenderTexture.depthStencilFormat возвращает формат, который графика API использует для создания ресурса в видеопамяти. Вы также можете использовать это свойство для запроса конкретного формата. Однако не все платформы поддерживают все форматы шаблона глубины. Когда вы устанавливаете свойство DepthStencilFormat на неподдерживаемый формат, Unity автоматически выбирает совместимый формат, имеющий равное или большее количество бит для компонентов глубины и шаблона.
Модернизация
Ассет RenderTexture теперь сериализирует выбранный вами формат шаблона глубины. Если вы используете API, который принимает число бит вместо формата, эти биты сопоставляются с форматом и этот формат сериализуется. Ассеты RenderTexture из предыдущих версий, у которых глубина была установлена на более чем 16 бит, автоматически обновляются для использования D24_S8.
На некоторых платформах (например, Windows), которые используют DirectX графику API, это приводит к формату с меньшим количеством бит глубины, потому что графический сервер внутренне выбирает формат D32_S8, если вы устанавливаете биты>16. Чтобы обеспечить последовательное обновление на всех платформах, D24_S8 используется на всех платформах для автоматического обновления. Однако это может привести к визуальным артефактам в выводе рендеринга вашего проекта, если у вас есть RenderTexture ассеты в вашем проекте. Просмотрите эти ассеты и измените формат шаблона глубины на D32_S8, когда это необходимо. Могут возникнуть следующие проблемы:
- Размер памяти может увеличиться для RenderTextures, который вы используете. Тем не менее, сообщенная память теперь верна.
- Теперь, когда установка свойства глубины на 32 бита дает 32-битный компонент глубины, использование памяти увеличивается. Чтобы избежать этого, установите биты на 24 и используйте D24_S8, если это поддерживается вашей платформой.
- Если платформа не поддерживает D24_S8, Unity возврат к совместимому формату D32_S8 по умолчанию. Чтобы предотвратить это, в Inspector окно, отключить Включить совместимый формат свойства на ассет. Unity не поддерживает формат D32_S8 и он не может упасть назад, вы видите сообщение об ошибке: RenderTexture.Create failed: формат глубины/шаблона не поддерживается. На этой платформе не существует совместимого формата, или же в инспекторе импорта отключена возможность перехода к совместимому формату.. В большинстве случаев, чтобы решить проблему, вы можете включить Включить совместимый формат.
Графические форматы DepthAuto, ShadowAuto и VideoAuto устарели
Следующие графические форматы теперь устарели:
- DepthAuto
- ShadowAuto
- VideoAuto
Эти форматы Авто неясно о точном формате, который используется и может варьироваться в зависимости от платформы.
Шаги для удаления использования этих устаревших форматов зависят от формата и сценария использования.
Для VideoAuto
Чтобы получить автоматический формат видео текущей платформы, используйте SystemInfo.GetGraphicsFormat(DefaultFormat.Video).
Для DepthAuto/ShadowAuto используется для указания текстуры рендеринга только глубины.
GraphicsFormat API часто использует DepthAuto или ShadowAuto для создания текстур рендеринга с рендерингом только глубины и без цветового буфера. Примеры этого сценария использования:
renderTextureDescriptor.graphicsFormat = GraphicsFormat.ShadowAutoRenderTexture.GetTemporary(width, height, bits, GraphicsFormat.ShadowAuto)
Чтобы указать отображение только глубины (без цвета), используйте GraphicsFormat.None в качестве нового цветового формата. renderTextureDescriptor.graphicsFormat = GraphicsFormat.None;
Если вы использовали ShadowAuto, установите shadowSamplingMode из вашего RenderTextureDescriptor на ShadowSamplingMode.CompareDepths, чтобы включить выборку сравнения глубины на текстуре глубины, и измените код, чтобы использовать перегрузку, которая занимает RenderTextureDescriptor. renderTextureDescriptor.shadowSamplingMode = ShadowSamplingMode.CompareDepths;
Для DepthAuto/ShadowAuto в других ситуациях
В некоторых ситуациях форматы DepthAuto/ShadowAuto представляли автоматически выбранный формат глубины, подходящий для текущей платформы. Чтобы заменить устаревшие значения в этом случае, используйте SystemInfo.GetGraphicsFormat(DefaultFormat.Depth/Shadow)
WebGL: Обновленный Emscripten до 2.0.19
Цель asm.js Linker, которая была доступна для продвинутых пользователей, больше не доступна.
- В Unity 2021.2, базовый компилятор Emscripten, используемый платформой WebGL, был обновлен до версии 2.0.19. Это обновило формат объектного файла нативного кода, и поэтому требует перекомпилирования всех плагинов нативного кода (C/C++ code plugins) в проекте. Если вы используете закрытые сторонние плагины из Unity Asset Store, например, не забудьте спросить автора об обновленной версии для Unity 2021.2.
- Функция JavaScript среды выполнения Emscripten
Pointer_stringify()теперь устарела. Вместо неё вызывайте функциюUTF8ToString(), чтобы преобразовать C-строку в кодировке UTF8 с завершающим нулевым символом из кучи WebAssembly в строку JavaScript.
Прогрессивный GPU Lightmapper отказалась от поддержки CPU OpenCL устройств
Прогрессивный GPU Lightmapper больше не поддерживает устройства CPU OpenCL. Если не найдено поддерживаемого устройства GPU, но обнаружено устройство CPU OpenCL, появится предупреждение о том, что это устройство будет пропущено и возвращено к Прогрессивному CPU Lightmapper. Прогрессивный CPU Lightmapper обеспечивает лучшую производительность для вычислений карт освещения на основе CPU. Это изменение поведения произойдет автоматически, и карты освещения будут вычисляться как ожидалось.
OnPostprocessAllAssets изменения поведения
Когда Unity вызывает методы InitializeOnLoad во время импорта ассетов загрузка ассетов может завершиться неудачей. Во время импорта ассетов база данных ассетов обновляет своё состояние, и Unity не может определить, какие ассеты уже импортированы. Методы InitializeOnLoad не могут загружать ассеты, которые не были импортированы.
Для улучшения процесса импорта ассетов был усовершенствован обратный вызов OnPostprocessAllAssets. В частности, обратный вызов OnPostprocessAllAssets:
- Может выполнять инициализацию после перезагрузки домена, когда база данных ассетов гарантированно находится в готовом состоянии.
- Содержит параметр
didDomainReload, который устанавливается в true, если домен был перезагружен. - Поддерживает операции с ассетами. Это включает загрузку ассетов, которая ведется так же, как и загрузка ассетов с помощью пункта меню.
- Вышел из цикла импорта базы данных ассетов. Обработка обратного вызова отложена до завершения импорта ассетов.
Переместите любую связанную с доменом логику инициализации, требующую операций с ассетами, в обратный вызов OnPostprocessAllAsset; не выполняйте операции с ассетами внутри методов InitializeOnLoad.
Следующие примеры кодов изменения поведения показывают, как операции ассетов были отложены ранее.
Пример 1:
public class AssetPostprocessorTester1 : AssetPostprocessor
{
static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
{
var assetPath = "Assets/hello.txt";
if (File.Exists(assetPath))
{
var txtObj = AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/hello.txt");
AssetDatabase.DeleteAsset("Assets/hello.txt");
if (txtObj == null)
Debug.Log("New Behaviour: Asset object is unloaded");
else
Debug.Log("Old Behaviour: Asset is loaded for deleted asset!!");
}
}
}
Пример 2:
public class AssetPostprocessorTester2 : AssetPostprocessor
{
static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
{
var assetPath = "Assets/SomeText.txt";
if (!File.Exists(assetPath))
{
File.WriteAllText(assetPath, "hello world");
AssetDatabase.ImportAsset(assetPath);
var txtObj = AssetDatabase.LoadAssetAtPath<TextAsset>(assetPath);
if (txtObj == null)
Debug.Log("Old Behaviour: Asset hasn't been imported yet");
else
Debug.Log("New Behaviour: Asset is imported and loaded");
}
}
}
В следующем примере используется новый вариант OnPostprocessAllAssets с параметром didDomainReload:
static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths, bool didDomainReload)
{
if (didDomainReload)
Debug.Log("Domain has been reloaded");
else
Debug.Log("Domain did not reload during import");
}
Все перезагрузки доменов теперь обрабатываются внутри базы данных ассетов.
Метод OnPostprocessAllAssets теперь лучше работает с операциями на ассетах, но любая обработка в этом обратном вызове увеличивает время обновления базы данных ассетов и перезагрузки домена. Методы InitializeOnLoad также увеличивают время перезагрузки домена. Наилучшей практикой является минимизировать обработку в этих обратных вызовах, чтобы улучшить чувствительность Редактора между итерациями.
Смешанные точечные и спотовые источники света без теней создают прямой свет в субтрактивном режиме освещения
Смешанный режим точечные и спотовые огни теперь последовательно вносят прямую запекание света в сценах, используя Режим субтрактивного освещения, независимо от их Тип тени В результате зеркальное освещение для статического GameObjects Чтобы решить эту проблему, замените затронутые огни смешанного режима на Режим реального времени. В качестве альтернативы использовать Запеченный косвенный или Теневая маска освещение mode(s) со смешанными огнями.
Улучшения системы ключевых слов Shader
Система ключевых слов для шейдеров теперь допускает до 65534 локальных ключевых слов на шейдер или вычислительный шейдер и 232–2 глобальных ключевых слова на проект. Все ключевые слова, которые вы объявляете в шейдере или вычислительном шейдере, теперь локальны для этого шейдера. Ключевые слова, объявленные в директиве с суффиксом _local, не зависят от состояния глобальных ключевых слов.
Пример:
Проход в шейдере объявляет следующие ключевые слова:
#pragma shader_feature FOO BAR#pragma shader_feature_local BOO BAZ
При использовании этого пропуска ключевые слова FOO и BAR включаются, если они включены глобально или на материале. Ключевые слова BOO и BAZ включаются только если они включены на материале.
Unity поддерживает .NET стандарт 2.1 APIs
Теперь Unity поддерживает множество дополнительных API из базовых библиотек классов .NET, включая все API .NET Standard 2.1. Ваш проект может перестать компилироваться, если какой-то ваш код конфликтует с новыми API.
Чтобы избежать ошибок при обновлении проектов, созданных в предыдущих версиях Unity, проверьте и обновите свой код, чтобы убедиться, что нет конфликтов с типами и методами, которые теперь доступны в .NET Стандарт 2.1.
Источниками конфликта являются следующие факторы:
- двусмысленные ссылки
- методы расширения
- предварительно скомпилированные сборки
Разрешение двусмысленных ссылок
Если в вашем коде реализованы типы или методы с именем, которое конфликтует с типами или методами, добавленными стандартом .NET 2.1, ваш код не компилируется. Конфликты имен могут привести к ошибкам компилятора C# из-за двусмысленных ссылок.
Например, если в код проекта добавить тип MyCompany.MyCode.Range, это может привести к конфликту с существующим типом System.Range. Код, содержащий и инструкции using System;, и using MyCompany;, не компилируется.
Чтобы избежать ошибок, полностью укажите пространство имен в коде C# для любых типов, имеющих конфликтующие имена.
Разрешение конфликтов методов расширения
Если в вашем коде есть метод расширения, который .NET Standard 2.1 теперь реализует прямо в типе, вы можете либо переименовать свои методы расширения, либо перейти на методы базовой библиотеки классов.
Например, код в вашем проекте может реализовать метод расширения, названный CopyTo на типе ArraySegment. В .NET Стандартном 2.1, ArraySegment имеет встроенный метод CopyTo. Вы можете переименовать свой метод расширения CopyTo или полностью исключить его и использовать встроенный.
Разрешение конфликтов сборок
Если в вашем проекте есть предварительно скомпилированные сборки (то есть управляемые плагины), реализующие типы и методы, которые теперь входят в базовую библиотеку классов, удалите эти сборки из проекта и используйте встроенные реализации.
Например, в предыдущих версиях Unity вам нужно было использовать System.Memory.dll сборка от NuGet для доступа к System.Span тип значения. Теперь, .NET Стандарт 2.1 предоставляет System.Span в базовой библиотеке классов. Если вы попытаетесь использовать System.Memory.dll управляемый плагин в Unity 2021.2, проект не может быть построен.
Windows XR плагин удален
Microsoft отказалась от плагина Windows XR и теперь поддерживает Windows Mixed Reality (WMR) функции и устройства через плагин OpenXR.
- Плагин Windows XR был удален с Unity 2021.2.
- Когда вы открываете существующий проект в Unity 2021.2, процесс обновления удаляет плагин Windows XR, если он присутствует.
- Чтобы продолжать использовать проект для Windows Mixed Reality, вы должны включить плагин Unity OpenXR.
- В зависимости от того, какие функции вы используете, вы также должны установить Microsoft Mixed Reality OpenXR поддержки плагин и, возможно, дополнительные инструменты из Microsoft Mixed Reality Toolkit.
Для обновления до плагина Unity OpenXR:
- Откройте окно Project Настройки.
- В течение XR Plug-in Management раздел, включить OpenXR в 2000 году Поставщики плагинов список. Если необходимо, Unity загружает и устанавливает OpenXR плагин.
После включения плагина OpenXR вы можете использовать инструмент Mixed Reality Feature Tool, предоставленный Microsoft, для установки необходимых пакетов поддержки.
Чтобы установить или обновить функции, инструменты и образцы WMR:
- Загрузите и запустите Mixed Reality Feature Tool.
- Выберите Unity Project для обновления и нажмите кнопку Открыть компоненты.
- В разделе Поддержка платформы выберите плагин Mixed Reality OpenXR.
- Выберите дополнительные функции, которые вы хотите добавить.
- Нажмите кнопку Получить компоненты.
- Нажмите кнопку Импорт и затем кнопку Утвердить, чтобы завершить процесс.
- Вернитесь в раздел XR Plug-in Management ваших Unity Project Настроек и включите и настройте добавленные функции.
Дополнительные сведения о настройке новых и обновленных проектов Unity для использования Windows Mixed Reality см. в разделе Настройка конфигурации XR на сайте документации Microsoft.