从 Godot 4.4 升级到 Godot 4.5
对于大多数使用 4.4 制作的游戏和应用程序来说,迁移到 4.5 应该相对安全。本页旨在介绍迁移项目时需要注意的所有事项。
破坏性更改
如果你要从 4.4 迁移到 4.5,这里列出的破坏性更改可能会影响到你。更改按照领域/系统分组。
警告
为支持 新的 Google Play 要求,现在在将 C# 项目导出到 Android 平台时,必须以 .NET 9 为目标框架;其他平台仍以 .NET 8 作为最低要求版本,但鼓励使用并支持更新的版本。
如果你在项目中使用了 C# 并希望导出到 Android 平台,则需要将项目升级至 .NET 9(升级方法请参阅 Upgrading to a new .NET version)。
这篇文章指出了每项破坏性改动是否会影响 GDScript,以及 C# 的破坏性改动是 二进制兼容 还是 源代码兼容:
二进制兼容 — 现有可执行文件无需重新编译即可成功加载和执行,且运行时行为不会发生变化。
源代码兼容—— 在升级 Godot 时,源代码可成功编译,无需更改。
核心
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
JSONRPC |
||||
Method |
❌ |
|||
节点 |
||||
方法 |
❌ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
渲染
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
DisplayServer |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
RenderingDevice |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
RenderingServer |
||||
方法 |
❌ |
✔️ |
✔️ |
|
方法 |
❌ |
✔️ |
✔️ |
备注
In C#, the enum RenderingDevice.Features breaks compatibility because of the way the bindings generator
detects the enum prefix. New members were added to the enum in GH-103941 that caused the enum member
Address to be renamed to BufferDeviceAddress.
GLTF
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
GLTFAccessor |
||||
属性 |
✔️ |
❌ |
❌ |
|
属性 |
✔️ |
❌ |
❌ |
|
属性 |
✔️ |
❌ |
❌ |
|
属性 |
✔️ |
❌ |
❌ |
|
属性 |
✔️ |
❌ |
❌ |
|
属性 |
✔️ |
❌ |
❌ |
|
属性 |
✔️ |
❌ |
❌ |
|
GLTFBufferView |
||||
属性 |
✔️ |
❌ |
❌ |
|
属性 |
✔️ |
❌ |
❌ |
|
属性 |
✔️ |
❌ |
❌ |
备注
由于类型元数据的变更,C# 绑定将该类型从 int(32 位)已更改为 long(64 位)。
文本
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
CanvasItem |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
字体 |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
RichTextLabel |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
TextLine |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
TextParagraph |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
TextServer |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
TreeItem |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
TextServerExtension |
||||
方法 |
❌ |
❌ |
❌ |
|
方法 |
❌ |
❌ |
❌ |
|
方法 |
❌ |
❌ |
❌ |
|
方法 |
❌ |
❌ |
❌ |
XR
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
OpenXRAPIExtension |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
方法 |
✔️ |
✔️ |
✔️ |
|
OpenXRBindingModifierEditor |
||||
类型 |
❌ |
❌ |
❌ |
|
OpenXRInteractionProfileEditor |
||||
类型 |
❌ |
❌ |
❌ |
|
OpenXRInteractionProfileEditorBase |
||||
类型 |
❌ |
❌ |
❌ |
备注
类 OpenXRBindingModifierEditor、OpenXRInteractionProfileEditor 和 OpenXRInteractionProfileEditorBase 仅在编辑器中可用。在编辑器外部使用这些类将导致编译错误。
在 C# 中,这意味着这些类型已从 GodotSharp 程序集移至 GodotSharpEditor 程序集。请确保将使用这些类型的代码包裹在 #if TOOLS 块中,以确保它们不会被包含在导出的游戏内。
此更改也已向后移植到 4.4.1 版本。
编辑器插件
更改 |
GDScript 兼容 |
C# 二进制兼容 |
C# 源代码兼容 |
引入 |
|---|---|---|---|---|
EditorExportPlatform |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
EditorUndoRedoManager |
||||
方法 |
✔️ |
✔️ |
✔️ |
|
EditorExportPlatformExtension |
||||
方法 |
✔️ |
❌ |
❌ |
行为更改
在 4.5 版本中,一些功能的行为被更改,您可能需要重新适配您的项目。
图块地图画布层
相较于 4.4 版本,由于 4.5 版本中 TileMapLayer 的物理分区是默认开启的, TileMapLayer.get_coords_for_body_rid() 的返回值将变得不同。 TileMapLayer.physics_quadrant_size 的值越高,函数的精确度越低。若想要像 4.4 及之前版本一样获取准确的单元坐标,需要将 TileMapLayer.physics_quadrant_size 的值设置为 1 ,这同时也将关闭物理分区。
3D 模型导入
3D 模型导入器已进行修复,以正确处理骨骼层级结构中的非关节节点(GH-104184)。为保持兼容性,默认行为是沿用旧版方式导入现有文件(GH-107352)。对于新的 .gltf、.glb、.blend 和 .fbx 文件(无对应的 .import 文件),将使用新行为进行导入。但如果您希望对现有文件启用新行为,则必须在导入面板底部修改“命名版本”(Naming Version)选项:
核心
备注
Resource.duplicate(true) (执行深度复制)现在仅复制它被调用资源文件内部的资源。在 4.4 版本中,它相反复制了所有内容,包括外部资源。如果你正在深度复制一个包含对其他外部资源引用的资源,这些外部资源现在不再被复制。你必须调用 Resource.duplicate_deep(DEEP_DUPLICATE_ALL) 来保持旧的行为。
备注
现在 ProjectSettings.add_property_info() ,当字典参数缺少键或键无效时,它会发出警告。最重要的是,它现在会在传递 usage 键时发出警告,因为这个键没有被使用。在 4.5 之前也是这种情况,但它被默默忽略了。作为提醒,要正确设置属性使用信息,必须使用 ProjectSettings.set_as_basic() , ProjectSettings.set_restart_if_changed() ,或者 ProjectSettings.set_as_internal() 。
备注
在 C# 中,StringExtensions.PathJoin 现在会在原始字符串为空,或追加的路径以路径分隔符开头时,避免添加多余的路径分隔符(GH-105281)。
备注
在 C# 中,当原始字符串不包含扩展名时,StringExtensions.GetExtension 现在将返回空字符串,而不是返回原始字符串(GH-108041)。
备注
在 C# 中,Quaternion(Vector3, Vector3) 构造函数现在能正确创建表示两个输入向量之间最短弧的四元数。此前,对于某些输入值,该构造函数会返回错误的结果(GH-107618)。
物理
备注
当 3D 物理引擎设置为 Jolt Physics 时,现在默认情况下将始终报告 Area3D 与静态物体之间的重叠,因为项目设置项 physics/jolt_physics_3d/simulation/areas_detect_static_bodies 已被移除(GH-105746)。如果您仍希望忽略此类重叠,则需要改为调整 Area3D 或静态物体的碰撞掩码(collision mask)或碰撞层(collision layer)。
文本
备注
在 GDScript 中,对函数 RichTextLabel::add_image 和 RichTextLabel::update_image 的调用将继续有效,但 size_in_percent 参数现在将被用作 width_in_percent 的值,而 height_in_percent 将默认为 false``(`GH-107347`_)。若要恢复之前的行为,您可以显式地将 ``height_in_percent 设置为您之前传递给 size_in_percent 的相同值。