0%

2024-09-10
预发布

距离 4.3 版本发布还不到一个月,但我们在 PR 积压中有很多好东西排队,以至于对于贡献者和测试人员来说,这是一个提前的圣诞节(或其他礼物繁多的节日季)

我们合并了 200 多个 PR 来制作第一个开发快照,仅仅两周后,我们又推出了另一批 350+ 改进,供你测试和提供反馈!

此版本中的许多更改都是错误修复,这些错误修复将向后移植到 Godot 4.3 并在 4.3.1 中发布!所以拜托了,请仔细测试此版本,以便我们对这些更改充满信心,并尽快发布包含这些更改的 4.3.1 版本

请记住,虽然我们试图确保每个开发快照都足够稳定以进行一般测试,但这是预发布软件。请务必频繁进行备份,或使用版本控制系统,例如 Git,用于在损坏或数据丢失的情况下保留你的项目

跳转到 下载 部分,立即试一试,或继续阅读以了解有关此版本中改进的更多信息。你还可以尝试此版本的 Web 编辑器或 Android 编辑器。如果你对后者感兴趣,请加入我们的测试组以访问预发布版本

封面插图来自 Megaloot,这是一款令人上瘾的库存管理 roguelike,由 axilirate 在 Godot 4.3 中开发并由 Ravenage Games 发行。它最近在 Steam 上发布并取得了巨大成功。你可以在 Twitter 上关注进展

亮点

如果你错过了它,请查看 4.4 dev 1 发行说明,了解该快照中已有的一些关键功能的概述,因此仍可在 dev 2 中进行测试

这个新的快照增加了更多功能,这些功能在 Godot 4.3 的稳定阶段已经排队,因此在 4.4 开发周期的早期就准备好合并了

正在推出…

键入词典!

Godot 4.0 引入了对类型化数组的支持,但缺乏对类型化字典的支持。这迅速成为最需要添加到引擎中的功能之一,多亏了 Thaddeus Crews,它现在已经在 Godot 4.4 中实现!当与 Godot 的 Dictionary 类型交互时,此功能会影响核心引擎 GDScript 和所有其他脚本语言。你现在可以从脚本中导出键入的词典,并从大大改进的 Inspector UX 中受益,以分配正确的键和值

GDScript
1
2
3
@export var typed_key_value: Dictionary[int, String] = { 1: "first value", 2: "second value", 3: "etc" }
@export var typed_key: Dictionary[int, Variant] = { 0: "any value", 10: 3.14, 100: null }
@export var typed_value: Dictionary[Variant, int] = { "any value": 0, 123: 456, null: -1 }

图片
作为一项相关的改进,RuneGH-70096) 还优化了对 StringName 字典键的支持

无差错的首次项目导入

对于使用版本控制系统的 Godot 用户来说,从他们的存储库中排除该文件夹是很常见的,因为它包含的文件可以在你第一次编辑项目时由 Godot 重新创建 .godot

该系统的一个缺点是,第一次启动没有文件夹的编辑器通常非常嘈杂,有数百个关于缺少资源的信息,并且由于未知、插件尚未注册或未知 GDExtension 类,各种脚本无法编译 .godotclass_name

Hilderin 英勇地克服了这个充满依赖关系和多线程陷阱的迷宫,并为我们带来了期待已久的圣杯:无错误地首次导入项目,无需重新启动编辑器即可工作!使用 GH-92303(用于 GDScript,包含在 4.3 中)和现在的 GH-93972(用于 GDExtensions)和 GH-92667(用于插件)需要付出很多努力 class_name

