版本:Unity 6 (6000.0)
语言:英语
升级至 Unity 6
升级至 Unity 2023.1

升级至 Unity 2023.2

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

页面大纲

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

Unity 的渐进式 光照贴图器Unity 中的一个工具,根据场景中灯光和几何体的排列烘焙光照贴图。 更多信息
参见 术语表
不再默认烘焙环境探测器和 天空盒一种特殊类型的材质,用于表示天空。 通常是六面体。 更多信息
参见 术语表
反射探测器一个渲染组件,可以捕获其周围环境在所有方向上的球形视图,就像一个相机。 捕获的图像然后存储为一个立方体贴图,可以由具有反射材质的物体使用。 更多信息
参见 术语表
,并且“照明”窗口中的“重新计算环境照明”设置已删除。

为了避免新创建的 场景场景包含游戏的环境和菜单。 将每个独特的场景文件视为一个独特的关卡。 在每个场景中,您放置环境、障碍物和装饰,本质上是分段设计和构建您的游戏。 更多信息
参见 术语表
没有环境照明,Unity 会分配一个默认的 照明数据资产,其中包含与默认天空盒材质相匹配的环境照明。

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

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

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

已删除自动生成的照明

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

要为场景生成烘焙的照明,您可以执行以下任一操作

  • 在“照明”窗口中选择“生成照明”。
  • 使用 Lightmapping.Bake API。
  • 使用 Lightmapping.BakeAsync API。

要检查您在编辑时 光照贴图预渲染的纹理,其中包含光源对场景中静态物体的影响。 光照贴图叠加在场景几何体上,以创建照明的效果。 更多信息
参见 术语表
,您现在可以选择一个 场景视图绘制模式 并将“照明数据”设置为“预览”。 这将显示烘焙照明的预览。 预览光照贴图是非破坏性的,您可以在烘焙场景后使用它们。

如果场景依赖于自动生成的照明,它将不再具有烘焙的照明。 在“照明”窗口中选择“生成照明”以手动重新烘焙照明。

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

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

以下图形格式,之前在 2022.1 中已弃用,现在已过时,如果您使用它们,将产生编译错误

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

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

  • RenderTextureFormat.Depth 转换为 GraphicsFormat.None,而不是 GraphicsFormat.DepthAutoGraphicsFormat.None 表示仅深度渲染。
  • RenderTextureFormat.Shadowmap 转换为 GraphicsFormat.None,而不是 GraphicsFormat.ShadowAuto。 如果您使用 GraphicsFormat.None 格式创建 渲染纹理一种特殊类型的纹理,在运行时创建和更新。 要使用它们,首先创建一个新的渲染纹理,并指定您的相机之一渲染到其中。 然后,您可以像使用普通纹理一样在材质中使用渲染纹理。 更多信息
    参见 术语表
    ,您必须将 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 限制(通过在使用 TextureFormat 调用构造函数时提供一个 ignoreMipmapLimit 布尔参数,或者在使用 GraphicsFormat 调用构造函数时提供 IgnoreMipmapLimit TextureCreationFlag),或者通过切换已构建纹理的 tex.ignoreMipmapLimit。 此行为已更改:mipmap 限制现在对于运行时创建的 2D 纹理是可选的

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

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

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

  • 明确希望运行时纹理保持全分辨率的用户。
  • 有意希望运行时纹理遵循质量设置并通过明确执行以下操作来实现的用户
    • 使用具有 TextureFormat 的构造函数,ignoreMipmapLimitfalse
    • 在构造后将 tex.ignoreMipmapLimit 设置为 false

如果这些用户使用过时的构造函数,则可能需要升级其 脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间推移修改组件属性并以您喜欢的任何方式响应用户输入。 更多信息
参见 术语表

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

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

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

简化了使用 UXML 在 UI(用户界面) 允许用户与您的应用程序交互。 Unity 目前支持三种 UI 系统。 更多信息
参见 术语表
工具包中创建自定义控件的操作,以加快工作流程并使其更直观。

一项关键改进是引入了 UxmlElement 和 UxmlAttribute 属性。 这些属性简化了属性创作,并自动从属性名称推导出属性名称,从而消除了对 UxmlTraits 和 UxmlFactory 类的需求。

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

引入“属性覆盖”允许您自定义 UXML 属性的行为,并在您使用继承属性时提供灵活性。 这些改进为在 Unity 2023.2 及更高版本中创建复杂的 UI 元素提供了更高效和更友好的体验。

