Version: 6000.3
语言: 中文
升级到 Unity 2022 LTS
编辑器界面

升级到 Unity 2021 LTS

此页面列出了 Unity 2021 LTS 版本中的更改,当您从 2020 版本升级到 2021 LTS 时,这些更改可能会影响现有项目。

注意:2021 LTS 也称为 2021.3。

页面大纲

渲染管线

本升级指南介绍如何升级到 Unity 内置渲染管道的 2021 版本。要升级到其他渲染管道到版本 2021,请参阅:

要升级其他软件包,请参阅您正在使用的软件包的文档。

设备模拟器

设备模拟器现在是编辑器的一部分,可从 游戏(Game) 窗口访问。要设置设备模拟器,请将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。

环境照明

编辑器现在会自动烘焙默认的天空盒一种特殊类型的材质,用于表示天空。通常是六面的。更多信息
请参阅术语表
probe 和 ambient probe 并保留该数据,直到您手动烘焙场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
. 升级时,没有环境光不来自任何特定方向的光源,并在所有方向上为场景提供相等的光。更多信息
请参阅术语表
贡献可能会在视觉上发生变化。要恢复这些场景的原始外观,请将 环境光照强度乘数(Environment lighting intensity multiplier) 设置为 0。或者,将天空盒设置为黑色,烘焙场景,然后将天空盒重置为你喜欢的天空颜色。

环境光照:环境探针和天空盒反射探针现在会自动烘焙

Unity 的渐进式Lightmapper:Unity 中的一种工具,可根据场景中光源和几何体的排列来烘焙光照贴图。更多信息
请参阅术语表
现在自动生成环境探测和天空盒反射探针一种渲染组件,可捕获各个方向周围环境的球面视图,就像相机一样。然后,捕获的图像将存储为立方体贴图,可供具有反射材质的对象使用。更多信息
请参阅术语表
默认情况下,每个场景。这意味着场景会根据“光照”设置面板中“环境”选项卡中的设置自动接收环境光照。每次环境光照发生变化时,编辑器都会更新环境光探针和天空盒反射探针,直到生成光照。当您使用 生成光照(Generate Lighting) 控件进行烘焙时,编辑器将停止更新探针,并且仅在下一次烘焙时再次更新它们。启用 自动生成(Auto Generate) 选项后,每次环境光照发生变化时,编辑器都会继续更新探针。如果你生成光照,然后通过从项目中移除光照数据资产来删除此光照数据,编辑器会自动再次生成环境光探针和天空盒反射探针。

升级项目时,有一种情况需要采取行动。这是当你不希望在项目中贡献任何环境光照时,它还:

  • 没有光照数据资产。
  • 未启用自动生成
  • 将环境贡献设置为黑色以外的颜色。

在这种情况下,请导航到 窗口>渲染(Rendering) > 光照>环境(Environment),并通过进行以下更改之一来禁用自动生成的环境探针和天空盒反射探针的环境贡献:

  • 选项 1:将强度乘数设置为 0。
  • 选项2:使用黑色天空盒材质
  • 选项 3:在“颜色”“渐变”模式下对使用黑色。

启用代码覆盖率首选项

用于管理代码覆盖率的用户界面已从“常规首选项”移至“代码覆盖率包”中。

在 Unity 2021 中,“启用代码覆盖率”复选框已移至“代码覆盖率”窗口中。
在 Unity 2021 中,“启用代码覆盖率”复选框已移至“代码覆盖率”窗口中。

代码覆盖率包可通过 Unity 2019.3 及更高版本的包管理器作为已发布的包提供。最新版本是 1.0.0。

可以使用以下方法之一来启用代码覆盖率:

// 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 Force Fields)

以前,某些力场属性在不同的帧速率下(或者如果在时间管理器设置中使用时间比例)时的行为不同