此外,凭借这些新发现的深度知识,Hilderin 还进一步改进了第一个项目导入体验,使 FileSystem 停靠在扫描资源时响应速度更快 (GH-93064EditorFileSystem

编辑器窗口状态现在是持久的

Samuele PanzeriGH-76085 中实施了另一项期待已久的生活质量改进,增加了对跟踪编辑器窗口状态(全屏/窗口模式、屏幕、大小、位置)的支持,以便在会话中恢复它。对于使用大显示器或多显示器设置的用户来说,如果用户希望在第一个屏幕上使用与全屏不同的默认行为,那么这应该特别受欢迎

视觉着色器的改进

Yuri Rubinsky 为视觉着色器编辑器实现了一些流行的生活质量改进:

新的材质预览侧边固定装置 (GH-94215):
图片
拖放网格以在视觉着色器中创建MeshEmitter(GH-93017):
图片

XR 设备的初始 Android 编辑器支持

由于 Godot 的独特功能,即使用引擎本身制作编辑器,我们能够将 Godot 编辑器带到非常规的地方,例如 WebAndroid 设备。在后者的基础上,Fredia Huya-Kouadio 完成了 Bastiaan Olij 多年前开始的概念验证,以添加对使用 OpenXR 在 XR 上下文中使用 Android 编辑器的支持 (GH-96624)!你可以通过旁加载 APK 来测试当前版本,目前在 Meta Quest 3 或 Quest Pro 上受支持

还有更多!

有太多令人兴奋的变化,无法在这里一一列举,但这里有一个精选的选择:

2D:在每个 TileSet 遮挡层中实现多个遮挡多边形 (GH-93029)
2D:启用此选项可在首次加载 Sprite 表时“猜测”Sprite 表的行数和列数 (GH-95475) SpriteFramesEditor
3D:添加选项以从动画骨架姿势烘焙网格 (GH-85018)
3D:添加 3D 导航控件的完全自定义 (GH-85331)
3D:修复调试碰撞形状在编辑器中可见的问题 (GH-86699) CSGShape3D
3D:添加了隐藏编辑器变换 Gizmo 的功能 (GH-87793)
动画:当关键帧属性发生变化时,实时更新 AnimationPlayer (GH-91599)
动画:优化 AnimationMixer 混合过程 (GH-92838)
动画:选择多个节点时允许设置关键帧属性 (GH-92842)
动画:允许在动画播放器中跳转到上一个/下一个关键帧 (GH-96013)
动画:在动画贝塞尔曲线编辑器中使用抗锯齿线条绘制 (GH-96559)
音频:ResourceImporterWAV:默认启用 QOA 压缩 (GH-95815)
音频:修复使用音频样本而不是流时的泄漏 (GH-96572)
Buildsystem:添加了对使用 VS clang-cl 工具集进行编译的支持 (GH-92316)
核心:能够将本机引擎类型转换为 JSON 并返回 (GH-92656)
核心:和 (GH-94169) 的批量修复 WorkerThreadPoolResourceLoader
核心:WorkerThreadPool:修复可能导致死锁的 end of-yield 逻辑 (GH-96225)
核心:ResourceLoader:添加线程感知资源更改机制 (GH-96593)
编辑器:重新启动时记住编辑器窗口模式、屏幕、大小和位置 (GH-76085)
编辑器:修复使用外部编辑器覆盖脚本的问题 (GH-96007)
编辑器:在脱机模式下禁用导出模板下载 (GH-96331)
编辑器:FileSystem:添加选项以在 Dock 中显示一些不受支持的文件 (GH-96603)
导出:允许使用脚本/GDExtension 添加自定义导出平台 (GH-90782)
导出:Android 编辑器:添加了对导出平台二进制文件的支持 (GH-93526)
导出:macOS:使用每个架构的最低操作系统版本进行导出 (GH-95885)
导出:从 Windows 导出.app重新启用 macOS,添加有关 Unix 权限的警告 (GH-96669)
GDExtension:允许 ClassDB 创建对象,而无需为 GDExtension 进行后初始化 (GH-91018)
GDExtension:实施概念 (GH-91166) GDExtensionLoader
GDExtension:修复了添加 GDExtensions 后编辑器需要重启的问题 (GH-93972)
GDScript:StringName 字典键 (GH-70096)
GDScript:实现类型化词典 (GH-78656)
GDScript:自动完成:改进索引的自动完成 (GH-79378)
GDScript:允许实时重新加载内置脚本 (GH-94012)
GDScript:自动完成:在分配时重新引入枚举选项 (GH-96326)
GUI:在 TextEdit 中实现适合内容宽度 (GH-83070)
GUI:改进 SpinBox 交互、拆分箭头、添加主题属性 (GH-89265)
GUI:TextServer:通过删除冗余查找(GH-92575、GH-92581),性能提高了 2 倍
GUI:CodeEdit:将渲染时间缩短了 2 倍 (GH-92865)
GUI:提高性能 (GH-94748) Tree
GUI:独立修复矩形倾斜 (GH-96285) StyleBoxFlat
导入:将 GLTF extras 导入和导出 (GH-86183) node->meta
导入:修复了加载大型项目时 FileSystem 停靠不显示任何文件夹的问题 (GH-93064)
导入:修复了窗口未聚焦时导入缓慢的问题 (GH-93953)
导入:将 3D 骨架预览添加到高级导入器 (GH-96094)
导入:添加“使用节点类型后缀”3D 场景导入选项 (GH-96745)
导航:通过使用堆存储可遍历多边形来提高寻路性能 (GH-85965)
导航:提高启用跳转时的性能 (GH-93319) AStarGrid2D
网络:mbedTLS:修复不正确的证书固定 (GH-96172) client_unsafe
网络:修复了网络分析器中除以零的问题 (GH-96464)
粒子:为粒子发射环形状添加锥体角度控制 (GH-91973)
插件:修复插件需要重新启动编辑器才能正常运行 (GH-92667)
移植:Windows:遵循 Windows 设置中的集成 GPU 首选项 (GH-93985)
插件:在编辑器右键单击上下文菜单中添加了对自定义项的支持 (GH-94582)
移植:Windows:始终使用绝对 UNC 路径和长路径感知 API,将“长路径感知”标志添加到应用程序清单 (GH-91902)
移植:向 (GH-94434) 添加了对非阻塞 IO 模式的支持 OS.execute_with_pipe
移植:Android 编辑器:添加了对以 PiP 模式启动“播放”窗口的支持 (GH-95700)
移植:Android:修复以使其实际工作 (GH-96182) JavaClassWrapper
渲染:调整 TAA 去遮挡比例,以避免在运动过程中拒绝所有样本 (GH-86809)
渲染:透射率效果的各种修复 (GH-93448)
渲染:避免在场景剔除阶段为没有基的实例编制索引 (GH-95503)
渲染:光照贴图 GI:为定向光照贴图打包 L1 SH 系数 (GH-96114)
渲染:金属:在兼容模式下为 betsy 和光照贴图模块启用 (GH-96351)
渲染:修复了使用 OpenGL+Angle 的旧版 AMD GPU 无法渲染 GPU 文章的问题 (GH-96413)
渲染:兼容性:为所有非 Web 平台启用 MSAA 支持 (GH-96455)
着色器:允许拖放网格在视觉着色器中创建MeshEmitter(GH-93017)
着色器:添加了对在着色器语言中评估运算符值的基本支持 (GH-93822)
着色器:向视觉着色器编辑器添加材质预览 (GH-94215)。
着色器:为着色器编辑器文件列表添加上下文菜单 (GH-95738)
第三方:mbedTLS:更新到 3.6.1,修复回归 (GH-96385)
第三方:thorvg:更新到 0.14.9,修复了回归问题 (GH-96658)
XR:Android 编辑器:改进了对 XR 项目的支持 (GH-96624)

更改日志

139 位贡献者为此新快照提交了 376 项改进。请参阅我们的交互式更改日志,了解自上一个 4.4-dev1 快照以来的完整更改列表

此版本基于提交 97ef3c837 构建

下载

下载 Godot 4.4 dev2

图片

平台 标准 .NET
Linux 标准 .NET
macOS 标准 .NET
Windows 标准 .NET

导出模板和其他下载
捐款

标准版本包括对 GDScript 和 GDExtension 的支持
.NET 版本(标记为)包括对 C# 以及 GDScript 和 GDExtension 的支持 mono

虽然引擎维护人员会尽最大努力确保每个预览快照和候选版本都是稳定的,但根据定义,这只是一个预发布软件。请务必经常进行备份,或使用 Git 等版本控制系统,以在损坏或数据丢失的情况下保留你的项目

已知问题

类型化词典:使用运算符时,错误地允许使用不同类型的键/值 (GH-96772)。下一个开发快照的修复程序已经在管道中 []
Windows:由于 Windows 上最近的 FileAccess 更改暴露了工具链错误,因此在此快照中无法检测新添加的资源 (GH-96828)、导出变量 (GH-96810) 和项目的上次修改日期 (GH-96812)。GH-74830 已修复此问题
我们接受每个版本都会有各种问题,这些问题已经报告但尚未修复。有关已知错误的完整列表,请参阅 GitHub issue

原文: Dev snapshot: Godot 4.4 dev 2 - Godot Engine
由机器翻译并人工校对

Godot: 4.4-dev2

申请所有打包时已选择的权限

1
OS.request_permissions()
1
OS.RequestPermissions();

注意: C# 代码可用性未经证实

返回值: 是否请求成功:bool

单独申请权限(打包时已选择的)

1
2
3
4
5
OS.request_permission(安卓标准权限名)

# 示例
OS.request_permission('android.permission.RECORD_AUDIO')
# 申请录音权限
1
2
3
4
5
OS.RequestPermission(安卓标准权限名);

// 示例
OS.RequestPermission("android.permission.RECORD_AUDIO");
// 申请录音权限

注意: C# 代码可用性未经证实

返回值: 是否请求成功:bool
目前,这个函数只被 AudioDriverOpenSL 用来请求 Android 上 RECORD_AUDIO 的权限

参考

所有类 - OS - 《Godot 游戏引擎 v4.2 中文文档》 - 书栈网 · BookStack

Godot 4.4-dev2

导出的APK最好不要包含的字符

1
/\:?*|"'<>$

文件名出现上述字符可能会出现签名失败(Unable to sign apk)等问题

权限申请

打包后的APK的敏感权限不会自动申请权限(已在导出中添加),需要自己动态申请
参见 Godot4 APK动态申请权限 | TheChuan1503’ Blog

文件打包

无法被 Godot 识别的文件不会被打包进 APK
例如 txt 等文件

注意: 需要安装 keytool

1
keytool -keyalg RSA -genkeypair -alias androiddebugkey -keypass android -keystore debug.keystore -storepass android -dname "CN=Android Debug,O=Android,C=US" -validity 9999 -deststoretype pkcs12

Godot 4.3

1
2
3
4
5
6
7
8
func getTileMap(inputNode:Node):
var node = inputNode
while node:
if node is TileMapLayer: # 或TileMap
return node
node = node.get_parent()

getTileMap(self) # 或其他处于TileMap中的节点
1
2
3
4
5
6
7
8
9
10
11
12
public TileMapLayer GetTileMap(Node InputNode) {
Node node = InputNode;
while (node != null) {
if (node is TileMapLayer) {
return (TileMapLayer) node;
}
node = node.GetParent();
}
return null;
}

GetTileMap(this);

注意: C# 代码可用性未经证实

Godot 4.3

随机浮点数

randf() 会随机生成 0 ~ 1 之间的随机浮点数

1
randf()
1
GD.Randf()

随机整数

randi() 会随机生成 0 ~ 2147483647 之间的随机整数

1
randi()
1
GD.Randi()

范围随机浮点数

1
2
3
4
5
randf() * (max - min) + min

# 示例
randf() * (10 - 5) + 5
# 返回5~10(包括5和10)之间的随机浮点数
1
2
3
4
5
GD.Randf() * (max - min) + min

// 示例
GD.Randf() * (10 - 5) + 5
// 返回5~10(包括5和10)之间的随机浮点数

范围随机整数

1
2
3
4
5
randi() % (max - min + 1) + min

# 示例
randi() % (10 - 5 + 1) + 5
# 返回5~10(包括5和10)之间的随机整数
1
2
3
4
5
GD.Randi() % (max - min + 1) + min

// 示例
GD.Randi() % (10 - 5 + 1) + 5
// 返回5~10(包括5和10)之间的随机整数

设置种子

1
2
3
4
5
6
# 随机种子
randomize()
# 数字种子
seed(1234)
# 字符串种子
seed("Seed string".hash())
1
2
3
4
5
6
// 随机种子
GD.Randomize()
// 数字种子
GD.Seed(1234)
// 字符串种子
GD.Seed("Seed string".Hash())

参考

数学 - 随机数生成 - 《Godot 游戏引擎 v4.2 中文文档》 - 书栈网 · BookStack

相关链接

Godot4 取随机值(随机数组内容) | TheChuan1503’s Blog

Godot4.3

文件是否存在

GDScript
1
2
3
4
5
6
7
8
FileAccess.file_exists(文件路径)
DirAccess.open(父文件夹路径).file_exists(目标文件名)

# 示例
FileAccess.file_exists('/storage/emulated/0/SMM_GE/levels/1.txt')
FileAccess.file_exists('res://test.json')

DirAccess.open('/storage/emulated/0/SMM_GE/levels/').file_exists('1.txt')

文件夹是否存在

GDScript
1
2
3
4
DirAccess.open(父文件夹路径).dir_exists(目标文件夹名)

# 示例
DirAccess.open('/storage/emulated/0/SMM_GE/').dir_exists('levels')

列出文件夹下所有文件

注意: 只会列出文件,不会列出文件夹

GDScript
1
2
3
4
DirAccess.open(文件夹路径).get_files() # 返回文件名(非完整路径)数组

# 示例
DirAccess.open('/storage/emulated/0/SMM_GE/levels/').get_files() # 返回['a.sge','b.sge']

删除文件(夹)

GDScript
1
2
3
4
5
DirAccess.open(父文件夹路径).remove(目标文件(夹)名)

# 示例
DirAccess.open('/storage/emulated/0/SMM_GE/levels/').remove('1.txt')
DirAccess.open('/storage/emulated/0/SMM_GE/').remove('levels')

写入文件

GDScript
1
2
3
4
FileAccess.open(文件路径,FileAccess.WRITE).store_string(待写入字符串)

# 示例
FileAccess.open('/storage/emulated/0/test.txt',FileAccess.WRITE).store_string('hello world')

参考

相关

Godot 4.3

GDScript
1
2
3
4
$Label["label_settings"]["font_color"] = 颜色:Color

# 示例
$Label["label_settings"]["font_color"] = Color('fecc00')

扩展

通过 节点[属性1][子属性][...] 来访问节点某个属性的子属性

参考

  • 没有

Godot 4.3

注意

不完全符合 JSON 规范:

  • 数组或对象中的尾随逗号将被忽略,而不是引起解析器错误。
  • 换行符和制表符在字符串文字中被接受,并被视为它们相应的转义序列 \n 和 \t。
  • 使用 String.to_float 解析数字,这通常比 JSON 规范更宽松。
  • 某些错误,例如无效的 Unicode 序列,不会导致解析器错误。相反,该字符串会被清理并将错误记录到控制台。

创建JSON实例

GDScript
1
var json = JSON.new()

从字符串解析

GDScript
1
2
3
4
json.parse(JSON字符串)

# 示例
json.parse('{"a":"hello hexo","b":"TheChuan1503"}')

读取JSON内容

GDScript
1
2
3
4
5
6
var dic = json.data
# 如果json是键值对则dic类型为Dictionary,数组则返回Array,其余同理

# 读取Dictionary示例
dic['a'] # 返回hello hexo
dic['b'] # 返回TheChuan1503

Dictionary判断是否存在某个键

GDScript
1
2
3
4
5
dic.has(键名)

# 示例
dic.has('a') # 返回true
dic.has('c') # 返回false

JSON序列化为字符串

GDScript
1
2
3
4
JSON.stringify(Variant)

# 示例
JSON.stringify(json.data) # 返回序列化后的字符串

注意:

JSON 规范没有定义整数和浮点数类型,只有一个数字类型。
因此,将 Variant 转换为 JSON 文本会将所有数字值转换为 float 类型。

参考