例如,以下代码示例是使用 UxmlFactoryUxmlTraits 创建的自定义控件

public class HealthBar : VisualElement
{
   private const float k_LowValue = 0;
   private const float k_HighValue = 100;

   // Declare as usable with Uxml
   public new class UxmlFactory : UxmlFactory<HealthBar, UxmlTraits> { }
   // Define attributes (and connect with class properties) for Uxml 
   public new class UxmlTraits : BindableElement.UxmlTraits
   {
       UxmlColorAttributeDescription m_Color = new UxmlColorAttributeDescription { name = "color", defaultValue = Color.white };
       UxmlFloatAttributeDescription m_Value = new UxmlFloatAttributeDescription { name = "value", defaultValue = k_HighValue };

       public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc)
       {
           base.Init(ve, bag, cc);
           var bar = ve as HealthBar;
           bar.color = m_Color.GetValueFromBag(bag, cc);
           bar.value = m_Value.GetValueFromBag(bag, cc);
       }
   }

   public Color color { get; set; }

   [Range(k_LowValue, k_HighValue)]
   public float value { get; set; }
}

以下代码示例与前面的代码示例执行相同的操作,但使用新的 UxmlElementUxmlAttributes 系统

[UxmlElement]
public class HealthBar2 : VisualElement
{
   private const float k_LowValue = 0;
   private const float k_HighValue = 100;

   [UxmlAttribute]
   public Color color { get; set; } = Color.white;

   [UxmlAttribute]
   [Range(k_LowValue, k_HighValue)]
   public float value { get; set; } = k_HighValue;
}

有关更多示例和信息,请参阅 Unity UI 工具包文档,并在秋季关注深入的博客文章。

Assets/Create 菜单和 ScriptTemplates 已重新组织

Assets/Create 菜单已重新组织并分类。 作为此次大修的一部分,Unity 内置 ScriptTemplate 文件已重命名。

使用 CreateAssetMenuAttribute``、MenuItemAttribute 或自定义 ScriptTemplate 向 Assets/Create 菜单添加元素的用户可能需要更改其菜单项的优先级,因为其相对于其他元素的放置位置现在不同了。

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

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

UI 工具包事件处理重新组织和简化

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

  • HandleEventTrickleDown
  • HandleEventBubbleUp

在事件分发路径中的每个元素上,Unity 在 `TrickleDown` 回调之后,`BubbleUp` 回调之前立即执行这些新方法。在这些方法执行期间,分发阶段分别设置为 `TrickleDown` 或 `BubbleUp`,并且事件的 `currentTarget` 与执行方法的元素一致。

`AtTarget` 分发阶段和 `PreventDefault` 方法已弃用。现在调用 `StopPropagation` 或 `StopPropagationImmediately` 会同时停止进一步执行 `HandleEventTrickleDown` 和 `HandleEventBubbleUp`,以及停止进一步调用 `TrickleDown` 和 `BubbleUp` 回调。

在大多数情况下,如果您不升级到新方法,您的代码行为应该不会发生明显变化。UI 工具包仍然按照以前的方式或经过少量调整后,以相同的顺序调用已弃用的方法。但是,UI 工具包中的所有标准控件都已迁移到使用新方法,并相应地调整了其逻辑执行顺序。将对已弃用方法的调用与升级控件的使用混合在一起,可能会导致某些逻辑与以前的 Unity 版本相比出现不同步。

要将现有代码升级到新方法,请执行以下操作:

  • 将 `ExecuteDefaultAction` 和 `ExecuteDefaultActionAtTarget` 替换为 `HandleEventBubbleUp`,将 `PreventDefault` 替换为 `StopPropagation`(或者如果在同一代码块中已经调用了 `StopPropagation`,则删除对 `PreventDefault` 的调用。这涵盖了大多数情况)。
  • 如果您因为旧代码在 `BubbleUp` 回调期间调用 `PreventDefault` 导致出现问题,而这现在不再可能,并且不能用 `StopPropagation` 替换,因为事件已经到达目标,请考虑在 `TrickleDown` 阶段添加回调以调用 `StopPropagation`。此步骤通常足以解决此类情况。
  • 在极少数情况下,如果上述更改不足以维护旧代码的功能,则需要进行逐案分析。在这种情况下,解决方案可能并不总是很直接。
升级至 Unity 6
升级至 Unity 2023.1