粒子系统通过在场景中生成大量小型 2D 图像并为其设置动画来模拟流体实体(如液体、云和火焰)的组件。更多信息
请参阅术语表
现在使用 30fps 的参考帧速率作为模拟的基础。如果您的应用以不同的帧速率运行,则与早期版本的 Unity 相比,以下设置的行为可能有所不同:

  • 重力
  • 旋转
  • 矢量场(Vector Fields)

如果这些设置受到影响,请调整受影响区域的强度以获得所需的外观。

粒子系统启动延迟 + 随距离发射的速率

以前,“距离速率”发射忽略了“开始延迟”设置。现在,如果定义了“开始延迟”设置,则会延迟基于距离的发射的开始。

如果之前设置了此字段,您可能需要对其进行调整。

构建报告 - PackedAssets

PackedAssets.file 已被标记为过时,没有直接替换。以前,它保存一个整数,表示 BuildReport.files 中的文件 ID 或索引 要立即查找 BuildReport 文件,请使用 PackedAssets.shortPath。

实验性 (WIP) 中的地形 API

实验性的地形场景中的地形。地形游戏对象会向场景添加一个大型平面,您可以使用地形的检查器窗口创建详细的景观。更多信息
请参阅术语表
API 已移至非实验性命名空间。Terrain API 还有一些其他细微的更改。如果您使用了实验性地形 API,请改用以下 API:

  • UnityEngine.TerrainTools;
  • UnityEditor.TerrainTools;
  • UnityEngine.TerrainUtils;

以下是 API 更改的完整列表:

  • 在大多数情况下,UnityEngine.Experimental.TerrainAPIUnityEditor.Experimental.TerrainAPI现在是UnityEngine.TerrainToolsUnityEditor.TerrainTools分别。一些运行时 API 已移至UnityEngine.TerrainUtilsNamespace。
  • GetDesc()TerrainPaintTool<T>class 已重命名为GetDescription().
  • TerrainUtility类已从UnityEngine.Experimental.TerrainAPIUnityEngine.TerrainUtils.
  • TerrainUtility.TerrainMapclass 不再是内部类,属于UnityEngine.TerrainUtilsNamespace。
  • TerrainMap.TileCoord结构不再在TerrainMap类,已重命名为TerrainTileCoord,现在也是UnityEngine.TerrainUtilsNamespace。
  • UnityEditor.Experimental.TerrainAPI.BrushPreviewModeenum 已重命名为TerrainBrushPreviewMode并移至UnityEditor.TerrainToolsNamespace。
  • TerrainPaintUtilityEditor.BuiltinPaintMaterialPasses枚举已从TerrainPaintUtilityEditor类并进入UnityEditor.TerrainToolsNamespace。它也已更名为TerrainBuiltinPaintMaterialPasses.
  • ShowBrushGUI函数中的函数IOnInspectorGUI已合并为一个具有默认参数值的函数,而不是不同的重载函数。
  • TerrainFilter已被删除。用System.Predicate<Terrain>相反。

Texture2D.Resize 重命名为 重新初始化(Reinitialize)

Texture2D.Resize并且其重载已重命名为Texture2D.Reinitialize.

API 更新程序应自动重命名此文件。如果没有,请更改Texture2D.ResizeTexture2D.Reinitialize.

Android 更改

