Version: Unity 6.0 (6000.0)
语言 : 中文
升级到 Unity 6
升级到 Unity 2023.1

升级到 Unity 2023.2

本页面列出了从 Unity 2023.1 版本升级到 2023.2 时 2023.2 中可能对现有项目造成影响的更改。

页面大纲

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

默认 Unity 渐进光照贴图不再烘焙环境探针和天空盒反射探针,并且光照 (Lighting) 窗口中的重新计算环境光照 (Recalculate Environment Lighting) 设置已删除。

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

在以下情况下,必须在光照 (Lighting) 窗口中选择生成光照 (Generate Lighting)

  • 修复依赖于先前自动烘焙行为的场景中的光源。
  • 更改环境光照设置时查看新场景中的光照变化。

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

已删除自动生成光照

光照 (Lighting) 窗口中的自动生成 (Auto Generate) 设置已删除,相关 API 现在已弃用。

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

  • 光照 (Lighting) 窗口中选择生成光照 (Generate Lighting)
  • 使用 Lightmapping.Bake API。
  • 使用 Lightmapping.BakeAsync API。

要在编辑时检查光照贴图,现在可以选择场景视图绘制模式 (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.Depth 转换为 GraphicsFormat.None 而非 GraphicsFormat.DepthAutoGraphicsFormat.None 表示仅深度渲染。
  • RenderTextureFormat.Shadowmap 转换为 GraphicsFormat.None 而非 GraphicsFormat.ShadowAuto。如果使用 GraphicsFormat.None 格式创建渲染纹理,必须将 RenderTextureDescriptor.shadowSamplingMod 设置为 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 Limits 不再影响运行时纹理

默认运行时创建的 2D 纹理将不再限制其 Mipmap 上传。以前,必须通过 Texture2D 构造函数显式禁用 Mipmap 限制(使用 TextureFormat 调用构造函数时提供 ignoreMipmapLimit 布尔参数,使用 GraphicsFormat 调用时提供 IgnoreMipmapLimit TextureCreationFlag),或者切换构造纹理的 tex.ignoreMipmapLimit。此行为已更改:现在 Mipmap 限制可以针对运行时创建的 2D 纹理选择加入。

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

  • 用户在不知情地情况下预期运行时纹理遵循质量设置。
  • 用户有意想要运行时纹理遵循质量设置并使用任何默认 Texture2D 构造函数实现此目的。

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

  • 用户明确想要运行时纹理保持全分辨率。
  • 用户有意想要运行时纹理遵循质量设置并通过明确以下内容实现:
    • 使用具有 TextureFormat 的构造函数将 ignoreMipmapLimit 设置为 false
    • 在构建后将 tex.ignoreMipmapLimit 设置为 false

如果使用已弃用的构造函数,这些用户可能想要升级其脚本。

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

进行此更改是为了与 Texture2DArrays 的新 Mipmap 限制支持保持一致。我们选择一致性,并决定运行时纹理应显式启用 Mipmap 限制,而不是让每个纹理形状定义自身的默认 Mipmap 限制行为。选择加入行为比选择退出更可取,因为运行时纹理通常以更通用的方式使用,意外上传的 Mip 数量少于预期可能比意外上传更多的 Mip 更有害。

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

使用__ UI__(即用户界面,User Interface)让用户能够与您的应用程序进行交互。Unity 目前支持三种 UI 系统。更多信息
See in Glossary
工具包中的 UXML 简化自定义控件的创建,从而加快工作流程并使其更加直观。

一项关键的改进是引入了 UxmlElement 和 UxmlAttribute 属性。这些属性可简化属性创作,并自动从属性名称派生属性名称,无需 UxmlTraits 和 UxmlFactory 类。

现在可以为特定数据类型创建自定义属性转换器,确保值在 UXML 属性字符串之间无缝转换。我们还增强了 UxmlObject,允许在视觉元素中定义自定义的非视觉元素。新系统利用 Unity 序列化并使用源生成器为每个自定义元素类的所有 UxmlAttribute 定义中的元素创建 UxmlSerializedData 类,从而支持自定义属性绘制器、装饰器和各种属性。

“属性覆盖”的引入允许您自定义 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 工具包文档,并敬请关注今秋的深度博客文章。

已重新组织资源/创建菜单和 ScriptTemplate

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

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

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

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

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

ExecuteDefaultActionExecuteDefaultActionAtTarget 方法已弃用。添加了以下方法来替换上述方法:

  • HandleEventTrickleDown
  • HandleEventBubbleUp

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

AtTarget 分发阶段和 PreventDefault 方法已弃用。现在,调用 StopPropagationStopPropagationImmediately 会在停止进一步调用 TrickleDownBubbleUp`` 回调的同时停止进一步执行HandleEventTrickleDownHandleEventBubbleUp`。

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

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

  • ExecuteDefaultActionExecuteDefaultActionAtTarget 替换为 HandleEventBubbleUp,将 PreventDefault 替换为 StopPropagation(如果已在同一代码块中调用 StopPropagation,则删除对 PreventDefault 的调用。这涵盖了大多数情况)。
  • 如果因为旧代码在 BubbleUp 回调期间调用 PreventDefault(不再可行,并且无法由 StopPropagation 替换,因为事件已经到达目标)而出现问题,请考虑在 TrickleDown 阶段添加回调以调用 StopPropagation。此步骤通常足以应对此类情况。
  • 在极少数情况下,如果上述更改不足以维持旧代码的功能,则需要进行全面的逐案例分析。在这种情况下,解决方案可能并非总是那么简单。
升级到 Unity 6
升级到 Unity 2023.1
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961