Version: 6000.3
语言: 中文
升级到 Unity 6.1
升级到 Unity 2023.2

升级到 Unity 6.0

此页面列出了 Unity 6.0 中可能影响现有项目的更改,当您将现有项目从 2022 LTS 版本升级到 Unity 6.0 时。

渲染管线

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

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

LightingSettings 中的高斯滤镜半径属性现在是浮点值

渐进式光照贴图器在其高级过滤选项中包含一个高斯选项(“光照窗口”> 光照贴图设置> 过滤>直接过滤>高斯)。高斯滤波的“半径”控件现在支持小数增量,例如 0.5。以前,此控件仅支持整数步长(1 到 5)。

由于此更改,这些属性现在在 C# API 中已弃用:

  • int LightingSettings.filteringGaussRadiusAO
  • int LightingSettings.filteringGaussRadiusDirect
  • int LightingSettings.filteringGaussRadiusIndirect

已弃用属性的浮点替换包括:

  • float LightingSettings.filteringGaussianRadiusAO
  • float LightingSettings.filteringGaussianRadiusDirect
  • float LightingSettings.filteringGaussianRadiusIndirect

可以调用已弃用的成员函数之一,将高斯筛选器半径舍入到最接近的整数。

改进光探头节能

光源探针现在与光照贴图(lightmaps一种预渲染的纹理,包含光源对场景中静态对象的效果。光照贴图覆盖在场景几何体之上,以创建光照效果。更多信息
请参阅术语表
.以前,Unity 的光源探针光探针存储有关光线如何穿过场景中空间的信息。在给定空间中排列的光源探针集合可以改善移动对象的光照和该空间内的静态LOD场景。更多信息
请参阅术语表
只有应有的亮度的 94%。因此,用光照探针照亮的对象看起来比用光照贴图照亮的对象要暗一些。由于这种变化的微妙性,许多用户可能不会看到明显的差异。

如果您更喜欢旧的外观,可以通过以下方式实现:

  1. 烘焙光探头。
  2. 使用C#获取数组LightmapSettings.lightProbes.bakedProbes的副本。
  3. 对于每个 SphericalHarmonicsL2 实例,将系数 0 乘以 16/17。
  4. 将数组的副本写回 LightmapSettings.lightProbes.bakedProbes 中。

Enlighten 烘焙全局照明不再可用

EnlightenGeomerics 的照明系统,用于 Unity 中用于 Enlighten 实时全局照明。更多信息
请参阅术语表
全局光照 一组对直接和间接光照进行建模以提供逼真的光照结果的技术。
请参阅术语表
光照贴图后端不再可用。

当您将项目升级到此版本时,Unity 会从lightmapper:Unity 中的一种工具,可根据场景中光源和几何体的排列来烘焙光照贴图。更多信息
请参阅术语表
选择下拉菜单,并在每个场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
选择了 Enlighten 烘焙后端的位置。

在 Apple 芯片设备上,Unity 将渐进式 GPU 光照贴图器替换为 Enlighten 烘焙后端。在所有其他设备上,Unity 会选择 CPU 渐进式光照贴图器。

Enlighten 预计算的实时全局光照仍然可用,并且在 Unity 6 之前受到支持。

Android:Java 类 UnityPlayer 需要重命名为 UnityPlayerForActivityOrService

UnityPlayerJava 类已被两个新的桥接类UnityPlayerForActivityOrServiceUnityPlayerForGameActivity.这些新类都派生自UnityPlayer,但公共方法(例如displayChangedwindowFocusChanged已从UnityPlayer具体到UnityPlayerForActivityOrService.

如果您扩展了默认的 Unity 活动并使用UnityPlayer类,您可能会遇到编译错误。在这种情况下,重命名UnityPlayerUnityPlayerForActivityOrService.

Android:UnityPlayer java 类不再扩展 FrameLayout

UnityPlayerJava 类不再扩展FrameLayout.如果您需要访问FrameLayout,调用getFrameLayout函数UnityPlayer实例。

FetchFirstCompatibleTypeUsingScriptableRenderPipelineExtension 替换为 GetDerivedTypesSupportedOnCurrentPipeline

RenderPipelineEditorUtility.FetchFirstCompatibleTypeUsingScriptableRenderPipelineExtension现已弃用。请改用 GetDerivedTypesSupportedOnCurrentPipeline。该方法的签名也不同;现在它返回所有派生类型,而不仅仅是它遇到的第一个类型。这可以防止不一致,因为 Unity 不保证类型顺序。

CustomEditorForRenderPipelineAttribute 和 VolumeComponentMenuForRenderPipelineAttribute 已弃用

CustomEditorForRenderPipelineAttribute 和 VolumeComponentMenuForRenderPipelineAttribute 现已弃用。请改用 CustomEditorVolumeComponentMenu。若要在这些属性处于活动状态时限制管道的选择,请将它们与 SupportedOnRenderPipelineAttribute 组合并指定 RenderPipelineAsset 类型。如果要激活可与内置渲染管线配合使用的SRP属性,请使用不带参数的SupportedOnRenderPipelineAttribute。当需要在特定管道上激活这两个属性时,这为这两个属性提供了统一的工作流。

Android Gradle 模板使用情况的更改

用于修改 Android 的新 APIGradle一种 Android 构建系统,可自动执行多个构建过程。这种自动化意味着许多常见的生成错误不太可能发生。更多信息
请参阅术语表
项目被引入。该 API 可用于替换旧的 Android Gradle 模板工作流程。如果不使用新 API,模板仍将像以前一样工作。

要使用新的 API,可以使用模板升级器

  1. 打开人造人玩家设置设置,可让您为 Unity 构建的最终游戏设置各种特定于玩家的选项。更多信息
    请参阅术语表
    .
  2. 转到发布设置>生成
  3. 选择“将模板升级到 C#”。

环境光照:默认情况下,环境光探针和天空盒反射探针不再烘焙

Unity 的渐进式光照贴图器不再烘焙环境光探针和天空盒(skybox) 一种特殊类型的材质,用于表示天空。通常是六面的。更多信息
请参阅术语表
反射探针一个渲染组件,可捕获周围环境的各个方向的球形视图,就像相机一样。然后,捕获的图像将存储为立方体贴图,可供具有反射材质的对象使用。更多信息
请参阅术语表
默认情况下,并且 照明(Lighting) 窗口中的 重新计算环境照明(Recalculate Environment Lighting) 设置已被删除。

为了避免新创建的场景没有环境光照,Unity 会分配一个默认的光照数据资产,其中包含与默认天空盒材质匹配的环境光照。

在以下情况下,必须在“照明”窗口中选择“生成照明”

  • 修复场景中的灯光,其中依赖于之前的自动烘焙行为。
  • 如果更改环境照明设置,则查看新场景中的照明变化。

如果您依赖于之前的自动烘焙行为,但使用默认环境光照设置,则 Unity 会升级场景以使用默认光照数据资产。

自动生成的照明已被删除

窗口中的自动生成设置已被删除,相关 API 现已过时。

要为场景生成烘焙光照,您可以执行以下任一作:

  • 照明(Lighting) 窗口中选择 生成照明(Generate Lighting)
  • 使用Lightmapping.Bake应用程序接口。
  • 使用Lightmapping.BakeAsync应用程序接口。

要在编辑时检查光照贴图,你现在可以选择 场景视图绘制模式(Scene View Draw Mode) 并将 光照数据(Lighting Data) 设置为 预览(Preview)。这将显示烘焙光照的预览。预览光照贴图是非破坏性的,你可以在烘焙场景后使用它们。

如果场景依赖于自动生成的光照,则它不再具有烘焙光照。在 光照(Lighting) 窗口中选择 生成光照(Generate Lighting) 以手动重新烘焙光照。

如果使用脚本打开场景,现在必须使用Lightmapping.BakeLightmapping.BakeAsync而不是等待自动生成的光照完成。

DepthAuto、ShadowAuto 和 VideoAuto 图形格式现已过时

以下图形格式之前在 2022.1 中已弃用,现在已过时,并且在使用它们时会产生编译错误:

  • GraphicsFormat.DepthAuto
  • GraphicsFormat.ShadowAuto
  • GraphicsFormat.VideoAuto

GraphicsFormatUtility.GetGraphicsFormat API 不再返回过时的格式。相反,它执行以下作:

  • 翻译RenderTextureFormat.DepthGraphicsFormat.None而不是GraphicsFormat.DepthAuto.GraphicsFormat.None表示仅深度渲染。
  • 翻译RenderTextureFormat.ShadowmapGraphicsFormat.None而不是GraphicsFormat.ShadowAuto.如果您创建渲染纹理(render texture一种特殊类型的纹理,在运行时创建和更新。要使用它们,请先创建一个新的渲染纹理,并指定要渲染到其中的摄像机之一。然后,你可以在材质中使用渲染纹理,就像使用常规纹理一样。更多信息
    请参阅术语表
    使用GraphicsFormat.Noneformat,必须将 RenderTextureDescriptor.shadowSamplingMode 设置为 ShadowSamplingMode.CompareDepths 才能启用深度比较采样。

因为GraphicsFormat.DepthAutoGraphicsFormat.ShadowAuto都被视为深度模具格式,但用作颜色格式,您可能需要调整代码。

例如,在以下代码段中,GraphicsFormatUtility.IsDepthFormat返回false而不是true:

RenderTextureDescriptor desc = new RenderTextureDescriptor(256, 256, RenderTextureFormat.Depth, 32);
bool isDepthOnly = GraphicsFormatUtility.IsDepthFormat(desc.graphicsFormat);

要检查RenderTextureRenderTextureDescriptor是仅深度,请使用以下选项之一:

  • if (renderTexture.graphicsFormat == GraphicsFormat.None && renderTexture.depthStencilFormat != GraphicsFormat.None)
  • if (renderTexture.format == RenderTextureFormat.Depth || renderTexture.format == RenderTextureFormat.Shadowmap)

默认情况下,Mipmap 限制不再影响运行时纹理

默认情况下,运行时创建的 2D 纹理将不再限制其 mipmap 上传。以前,必须通过 Texture2D 构造函数显式禁用 mipmap 限制(通过提供ignoreMipmapLimitboolean 参数,当使用 TextureFormat 调用构造函数时,或IgnoreMipmapLimitTextureCreationFlag 调用时,使用 GraphicsFormat),或通过切换tex.ignoreMipmapLimit构建的纹理。此行为已更改:mipmap 限制现在是运行时创建的 2D 纹理的选择。

如果不进行项目更改,在以下情况下,用户会错过GPU带宽和内存优化,并且可能会看到比预期更好的质量,因为纹理现在以全分辨率上传:

  • 不知不觉中期望运行时纹理遵循质量设置的用户。
  • 有意希望运行时纹理遵循质量设置的用户,并通过使用任何默认的 Texture2D 构造函数实现此目的。

在以下情况下,用户不受此更改的影响:

  • 明确希望运行时纹理保持全分辨率的用户。
  • 有意希望运行时纹理遵循质量设置的用户,并通过显式执行以下作来实现:
    • 将构造函数与 TextureFormat 一起使用,使用falseignoreMipmapLimit,
    • 设置tex.ignoreMipmapLimitfalse施工后。

这些用户可能希望升级他们的脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
请参阅术语表
如果他们使用已弃用的构造函数。

要升级脚本,请使用 Texture2D 构造函数和MipmapLimitDescriptor以指示运行时纹理应受质量设置的影响。

进行此更改是为了与 Texture2DArray 的新 mipmap 限制支持保持一致。我们没有让每个纹理形状定义自己的默认 mipmap 限制行为,而是选择一致性,并决定运行时纹理应显式启用 mipmap 限制。这种选择加入行为比选择退出更受欢迎,因为运行时纹理通常以更通用的方式使用,其中意外上传的 mip 比预期少的 mip 可能比意外上传更多 mip 更有害。

使用 UXML 增强自定义控件创建功能

简化了在 UI Toolkit 中使用 UXML 创建自定义控件的过程。此更改使工作流程更快、更易于使用。

一个关键的改进是引入了UxmlElementUxmlAttribute属性。这些属性简化了属性创作,并自动从属性名称派生属性名称,从而消除了对 UxmlTraits 和 UxmlFactory 类的需求。

你现在可以为特定数据类型创建自定义属性转换器,确保值与UXML属性字符串的无缝转换。我们还增强了UxmlObjects,允许在视觉元素实例化或派生自 C# 的可视化树的节点VisualElement类。 您可以设置外观样式、定义行为并将其作为 UI 的一部分显示在屏幕上。更多信息
请参阅术语表
. 新系统利用 Unity 序列化并使用源生成器创建UxmlSerializedData来自所有元素的类UxmlAttribute每个自定义元素类的定义,从而支持属性抽屉一种 Unity 功能,允许你使用脚本上的属性或通过控制特定 Serializable 类的外观
来自定义检查器窗口中某些控件的外观更多信息 请参阅术语表
、装饰器和各种属性。

此外,属性覆盖的引入允许在使用继承属性覆盖UXML属性行为时提供更大的灵活性。这些改进为在 Unity 6.0 及更高版本中创建复杂的自定义控件提供了更高效、更用户友好的体验。

有关更多示例和信息,请参阅将自定义控件从早期版本迁移到 Unity 6

资产/创建菜单和脚本模板已重新组织

资产/创建菜单已重新组织和分类。作为此次大修的一部分,Unity 内置 ScriptTemplate 文件已重命名。

已将元素添加到 Assets/Create 菜单的用户,其中CreateAssetMenuAttribute,MenuItemAttribute或者自定义 ScriptTemplate 可能想要更改其菜单项的优先级,因为它相对于其他元素的位置现在不同。

通过执行这些菜单项来创建资产的用户EditorApplication.ExecuteMenuItemAPI,必须验证菜单项的新路径。

之前重写了 Unity 内置 ScriptTemplates 的用户必须更新其重写文件的名称,以确保它们与内置模板的新名称匹配。

UI Toolkit 事件处理重组和简化

ExecuteDefaultActionExecuteDefaultActionAtTarget方法已被弃用。添加了以下方法来替换它们:

  • HandleEventTrickleDown
  • HandleEventBubbleUp

Unity 在事件调度路径中的每个元素上立即执行这些新方法TrickleDown和之前BubbleUp回调。在这些方法中,调度阶段设置为TrickleDownBubbleUp相应地,事件的currentTarget与执行该方法的元素一致。

AtTargetdispatching 阶段和PreventDefault方法已被弃用。叫StopPropagationStopPropagationImmediately现在停止进一步执行HandleEventTrickleDownHandleEventBubbleUp同时停止进一步调用TrickleDownBubbleUp回调。

在大多数情况下,如果不升级到新方法,则代码不应显着更改其行为。UI Toolkit 仍以与以前相同的顺序调用过时的方法,或者进行最少的调整。但是,UI Toolkit 中的所有标准控件都已迁移到使用新方法,并相应地调整其逻辑执行顺序。与以前的 Unity 版本相比,将对过时方法的调用与升级的控件混合使用可能会导致某些逻辑不同步。

要将现有代码升级到新方法,请按以下步骤作:

  • 取代ExecuteDefaultActionExecuteDefaultActionAtTargetHandleEventBubbleUpPreventDefaultStopPropagation(或删除对PreventDefault如果StopPropagation已在同一代码块中调用)。这涵盖了大多数情况。
  • 如果您因为旧代码调用而遇到问题PreventDefaultBubbleUp回调,这不再可能,并且无法被 StopPropagation 替换,因为事件已经到达其目标,请考虑在TrickleDown要调用的阶段StopPropagation.此步骤通常足以解决此类情况。
  • 在极少数情况下,上述更改不足以维持旧代码的功能,则需要进行彻底的逐案分析。在这些情况下,解决方案可能并不总是简单明了。

Metal 中的缓冲区布局更改

Unity 的交叉编译着色器在 GPU 上运行的程序。更多信息
请参阅术语表
到 金属着色器 在缓冲区布局方面发生了变化。与以前版本的 Unity 相比,任何包含 min16float、half 或 real 类型的缓冲区现在都具有不同的内存布局。

仅当您以 Metal 为目标并使用将原始数据直接写入缓冲区的 API 时,才需要采取行动,例如:

如果仅使用 CommandBuffer.SetComputeFloatParamMaterial.SetFloat,则无需执行作。

更具体地说,HLSL min16float、half 和 real 内部缓冲区始终转换为 32 位 MSL float,而在以前的 Unity 版本中,它们可以转换为 16 位 MSL half,具体取决于目标平台。

如果仅在 Metal 平台上测试了着色器,请检查生成的 MSL 代码中的缓冲区,以确保布局与在 C# 中访问的缓冲区数据匹配。可以通过添加#pragma metal_fxc_allow_float16_in_cpu_visible_buffers添加到着色器代码,并查看是否有任何视觉伪影已修复。如果发现差异,请删除此编译指示并调整着色器和 C# 代码,使其在没有编译指示的情况下正常工作,以提高项目的跨平台兼容性。

若要在缓冲区中使用本机 16 位浮点数,请考虑使用 DXC HLSL 编译器并将#pragma require Native16Bit到着色器。但请注意,在 Unity 中使用 DXC 仍处于实验阶段。

不再使用全局包缓存中的 Packages 文件夹

全局包缓存包含多个子文件夹。其中一个子文件夹packages,包管理器不再使用。

仅当自动化脚本或管道直接与全局包缓存的packages子文件夹,例如,如果您使用UPM_CACHE_PATH环境变量.如果是这样,您可以删除引用。Unity 不提供直接替换子文件夹packages.现在,包直接提取到项目缓存中。

如果您不再维护使用 Unity 2023.2 创建的项目,您可以安全地删除packages全局包缓存根目录。此作是可选的。

不再支持UPM_CACHE_PATH环境变量

以前版本的 Unity 编辑器支持使用UPM_CACHE_PATH环境变量来指定您希望包管理器存储包压缩包 tarball 的未压缩内容的位置的绝对路径。

仅当自动化脚本或管道在UPM_CACHE_PATH.无可替代UPM_CACHE_PATH因为包现在直接提取到项目缓存中。但是,如果您曾经使用UPM_CACHE_PATH,您现在可以使用UPM_CACHE_ROOT环境变量,用于设置全局缓存的根。请注意,全局缓存根目录是以前与UPM_CACHE_PATH.

有关更多信息,请参阅自定义全局缓存

默认 Android 工具版本已更改

Unity 更新了 Android 使用的以下工具的默认版本。NDK、SDK 命令行工具和 SDK 工具的默认版本保持不变。更新版本如下:

工具 版本
Gradle 8.4
Android Gradle 插件 8.3.0
SDK 构建工具 34.0.0
SDK 平台工具 34.0.5
Java 开发工具包 (JDK) 17

如果您的项目使用自定义 gradle 模板,请考虑重新创建这些模板,以避免更新后的 Android Gradle 插件版本出现任何构建问题。如需了解详情,请参阅使用 Gradle 模板文件修改 Gradle 项目文件

Unity 编辑器附带的 7-Zip 版本不再支持 zstandard 压缩

以前的 Unity 编辑器版本包括一个支持 zstandard 的 7-Zip 分支压缩一种存储数据的方法,可减少所需的存储空间量。请参阅纹理压缩动画压缩音频压缩构建压缩
请参阅术语表
:

Unity 6.0 包括适用于 Windows、macOS 和 Linux 编辑器的 7-Zip 的常规上游版本 23.01。但是,这个上游版本的 7-Zip 不支持 .zip 或 .7z 存档的 zstandard 压缩或解压缩。它还缺乏对 mcmilk/7-Zip-zstd 分支中添加的其他压缩格式和哈希算法的支持。

如果您有使用 7za 的包或使用 zstandard 压缩对存档进行作的 7z.exe 二进制文件,请使用以下选项之一:

  • 使用替代压缩格式,例如使用 deflate 算法.zip存档或使用 LZMA 或 LZMA2 .7z存档。
  • 提供支持所需存档格式和压缩算法的您自己的二进制文件。

Object.FindObjectsOfType 和 Object.FindObjectOfType 已过时

Object.FindObjectsOfType现在已经过时了。用Object.FindObjectsByType相反。

Object.FindObjectOfType现在已经过时了。用Object.FindFirstObjectByTypeObject.FindAnyObjectByType相反。

这些现已过时的函数在返回给您之前自动按实例 ID 对结果进行排序。此过程需要时间,尤其是当对象列表很大(例如,超过 100 个对象)时。

新的ByType函数采用排序模式 (FindObjectsSortMode) 作为参数。选择传入FindObjectsSortMode.InstanceID行为与以前一样,并返回按实例 ID 排序的对象。如果您改为传入FindObjectsSortMode.None,则列表返回未排序,这可以明显更快。建议您使用FindObjectsSortMode.None.

其他资源

升级到 Unity 6.1
升级到 Unity 2023.2