Android 构建管道的很大一部分现在是增量的,Unity 删除了之前构建管道中的以下功能:

  • Unity 不再复制Gradle一种 Android 构建系统,可自动执行多个构建过程。这种自动化意味着许多常见的生成错误不太可能发生。更多信息
    请参阅术语表
    项目资产添加到 Gradle 项目。
    • 以前,您可以将 Gradle 资源放在此文件夹中,然后 Unity 将它们复制到 Gradle 项目中。现在,您应该使用 AAR 或 androidlib 插件将其他 Gradle 资源传递给应用。
    • 如果将项目资源放置在此文件夹中,Unity 会显示构建错误消息。
  • Unity 不再忽略 GENERATED BY UNITY.删除此注释以防止再次导出时覆盖注释。
    • 以前,如果您删除此注释,Unity 不会覆盖文件。如果您没有删除注释,Unity 总是会重新生成 build.gradle、manifest 和 UnityPlayerActivity 文件。
    • 如果希望使用新的生成管道保留更改,请使用模板。
  • 导出 Android 项目时,Unity 不再创建符号 zip 包。这些符号现在位于 unityLibrary\symbols 目录中,您可以压缩该目录。此更改的原因是,导出项目时并非所有符号文件都可用;Gradle 会生成libil2cpp.sosymbol 的代码。
  • 更改了 Unity 检查 obb 是否与apkUnity 输出的 Android 包格式。当您选择“文件”>“生成并运行”时,APK 会自动部署到您的设备。更多信息
    请参阅术语表
    .apk 和 obb 现在都有unity_obb_guid文件,如果它们之间的内容匹配,Unity 会将它们视为兼容。
  • 对于自定义构建脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
    请参阅术语表
    使用PatchPackage的,请注意,Patch/Patch & Run现在适用于所有类型的资产,并且不需要仅脚本构建。

默认的 mainTemplate.gradle 文件已更改。如果您使用自定义主模板,则必须重新生成它并在顶部重新应用更改。否则,如果应用程序使用 Resources.Load,则可能会遇到性能回归。

UI 工具包 - 图像的默认缩放模式已更改

默认的 Image.scaleMode 从 ScaleAndCrop 更改为 ScaleToFit。

图像的预期行为是缩放到元素的大小,因此我们将 Image.scaleMode 的默认值更改为 ScaleToFit。 如果未覆盖图像缩放模式,则某些裁剪的图像可能会缩小以适应元素的大小。 如果 ScaleAndCrop 是图像的预期模式,你可以通过在 UXML 文件内联样式中添加以下值来覆盖其样式:

-unity-background-scale-mode: scale-and-crop;

您还可以创建具有覆盖的样式类,并将其应用于需要 ScaleAndCrop 的图像。

单声道升级行为更改

底层 C# 运行时 Mono 已在最新版本中升级。这包括 Mono 上游版本的许多修复,以及一些显着的行为变化。

  • Directory.GetFiles不再保证返回排序列表。
    • 以前,这始终返回按字母顺序排序的项目列表。如果您的项目需要每次都以相同的顺序返回项目,请对返回的列表进行排序。例如: var 文件 =Directory.GetFiles(dir).OrderBy(f => f);
  • Object.GetHashCode现在返回不同的值,不应将其用作作系统之间的确定性哈希算法。
    • 通常,您不应该使用GetHashCode在当前进程之外,也就是说,不要序列化它,也不要期望它下次在新进程中运行代码时它是相同的。Unity 建议使用确定性哈希算法,例如 MD5。
  • 一些错误修复导致引发新的异常。此外,一些异常消息的内容也发生了变化。
    • 这种新行为在自动化测试方案中将特别明显,如果测试正在分析特定异常消息的日志,则可能需要更改预期行为。

自适应性能

Adaptive Performance 软件包 3.0 版现已推出。有关如何升级到 3.0 版的信息,请参阅自适应性能升级指南

渲染纹理深度模板格式

以前,如果您将RenderTexture.depth属性设置为 32 位,您可以根据平台获得D24_S8。现在,如果将其设置为 32 位,则当前平台支持深度组件的 32 位D32_S8。但是,这会使内存使用量增加一倍深度缓冲区 保存图像中每个像素的 z 值深度的内存存储,其中 z 值是投影平面中每个呈现像素的深度。更多信息
请参阅术语表
.

新的RenderTexture.depthStencilFormat属性返回图形 API 用于在视频内存中创建资源的格式。您还可以使用此属性来请求特定格式。但是,并非所有平台都支持所有深度模具格式。当您将DepthStencilFormat属性设置为不受支持的格式,则 Unity 会自动为深度和模板组件选择具有相同或更大位数的兼容格式。

