注意:按照发布顺序遵循本节中的建议。例如,如果您需要将项目从2020升级到2022,请先阅读2021升级指南,查看是否有在进行2022升级指南之前您需要做出的更改。
本页列出了从2021.1 beta版本升级到2021.2版本时可能影响现有项目的Unity 2021.2版本的更改。
Unity的渐进式 光照贴图器Unity中的一项工具,根据场景中灯光和几何形状的布局自动烘焙光照贴图。更多信息
参见术语表现在会自动生成环境探测器和每个 场景包含游戏的环境和菜单。将每个独特的场景文件视为一个独特的关卡。在场景中,您放置环境、障碍物和装饰,实际上是在零散地设计和构建游戏。更多信息
参见术语表的默认情况下自动烘焙天空盒反射探测器。这意味着场景将根据“光照”设置面板中“环境”标签中的设置自动接收环境光照。当环境光照变化时,编辑器会更新环境探测器和天空盒反射探测器,直到您生成光照。当使用“生成光照”控制烘焙时,编辑器停止更新探测器,直到下一个烘焙。当启用“自动生成”选项时,编辑器会在环境光照每次变化时继续更新探测器。如果您生成光照然后删除此光照数据(从项目中删除光照数据资产),编辑器将再次自动生成环境探测器和天空盒反射探测器。
在升级项目时,有一种情况需要您采取行动。这是当您不希望项目中有任何环境光照贡献时,这个项目
在这种情况下,导航到 窗口 > 渲染 > 光照设置 > 环境,并通过以下更改之一禁用自动生成的环境探测器和天空盒反射探测器的环境贡献
以前,一些力场属性在不同帧率下表现不同(或者在时间管理器设置中使用了时间缩放功能)
粒子系统模拟液体、云和火焰等流体实体的组件。通过在场景中生成和动画大量小2D图像来模拟。 更多信息
参见术语表现在使用30fps作为参考帧率以作为模拟的基础。如果您的应用程序在不同的帧率下运行,以下设置可能与其在Unity早期版本中的行为不同
如果这些设置受到影响,请调整受影响区域的力量以获得所需的外观。
以前,距离排放率忽略了启动延迟设置。现在,如果定义了启动延迟设置,它将延迟根据距离的排放。
如果以前设置了该字段,可能需要调整它。
PackedAssets.file已被标记为已过时,没有直接替换。以前这表示一个文件ID或BuildReport.files中的索引。要查找BuildReport文件,现在请使用PackedAssets.shortPath。
实验性的地形场景中的景观。地形游戏对象添加一个大型平坦面到场景中,您可以使用地形的检查器窗口来创建详细的景观。 更多信息
参见术语表API已移动到非实验名称空间。地形API还进行了一些其他小的更改。如果您使用了实验性的地形API,请使用以下API
UnityEngine.TerrainTools
;UnityEditor.TerrainTools
;UnityEngine.TerrainUtils
;以下是API更改的完整列表
UnityEngine.Experimental.TerrainAPI
和UnityEditor.Experimental.TerrainAPI
现在分别是UnityEngine.TerrainTools
和UnityEditor.TerrainTools
。一些运行时API已移动到新的UnityEngine.TerrainUtils
名称空间。TerrainPaintTool<T>
类的GetDesc()
已被重命名为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
。IOnInspectorGUI
中的三个ShowBrushGUI
函数已合并为一个具有默认参数值的函数,而不是不同的重载函数。TerrainFilter
已被删除。请使用System.Predicate<Terrain>
。
Texture2D.Resize
及其重载已被重命名为Texture2D.Reinitialize
。
API更新器应自动重命名此内容。如果不是,请将任何对Texture2D.Resize
的使用更改为Texture2D.Reinitialize
。
Android构建管道的大部分内容现在都是增量式的,Unity移除了之前构建管道中的以下功能
libil2cpp.so
符号。Image的默认scaleMode已从ScaleAndCrop更改为ScaleToFit。
对于图像的期望行为是缩放到元素的大小,因此我们将Image.scaleMode的默认值更改为ScaleToFit。如果您没有覆盖Image缩放模式,一些裁剪的图像可能缩小以适配元素的大小。如果您期望图像的默认模式是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之类的确定性哈希算法。现在可使用自适应性能包的3.0版。有关升级到3.0版的信息,请参阅自适应性能升级指南。
之前,如果您将 RenderTexture.depth
属性设置为32位,您可能会根据平台得到D24_S8。现在如果您将其设置为32位,如果您当前平台支持此格式,则得到D32_S8,其中深度组件为32位。然而,这将使该 深度缓冲区一个内存存储器,用于存储图像中每个像素的z值深度,其中z值是从投影面到每个渲染像素的深度。 更多信息
查看术语表 的内存使用量加倍。
新的 RenderTexture.depthStencilFormat
属性返回图形API用于在视频内存中创建资源的格式。您还可以使用此属性请求特定格式。但是,并非所有平台都支持所有深度模板格式。当您将 DepthStencilFormat
属性设置为一个不受支持的格式时,Unity会自动选择一个具有等于或更多深度和模板组件位的兼容格式。
现在,RenderTexture 资产将序列化您所选择的深度模板格式。如果您使用的是接受位数而不是格式的API,这些位数将被映射到一个格式,并且这个格式将被序列化。之前版本中设置深度大于16位的RenderTexture资产将自动升级为使用D24_S8。
在某些平台(例如Windows)上,这些平台使用DirectX图形API,由于图形后端在您设置位>16时内部选择D32_S8格式,这导致格式具有更少的深度位。为确保所有平台的升级一致性,所有平台在自动升级器中均使用D24_S8。但是,这可能会在项目的渲染输出中引入视觉伪影。如果您的项目中包含RenderTexture资产,请查看这些资产,并在必要时将其深度模板格式更改为D32_S8。可能会出现以下问题
以下图形格式现已废弃
这些“自动”格式关于使用的确切格式不明确,可能因平台而异。
移除使用这些已废弃格式的步骤取决于格式和用例。
要获取当前平台的自动视频格式,请使用SystemInfo.GetGraphicsFormat(DefaultFormat.Video)
。
GraphicsFormat API常用DepthAuto或ShadowAuto创建只有深度渲染的渲染纹理一种在运行时创建和更新的特殊类型的Texture。为了使用它,首先创建一个新的Render Texture,并将您的某个相机构造设置为渲染到其中。然后您可以在Material中使用渲染纹理,就像使用常规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格式代表“适合当前平台的自动选择深度格式”。在这种情况下,要用废弃的值替换它,请使用SystemInfo.GetGraphicsFormat(DefaultFormat.Depth/Shadow)
曾经提供给高级用户的asm.js链接器目标不再可用。
Pointer_stringify()
现已弃用。请改为调用函数UTF8ToString()
将UTF8编码的空终止C字符串从WebAssembly堆传输到JavaScript字符串。Progressive GPU Lightmapper不再支持CPU OpenCL设备。如果在找不到支持GPU但检测到CPU OpenCL设备时,将显示警告消息,告知您该设备被跳过并回退到Progressive CPU Lightmapper。Progressive CPU Lightmapper为基于CPU的光图预先渲染的纹理,包含光源对场景中静态对象的照射效果。光图叠加到场景几何图形上以产生光照效果。 更多信息
在词汇表中查看计算提供了更好的性能。这种行为变化将会自动发生,光图应该按预期计算。
当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");
}
}
}
以下示例显示了具有didDomainReload
参数的新OnPostprocessAllAssets
变体
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
方法也会增加域重新加载时间。最佳做法是将这些回调中的处理最小化,以改善在迭代之间编辑器响应。
着色器关键词系统现在允许每个着色器或计算着色器最多有65534个局部关键词和每个项目232-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现在已经在该类型上直接实现了这个方法,您可以选择重命名您的扩展方法或使用基础类库实现的方法。
例如,项目中的代码可能在ArraySegment
类型上实现一个名为CopyTo
的扩展方法。在.NET Standard 2.1中,ArraySegment
有一个内建的CopyTo
方法。您可以选择重命名您的CopyTo
扩展方法,或者完全消除它并使用内建的方法。
如果您的项目使用实现了现在属于基础类库的类型和方法的预编译的程序集(即管理的插件),则从您的项目中删除这些程序集并使用内置的实现。
例如,在Unity的早期版本中,您需要从NuGet使用System.Memory.dll
程序集来访问System.Span
值类型。现在,.NET Standard 2.1在基础类库中提供了System.Span
。如果尝试在Unity 2021.2中使用System.Memory.dll
管理插件,则项目无法构建。
微软已弃用Windows XR涵盖了虚拟现实(VR)、增强现实(AR)和混合现实(MR)应用的统称。支持这些互动应用的设备可以被称为XR设备。 更多信息
在词汇表中查看 插件,并现在通过OpenXR插件支持Windows 混合现实混合现实(MR)将虚拟环境与用户的真实世界环境结合在一起,并允许它们相互交互。
在词汇表中查看 (WMR) 特性和设备。
升级到Unity OpenXR插件
一旦启用了OpenXR插件,您可以使用微软提供的 混合现实功能工具 安装必要的支持包。
安装或更新WMR功能、工具和示例
有关设置新项目和更新项目以使用Windows混合现实的信息,请参阅微软文档网站上的设置您的XR配置。