Version: 6000.3
语言: 中文
升级到 Unity 6.0
升级到 Unity 2023.1

升级到 Unity 2023.2

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

页面大纲

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

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

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

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

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

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

自动生成的照明已被删除

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

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

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

检查光照贴图(lightmaps一种预渲染的纹理,包含光源对场景中静态对象的效果。光照贴图覆盖在场景几何体之上,以创建光照效果。更多信息
请参阅术语表
在编辑时,你现在可以选择 场景视图绘制模式(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. 如果您创建渲染纹理一种特殊类型的纹理,在运行时创建和更新。要使用它们,请先创建一个新的渲染纹理,并指定要渲染到其中的摄像机之一。然后,你可以在材质中使用渲染纹理,就像使用常规纹理一样。更多信息
    请参阅术语表
    使用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 简化自定义控件的创建,以加快工作流程并使其更加直观。

一个关键的改进是引入了 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 工具包文档,并继续关注今年秋季的深入博客文章。

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

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

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

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

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

UI Toolkit 事件处理重组和简化

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

  • HandleEventTrickleDown
  • HandleEventBubbleUp

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

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

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

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

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

其他资源

升级到 Unity 6.0
升级到 Unity 2023.1