升级

RenderTexture 资源现在序列化所选深度模板格式。如果您使用的 API 采用多个位而不是格式,则这些位将映射到一种格式,并且该格式将被序列化。以前版本中深度设置为超过 16 位的 RenderTexture 资源会自动升级以使用D24_S8。

在某些使用 DirectX 图形 API 的平台 (例如 Windows) 上,这会导致格式具有较少的深度位,因为如果设置 bits>16,图形后端会在内部选择 D32_S8 格式。为确保所有平台上的升级一致,D24_S8 在所有平台上用于自动升级程序。但是,如果你的项目中有RenderTexture资源,这可能会在项目的渲染输出中引入视觉伪影。查看这些资产,并在需要时将深度模具格式更改为D32_S8。可能会出现以下问题:

  • 你使用的渲染纹理的内存大小可能会增加。但是,报告的内存现在是正确的。
  • 现在,将深度属性设置为 32 位,为您提供了一个 32 位深度组件,内存使用量会增加。为避免这种情况,请将位设置为 24,并使用D24_S8(如果您的平台支持)。
  • 如果平台不支持 D24_S8,Unity 会回退到默认的兼容格式D32_S8。为了防止这种情况,在检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。更多信息
    请参阅术语表
    窗口中,禁用资产上的 启用兼容格式(Enable Compatible Format) 属性。如果 Unity 不支持格式D32_S8并且无法回退,则会看到错误消息:RenderTexture.Create failed: depth/stencil format unsupported。此平台上没有兼容格式,或者在导入检查器中禁用了此回退到兼容格式。在大多数情况下,要解决此问题,您可以打开启用兼容格式

图形格式 DepthAuto、ShadowAuto 和 VideoAuto 已弃用

以下图形格式现已被弃用:

  • 深度自动
  • 阴影自动
  • 视频自动

这些自动格式不清楚使用的确切格式,并且可能因平台而异。

删除这些已弃用格式的步骤取决于格式和用例。

对于 VideoAuto

要获取当前平台的自动视频格式,请使用SystemInfo.GetGraphicsFormat(DefaultFormat.Video).

对于 DepthAuto/ShadowAuto,用于指示仅深度渲染纹理。

GraphicsFormat API 通常使用 DepthAuto 或 ShadowAuto 来创建渲染纹理(render texture)一种特殊类型的纹理,在运行时创建和更新。要使用它们,请先创建一个新的渲染纹理,并指定要渲染到其中的摄像机之一。然后,你可以在材质中使用渲染纹理,就像使用常规纹理一样。更多信息
请参阅术语表
仅深度渲染,没有颜色缓冲区。此用例的示例包括:

  • renderTextureDescriptor.graphicsFormat = GraphicsFormat.ShadowAuto
  • RenderTexture.GetTemporary(width, height, bits, GraphicsFormat.ShadowAuto)

若要指示仅深度 (非颜色) 呈现,请使用 GraphicsFormat.None 作为新的颜色格式。renderTextureDescriptor.graphicsFormat = GraphicsFormat.None;

如果使用 ShadowAuto,请将 RenderTextureDescriptor 的 shadowSamplingMode 设置为 ShadowSamplingMode.CompareDepths 以在深度纹理上启用深度比较采样,并将代码更改为使用采用 RenderTextureDescriptor 的重载。renderTextureDescriptor.shadowSamplingMode = ShadowSamplingMode.CompareDepths;

对于其他情况下的 DepthAuto/ShadowAuto

在某些情况下,DepthAuto/ShadowAuto 格式表示适合当前平台的自动选择深度格式。要替换在这种情况下已弃用的值,请使用SystemInfo.GetGraphicsFormat(DefaultFormat.Depth/Shadow)

WebGL:将 Emscripten 更新至 2.0.19

