本页面列出了从 Unity 2023.1 版本升级到 2023.2 时 2023.2 中可能对现有项目造成影响的更改。
默认 Unity 渐进光照贴图不再烘焙环境探针和天空盒反射探针,并且光照 (Lighting) 窗口中的重新计算环境光照 (Recalculate Environment Lighting) 设置已删除。
为了避免新建场景没有环境光照,Unity 会分配默认的光照数据资源,其中包含与默认天空盒材质匹配的环境光照。
在以下情况下,必须在光照 (Lighting) 窗口中选择生成光照 (Generate Lighting):
如果依赖以前的自动烘焙行为,但使用默认环境光照设置,Unity 会升级场景以使用默认光照数据资源。
光照 (Lighting) 窗口中的自动生成 (Auto Generate) 设置已删除,相关 API 现在已弃用。
要为场景生成烘焙光照,可以执行以下任一操作:
Lightmapping.Bake API。Lightmapping.BakeAsync API。要在编辑时检查光照贴图,现在可以选择场景视图绘制模式 (Scene View Draw Mode) 并将光照数据 (Lighting Data) 设置为预览 (Preview)。此时将显示烘焙光照的预览。预览光照贴图是无损的,您可以在烘焙场景后使用预览光照贴图。
如果场景依赖于自动生成光照,则不再具有其烘焙光照。在光照 (Lighting) 窗口中选择生成光照 (Generate Lighting) 以手动重新烘焙光照。
如果使用脚本打开场景,现在必须使用 Lightmapping.Bake 或 Lightmapping.BakeAsync,而非等待自动生成光照完成。
以下图形格式之前在 2022.1 版中已弃用,现在已过时,如果使用这些图形格式,会产生编译错误:
GraphicsFormat.DepthAutoGraphicsFormat.ShadowAutoGraphicsFormat.VideoAutoGraphicsFormatUtility.GetGraphicsFormat API 不再返回过时格式,而是执行以下操作:
RenderTextureFormat.Depth 转换为 GraphicsFormat.None 而非 GraphicsFormat.DepthAuto。GraphicsFormat.None 表示仅深度渲染。RenderTextureFormat.Shadowmap 转换为 GraphicsFormat.None 而非 GraphicsFormat.ShadowAuto。如果使用 GraphicsFormat.None 格式创建渲染纹理,必须将 RenderTextureDescriptor.shadowSamplingMod 设置为 ShadowSamplingMode.CompareDepths 以启用深度比较采样。由于 GraphicsFormat.DepthAuto 和 GraphicsFormat.ShadowAuto 都被视为深度模板格式,但用作颜色格式,因此可能需要调整代码。
例如,在以下代码片段中,GraphicsFormatUtility.IsDepthFormat 返回 false 而非 true:
RenderTextureDescriptor desc = new RenderTextureDescriptor(256, 256, RenderTextureFormat.Depth, 32);
bool isDepthOnly = GraphicsFormatUtility.IsDepthFormat(desc.graphicsFormat);
要检查 RenderTexture 或 RenderTextureDescriptor 是否仅限深度,请使用以下其中一种方法:
if (renderTexture.graphicsFormat == GraphicsFormat.None && renderTexture.depthStencilFormat != GraphicsFormat.None)if (renderTexture.format == RenderTextureFormat.Depth || renderTexture.format == RenderTextureFormat.Shadowmap)
默认运行时创建的 2D 纹理将不再限制其 Mipmap 上传。以前,必须通过 Texture2D 构造函数显式禁用 Mipmap 限制(使用 TextureFormat 调用构造函数时提供 ignoreMipmapLimit 布尔参数,使用 GraphicsFormat 调用时提供 IgnoreMipmapLimit TextureCreationFlag),或者切换构造纹理的 tex.ignoreMipmapLimit。此行为已更改:现在 Mipmap 限制可以针对运行时创建的 2D 纹理选择加入。
如果不进行项目更改,在以下情况下,用户会错过 GPU 带宽和内存优化,并且质量可能好于预期,因为现在纹理以全分辨率上传:
在以下情况下,用户不受此更改的影响:
ignoreMipmapLimit 设置为 false,tex.ignoreMipmapLimit 设置为 false。如果使用已弃用的构造函数,这些用户可能想要升级其脚本。
要升级脚本,请使用带有 MipmapLimitDescriptor 的 Texture2D 构造函数来指示运行时纹理将受到质量设置的影响。
进行此更改是为了与 Texture2DArrays 的新 Mipmap 限制支持保持一致。我们选择一致性,并决定运行时纹理应显式启用 Mipmap 限制,而不是让每个纹理形状定义自身的默认 Mipmap 限制行为。选择加入行为比选择退出更可取,因为运行时纹理通常以更通用的方式使用,意外上传的 Mip 数量少于预期可能比意外上传更多的 Mip 更有害。
使用__ UI__(即用户界面,User Interface)让用户能够与您的应用程序进行交互。Unity 目前支持三种 UI 系统。更多信息
See in Glossary 工具包中的 UXML 简化自定义控件的创建,从而加快工作流程并使其更加直观。
一项关键的改进是引入了 UxmlElement 和 UxmlAttribute 属性。这些属性可简化属性创作,并自动从属性名称派生属性名称,无需 UxmlTraits 和 UxmlFactory 类。
现在可以为特定数据类型创建自定义属性转换器,确保值在 UXML 属性字符串之间无缝转换。我们还增强了 UxmlObject,允许在视觉元素中定义自定义的非视觉元素。新系统利用 Unity 序列化并使用源生成器为每个自定义元素类的所有 UxmlAttribute 定义中的元素创建 UxmlSerializedData 类,从而支持自定义属性绘制器、装饰器和各种属性。
“属性覆盖”的引入允许您自定义 UXML 属性的行为,并在处理继承属性时提供灵活性。这些改进为在 Unity 2023.2 及更高版本中创建复杂的 UI 元素提供了更高效和友好的用户体验。
例如,以下示例代码是使用 UxmlFactory 和 UxmlTraits 创建的自定义控件:
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; }
}
以下示例代码执行与先前示例代码相同的操作,但使用新的 UxmlElement 和 UxmlAttributes 系统:
[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 文件已重命名。
使用 CreateAssetMenuAttribute``, MenuItemAttribute 或自定义 ScriptTemplate 向资源/创建菜单添加元素的用户可能想要更改其菜单项的优先级,因为现在它相对于其他元素的位置不同了。
使用 EditorApplication.ExecuteMenuItem API 通过执行这些菜单项来创建资源的用户必须验证菜单项的新路径。
以前覆盖过 Unity 内置 ScriptTemplate 的用户必须更新其覆盖文件的名称,以确保名称与内置模板的新名称匹配。
ExecuteDefaultAction 和 ExecuteDefaultActionAtTarget 方法已弃用。添加了以下方法来替换上述方法:
HandleEventTrickleDownHandleEventBubbleUpUnity 在事件分发路径中的每个元素上执行这些新方法,在该元素的 TrickleDown 之后和 BubbleUp 回调之前立即执行。在这些方法中,分发阶段相应地设置为 TrickleDown 或 BubbleUp,并且事件的 `currentTarget`` 与执行该方法的元素一致。
AtTarget 分发阶段和 PreventDefault 方法已弃用。现在,调用 StopPropagation 或 StopPropagationImmediately 会在停止进一步调用 TrickleDown 和 BubbleUp`` 回调的同时停止进一步执行HandleEventTrickleDown和HandleEventBubbleUp`。
在大多数情况下,如果不升级到新方法,代码的行为将不会显著改变。UI 工具包仍然按照与以前相同的顺序调用过时方法,或进行小幅调整。但是,UI 工具包中的所有标准控件都已迁移到使用新方法,并相应地调整其逻辑执行顺序。将对过时方法的调用与升级控件的使用混合可能会导致某些逻辑与以前的 Unity 版本不同步。
要将现有代码升级到新方法,请按照以下步骤操作:
ExecuteDefaultAction 和 ExecuteDefaultActionAtTarget 替换为 HandleEventBubbleUp,将 PreventDefault 替换为 StopPropagation(如果已在同一代码块中调用 StopPropagation,则删除对 PreventDefault 的调用。这涵盖了大多数情况)。BubbleUp 回调期间调用 PreventDefault(不再可行,并且无法由 StopPropagation 替换,因为事件已经到达目标)而出现问题,请考虑在 TrickleDown 阶段添加回调以调用 StopPropagation。此步骤通常足以应对此类情况。