从 Godot 4.2 升级到 Godot 4.3
对于大多数使用 4.2 制作的游戏和应用程序来说,迁移到 4.3 应该相对安全。本页旨在介绍迁移项目时需要注意的所有事项。
破坏性更改
如果你要从 4.2 迁移到 4.3,这里列出的破坏性更改可能会影响到你。更改按照领域/系统分组。
这篇文章指出了每项破坏性改动是否会影响 GDScript,以及 C# 的破坏性改动是 二进制兼容 还是 源代码兼容:
二进制兼容 —— 现有二进制文件无需重新编译即可加载并成功执行,运行时的行为不会改变。
源代码兼容—— 在升级 Godot 时,源代码可成功编译,无需更改。
GDExtension
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
GDExtension |
||||
移除了 |
❌ |
❌ |
❌ |
|
移除了 |
❌ |
❌ |
❌ |
|
移除了 |
❌ |
❌ |
❌ |
由于这些方法基本上无法以任何有用的方式使用,这些方法已被移除。请改用 GDExtensionManager::load_extension 和 GDExtensionManager::unload_extension 来正确加载和卸载 GDExtension。
动画
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
动画 |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
动画混合器 |
||||
方法 |
✔️ |
❌ |
❌ |
|
3D骨骼 |
||||
方法 |
✔️ |
❌ |
✔️ |
|
信号 |
❌ |
❌ |
❌ |
|
3D骨骼附属 |
||||
方法 |
✔️ |
✔️ |
✔️ |
GUI 节点
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
AcceptDialog |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
物理
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
PhysicsShapeQueryParameters2D |
||||
属性 |
❌ |
❌ |
❌ |
备注
在 C# 中,枚举 PhysicsServer3D.G6DofJointAxisFlag 由于绑定生成器检测枚举前缀的方式而破坏了兼容性。在 GH-89851 中向该枚举添加了新成员,导致枚举成员被重命名。
渲染
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
RenderingDevice |
||||
枚举字段 |
✔️ |
❌ |
❌ |
|
枚举字段 |
✔️ |
❌ |
❌ |
|
枚举字段 |
✔️ |
❌ |
❌ |
|
枚举字段 |
✔️ |
❌ |
❌ |
|
枚举字段 |
✔️ |
❌ |
❌ |
|
枚举字段 |
✔️ |
❌ |
❌ |
|
|
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
|
RenderingServer |
||||
|
✔️ |
✔️ |
✔️ |
|
RenderSceneBuffersRD |
||||
|
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
备注
当 RenderingDevice.InitialAction 和 RenderingDevice.FinalAction 中枚举字段的值发生变化时,唯一使用它们的方法( draw_list_begin )添加了一个兼容性方法,该方法支持旧值。因此,实际上不会破坏兼容性。
备注
在 C# 中,枚举 RenderingDevice.DriverResource 由于绑定生成器检测枚举前缀的方式而破坏了兼容性。在 GH-83452 中向该枚举添加了新成员,导致枚举成员被重命名。
文本
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
字体 |
||||
|
✔️ |
✔️ |
✔️ |
|
RichTextLabel |
||||
|
✔️ |
✔️ |
✔️ |
|
TextServer |
||||
|
✔️ |
✔️ |
✔️ |
|
TextServerExtension |
||||
|
❌ |
❌ |
❌ |
音频
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
AudioStreamPlaybackPolyphonic |
||||
方法 |
✔️ |
✔️ |
✔️ |
TileMap
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
TileData |
||||
|
✔️ |
✔️ |
✔️ |
|
|
✔️ |
✔️ |
✔️ |
XR
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
WebXRInterface |
||||
|
✔️ |
❌ |
✔️ |
|
XRServer |
||||
|
✔️ |
❌ |
❌ |
编辑器插件
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
EditorInspectorPlugin |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
EditorPlugin |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
EditorSceneFormatImporterFBX |
||||
类型重命名为 |
❌ |
❌ |
❌ |
行为更改
In 4.3, some behavior changes have been introduced, which might require you to adjust your project.
核心
备注
二进制序列化已被修改,以修复脚本化对象和类型化数组的序列化问题(GH-78219 )。这一改动破坏了脚本编码/解码的兼容性。
备注
PackedByteArray 现在能够使用更紧凑的 base64 编码进行存储。但代价是它破坏了兼容性,这意味着旧版本的 Godot 可能无法打开由 4.3 版本保存的资源(GH-89186)。
为了最大限度地提高兼容性,目前这个新的存储格式将仅针对包含大型 PackedByteArray 的资源和场景启用。对于旧版本的 Godot,我们也会在补丁更新中添加对这个新格式的支持。一旦所有受支持的 Godot 版本都能够读取新格式,我们将逐步淘汰兼容性措施,并让所有资源和场景都使用新的存储格式。
备注
在 C# 中, Transform3D.InterpolateWith 的实现已修复为使用正确的操作顺序,在缩放之前应用旋转(GH-89843)。
备注
在 C# 中,修复了 Aabb.GetSupport 的实现,以正确返回支持向量(GH-88919)。
备注
在 C# 中,Variant 类型的 ToString 实现现在默认使用 InvariantCulture (GH-89547),这意味着 Vector2(1.2, 3.4) 将使用 . 作为小数点分隔符进行格式化,而与程序运行的操作系统语言无关。
动画
备注
AnimationMixer 已将它的捕获(Capture) 模式替换为新的捕获 (Capture) 功能,该功能比旧版本效果更好,这取代了现有的缓存(GH-86715)。
备注
AnimationNode 重新设计了获取语义时间(semantic time)信息的过程。这确保了时间相关的行为能够按预期工作,但也改变了混合行为。实现 _process 虚方法的开发者还应注意,该方法现已弃用,未来将被新方法取代(GH-87171)。
有关动画更改的更多信息,请参阅`将动画从 Godot 4.0 迁移到 4.3 <https://godotengine.org/article/migrating-animations-from-godot-4-0-to-4-3>`__ 文章。
GUI 节点
备注
默认字体轮廓颜色从白色更改为黑色(GH-54641)。
备注
auto_translate 属性已被弃用,取而代之的是现在位于 Node 中的 auto_translate_mode 属性(GH-87530)。 auto_translate_mode 的默认值为 AUTO_TRANSLATE_INHERIT ,这意味着节点会从其父节点继承 auto_translate_mode 值。因此,如果现有节点的 auto_translate 属性设置为 true ,但其父节点的 auto_translate 属性设置为 false ,那么这些节点可能不再被翻译。
多人游戏
备注
SceneMultiplayer 的缓存协议已更改,在发送节点移除确认数据包时,现在会发送接收到的 ID 而不是节点路径(GH-90027)。
这是对高级多人游戏协议(high-level multiplayer protocol)的破坏性改动,该改动会使其与之前的 Godot 版本不兼容。请将你的服务器和客户端版本都升级到 Godot 4.3 以妥善处理此更改。
请注意,高级多人游戏(high-level multiplayer)功能仅与使用相同 Godot 版本的服务器和客户端兼容。建议实现某种版本检查机制。
渲染
备注
现在,贴花会将调制颜色从 sRGB 颜色转换为线性颜色,与所有其他输入一致,以确保正确的混合效果(GH-89849)。使用贴花调制属性的现有项目会注意到其视觉效果发生了变化。
备注
现已实现反向 Z 深度缓冲技术。这可能会破坏某些着色器的兼容性。请阅读 反向 Z 简介 (又名:很抱歉破坏了你的着色器) 文章,了解更多信息并获取修复常见场景的指导。
TileMap
Android
备注
Android 权限不再自动请求,因为这违反了推荐的最佳实践(GH-87080)。请使用 OS 中的 request_permission 方法和 MainLoop 上的 on_request_permissions_result 信号来请求权限并等待用户响应。