包含此页的版本:
不含此页的版本:
此页面列出了 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),并通过进行以下更改之一来禁用自动生成的环境探针和天空盒反射探针的环境贡献:
用于管理代码覆盖率的用户界面已从“常规首选项”移至“代码覆盖率包”中。
代码覆盖率包可通过 Unity 2019.3 及更高版本的包管理器作为已发布的包提供。最新版本是 1.0.0。
可以使用以下方法之一来启用代码覆盖率:
-enableCodeCoverage在批处理模式下。Coverage.enabled应用程序接口。示例类:// 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;
}
}
以前,某些力场属性在不同的帧速率下(或者如果在时间管理器设置中使用时间比例)时的行为不同
这粒子系统通过在场景中生成大量小型 2D 图像并为其设置动画来模拟流体实体(如液体、云和火焰)的组件。更多信息
请参阅术语表现在使用 30fps 的参考帧速率作为模拟的基础。如果您的应用以不同的帧速率运行,则与早期版本的 Unity 相比,以下设置的行为可能有所不同:
如果这些设置受到影响,请调整受影响区域的强度以获得所需的外观。
以前,“距离速率”发射忽略了“开始延迟”设置。现在,如果定义了“开始延迟”设置,则会延迟基于距离的发射的开始。
如果之前设置了此字段,您可能需要对其进行调整。
PackedAssets.file 已被标记为过时,没有直接替换。以前,它保存一个整数,表示 BuildReport.files 中的文件 ID 或索引 要立即查找 BuildReport 文件,请使用 PackedAssets.shortPath。
实验性的地形场景中的地形。地形游戏对象会向场景添加一个大型平面,您可以使用地形的检查器窗口创建详细的景观。更多信息
请参阅术语表API 已移至非实验性命名空间。Terrain API 还有一些其他细微的更改。如果您使用了实验性地形 API,请改用以下 API:
UnityEngine.TerrainTools;UnityEditor.TerrainTools;UnityEngine.TerrainUtils;以下是 API 更改的完整列表:
UnityEngine.Experimental.TerrainAPI和UnityEditor.Experimental.TerrainAPI现在是UnityEngine.TerrainTools和UnityEditor.TerrainTools分别。一些运行时 API 已移至UnityEngine.TerrainUtilsNamespace。GetDesc()的TerrainPaintTool<T>class 已重命名为GetDescription().TerrainUtility类已从UnityEngine.Experimental.TerrainAPI自UnityEngine.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并且其重载已重命名为Texture2D.Reinitialize.
API 更新程序应自动重命名此文件。如果没有,请更改Texture2D.Resize自Texture2D.Reinitialize.
Android 构建管道的很大一部分现在是增量的,Unity 删除了之前构建管道中的以下功能:
libil2cpp.sosymbol 的代码。默认的 mainTemplate.gradle 文件已更改。如果您使用自定义主模板,则必须重新生成它并在顶部重新应用更改。否则,如果应用程序使用 Resources.Load,则可能会遇到性能回归。
默认的 Image.scaleMode 从 ScaleAndCrop 更改为 ScaleToFit。
图像的预期行为是缩放到元素的大小,因此我们将 Image.scaleMode 的默认值更改为 ScaleToFit。 如果未覆盖图像缩放模式,则某些裁剪的图像可能会缩小以适应元素的大小。 如果 ScaleAndCrop 是图像的预期模式,你可以通过在 UXML 文件内联样式中添加以下值来覆盖其样式:
-unity-background-scale-mode: scale-and-crop;
您还可以创建具有覆盖的样式类,并将其应用于需要 ScaleAndCrop 的图像。
底层 C# 运行时 Mono 已在最新版本中升级。这包括 Mono 上游版本的许多修复,以及一些显着的行为变化。
Directory.GetFiles不再保证返回排序列表。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。可能会出现以下问题:
以下图形格式现已被弃用:
这些自动格式不清楚使用的确切格式,并且可能因平台而异。
删除这些已弃用格式的步骤取决于格式和用例。
要获取当前平台的自动视频格式,请使用SystemInfo.GetGraphicsFormat(DefaultFormat.Video).
GraphicsFormat API 通常使用 DepthAuto 或 ShadowAuto 来创建渲染纹理(render texture)一种特殊类型的纹理,在运行时创建和更新。要使用它们,请先创建一个新的渲染纹理,并指定要渲染到其中的摄像机之一。然后,你可以在材质中使用渲染纹理,就像使用常规纹理一样。更多信息
请参阅术语表仅深度渲染,没有颜色缓冲区。此用例的示例包括:
renderTextureDescriptor.graphicsFormat = GraphicsFormat.ShadowAutoRenderTexture.GetTemporary(width, height, bits, GraphicsFormat.ShadowAuto)若要指示仅深度 (非颜色) 呈现,请使用 GraphicsFormat.None 作为新的颜色格式。renderTextureDescriptor.graphicsFormat = GraphicsFormat.None;
如果使用 ShadowAuto,请将 RenderTextureDescriptor 的 shadowSamplingMode 设置为 ShadowSamplingMode.CompareDepths 以在深度纹理上启用深度比较采样,并将代码更改为使用采用 RenderTextureDescriptor 的重载。renderTextureDescriptor.shadowSamplingMode = ShadowSamplingMode.CompareDepths;
在某些情况下,DepthAuto/ShadowAuto 格式表示适合当前平台的自动选择深度格式。要替换在这种情况下已弃用的值,请使用SystemInfo.GetGraphicsFormat(DefaultFormat.Depth/Shadow)
高级用户可用的asm.js链接器目标不再可用。
Pointer_stringify()现已弃用。相反,请调用函数UTF8ToString()将 UTF8 编码的以 null 结尾的 C 字符串从 WebAssembly 堆封送到 JavaScript 字符串。渐进式GPU光照贴图器不再支持CPU OpenCL设备。如果未找到受支持的GPU,但检测到CPU OpenCL设备,则会显示一条警告消息,通知你该设备被跳过并回退到渐进式CPU光照贴图器。渐进式CPU光照贴图器为基于CPU的计算提供了更好的性能光照贴图(lightmaps)一种预渲染的纹理,包含光源对场景中静态对象的效果。光照贴图覆盖在场景几何体之上,以创建光照效果。更多信息
请参阅术语表.
这种行为更改将自动发生,并且光照贴图应按预期计算。
当 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 基类库中的许多其他 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 现在直接在类型上实现的扩展方法,则可以选择重命名扩展方法或使用基类库实现的方法。
例如,项目中的代码可能会实现名为CopyTo在ArraySegment类型。在 .NET Standard 2.1 中,ArraySegment有一个内置的CopyTo方法。您可以选择重命名CopyTo扩展方法,或者完全消除它并使用内置的。
如果项目使用预编译程序集(即托管插件)来实现现在属于基类库的类型和方法,请从项目中删除这些程序集并使用内置实现。
例如,在以前版本的 Unity 中,您需要使用System.Memory.dll程序集以访问System.Span值类型。现在,.NET Standard 2.1 提供System.Span在基类库中。如果您尝试使用System.Memory.dll托管插件,则项目无法构建。
Microsoft 已弃用 WindowsXR一个总称,包括虚拟现实 (VR)、增强现实 (AR) 和混合现实 (MR) 应用。支持这些形式的交互式应用程序的设备可以称为 XR 设备。更多信息
请参阅术语表插件,现在支持 Windows混合现实混合现实 (MR) 将自己的虚拟环境与用户的现实世界环境相结合,并允许他们相互交互。
请参阅术语表(WMR) 功能和设备。
要升级到 Unity OpenXR 插件,请执行以下作:
启用 OpenXR 插件后,可以使用 Microsoft 提供的混合现实功能工具安装所需的支持包。
若要安装或更新 WMR 功能、工具和示例,请执行以下作:
有关设置新的和更新的 Unity 项目以使用 Windows Mixed Reality 的详细信息,请参阅 Microsoft 文档站点上的设置 XR 配置。