高级用户可用的asm.js链接器目标不再可用。

  • 在 Unity 2021.2 中,由WebGL一种在 Web 浏览器中呈现 2D 和 3D 图形的 JavaScript API。Unity Web 构建选项允许 Unity 将内容发布为 JavaScript 程序,这些程序使用 HTML5 技术和 WebGL 渲染 API 在 Web 浏览器中运行 Unity 内容。更多信息
    请参阅术语表
    平台已更新至版本 2.0.19。这升级了本机代码对象文件格式,因此需要重新编译项目中的所有本机代码插件(C/C++ 代码插件)。如果您使用的是 Unity 的闭源第三方插件Asset StoreUnity 和社区成员创建的不断增长的免费和商业资产库。提供各种各样的资产,从纹理、模型和动画到整个项目示例、教程和编辑器扩展。更多信息
    请参阅术语表
    ,例如,记得向作者索取 Unity 2021.2 的更新版本。
  • Emscripten 运行时 JavaScript 函数Pointer_stringify()现已弃用。相反,请调用函数UTF8ToString()将 UTF8 编码的以 null 结尾的 C 字符串从 WebAssembly 堆封送到 JavaScript 字符串。

渐进式GPU光照贴图器放弃了对CPU OpenCL设备的支持

渐进式GPU光照贴图器不再支持CPU OpenCL设备。如果未找到受支持的GPU,但检测到CPU OpenCL设备,则会显示一条警告消息,通知你该设备被跳过并回退到渐进式CPU光照贴图器。渐进式CPU光照贴图器为基于CPU的计算提供了更好的性能光照贴图(lightmaps一种预渲染的纹理,包含光源对场景中静态对象的效果。光照贴图覆盖在场景几何体之上,以创建光照效果。更多信息
请参阅术语表
. 这种行为更改将自动发生,并且光照贴图应按预期计算。

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方法也会增加域重新加载时间。最佳做法是尽量减少这些回调中的处理,以提高迭代之间的编辑器响应能力。

没有阴影的混合点光和聚光灯在减光模式下烘焙直接光

混合模式点光源和聚光灯现在会在使用减法光照模式的场景中始终如一地提供烘焙的直射光,而不管其 阴影类型(Shadow Type) 设置如何。因此,静态的镜面反射光照游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
请参阅术语表
在受影响的场景中可能出现缺失。要解决此问题,请将受影响的混合模式光源替换为实时模式光源。或者,使用 烘焙间接(Baked Indirect) 或阴影遮罩(Shadowmask与其相应光照贴图共享相同UV布局和分辨率的纹理。更多信息
请参阅术语表
带有混合灯光的照明模式。

着色器关键字系统改进

着色器在 GPU 上运行的程序。更多信息
请参阅术语表
关键字系统现在允许每个着色器或计算着色器最多 65534 个本地关键字和 2 个32–每个项目 2 个全局关键字。在着色器或计算着色器中声明的所有关键字现在都是此着色器的本地关键字。在具有 _local 后缀的指令中声明的关键字不受全局关键字状态的影响。

例:

着色器中的传递声明以下关键字:

  • #pragma shader_feature FOO BAR
  • #pragma shader_feature_local BOO BAZ

使用此通道时,如果关键字 FOO 和 BAR 在全局或材质上启用,则会启用它们。关键字 BOO 和 BAZ 仅在材料上启用时才启用。

Unity 支持 .NET Standard 2.1 API

Unity 现在支持 .NET 基类库中的许多其他 API,包括 .NET Standard 2.1 API 中的所有 API。如果任何代码与新 API 发生冲突,则项目可能无法编译。

若要避免在升级在早期版本的 Unity 中创建的项目时出现错误,请检查并更新代码,以确保与 .NET Standard 2.1 中现在可用的类型和方法没有冲突。

冲突的根源包括:

  • 模棱两可的参考资料
  • 扩展方法
  • 预编译程序集

解决不明确的引用

如果代码实现的类型或方法的名称与 .NET Standard 2.1 添加的类型或方法冲突,则代码无法编译。由于引用不明确,名称冲突可能会导致 C# 编译器错误。

例如,如果添加名为MyCompany.MyCode.Range对于项目的代码,这可能会与现有的System.Range类型。包含两者using System;using MyCompany;语句编译失败。

若要防止错误,请在 C# 代码中为具有冲突名称的任何类型完全指定命名空间。

解决冲突的扩展方法

如果现有代码具有 .NET Standard 2.1 现在直接在类型上实现的扩展方法,则可以选择重命名扩展方法或使用基类库实现的方法。

例如,项目中的代码可能会实现名为CopyToArraySegment类型。在 .NET Standard 2.1 中,ArraySegment有一个内置的CopyTo方法。您可以选择重命名CopyTo扩展方法,或者完全消除它并使用内置的。

解决冲突的程序集

如果项目使用预编译程序集(即托管插件)来实现现在属于基类库的类型和方法,请从项目中删除这些程序集并使用内置实现。

例如,在以前版本的 Unity 中,您需要使用System.Memory.dll程序集以访问System.Span值类型。现在,.NET Standard 2.1 提供System.Span在基类库中。如果您尝试使用System.Memory.dll托管插件,则项目无法构建。

删除了 Windows XR 插件

Microsoft 已弃用 WindowsXR一个总称,包括虚拟现实 (VR)、增强现实 (AR) 和混合现实 (MR) 应用。支持这些形式的交互式应用程序的设备可以称为 XR 设备。更多信息
请参阅术语表
插件,现在支持 Windows混合现实混合现实 (MR) 将自己的虚拟环境与用户的现实世界环境相结合,并允许他们相互交互。
请参阅术语表
(WMR) 功能和设备。

  • Windows XR 插件已从 Unity 2021.2 开始删除。
  • 在 Unity 2021.2 中打开现有项目时,更新过程会删除 Windows XR 插件(如果存在)。
  • 若要继续将项目用于 Windows Mixed Reality,必须启用 Unity OpenXR 插件。
  • 根据你使用的功能,还必须安装 Microsoft 的混合现实 OpenXR 支持插件,可能还安装 Microsoft 混合现实工具包中的其他工具。

要升级到 Unity OpenXR 插件,请执行以下作:

  1. 打开项目设置(Project Settings) 广泛的设置集合,允许您配置物理、音频、网络、图形、输入和项目的许多其他区域的行为方式。更多信息
    请参阅术语表
    窗。
  2. XR的插件Unity 外部创建的一组代码,用于在 Unity 中创建功能。可以在 Unity 中使用两种插件:托管插件(使用 Visual Studio 等工具创建的托管 .NET 程序集)和本机插件(特定于平台的本机代码库)。更多信息
    请参阅术语表
    管理
    部分,在插件提供程序列表中启用 OpenXR。 如果需要,Unity 会下载并安装 OpenXR 插件。

启用 OpenXR 插件后,可以使用 Microsoft 提供的混合现实功能工具安装所需的支持包。

若要安装或更新 WMR 功能、工具和示例,请执行以下作:

  1. 下载并运行混合现实功能工具
  2. 选择要更新的 Unity 项目,然后单击“发现功能”。
  3. 在“平台支持”下,选择“混合现实 OpenXR 插件”。
  4. 选择您要添加的任何其他功能。
  5. 单击“获取要素”。
  6. 单击导入,然后单击批准以完成该过程。
  7. 返回 Unity 项目设置的 XR 插件管理部分,并启用和配置添加的功能。

有关设置新的和更新的 Unity 项目以使用 Windows Mixed Reality 的详细信息,请参阅 Microsoft 文档站点上的设置 XR 配置

其他资源

升级到 Unity 2022 LTS
编辑器界面