Repository navigation
4.4.0
版本概述:加强扩展发现、模块释放、资源解析、内容包声明、存储路径查询、力场采样组合和诊断上下文,修复若干 loose Variant、日志删除和 dispose 清理边界问题。
🚀 新增特性 (Added)
GFExtensionSettings新增gf/extensions/external_roots项目设置,以及get_external_extension_roots()/set_external_extension_roots(),用于发现res://下 GF 仓库外的独立扩展 manifest。GFModel、GFSystem与GFUtility新增release_dependencies()生命周期钩子;GFArchitecture和GFBinding会在 dispose 后调用它,供模块释放缓存的外部依赖引用。- 新增
GFResourceResolverUtility,用于把稳定资源键解析为资源路径或已加载Resource,支持显式注册路径、provider 覆盖链、直接路径回退、诊断报告和GFAssetUtility异步加载衔接。 - 新增
gf.content_package内置扩展,以及GFContentPackageManifest、GFContentPackageCatalog与GFContentPackageUtility,用于声明内容包 manifest、诊断依赖图并把资源键同步到GFResourceResolverUtility。 - 新增
GFSchemaField与GFDictionarySchema,用于通用 Dictionary 字段声明、默认值补齐、宽松类型转换、嵌套结构校验和GFValidationReport诊断输出。 - 新增
GFPathTools与GFDependencyGraphTools,用于复用纯字符串路径规范化、路径集合去重和字符串 ID 依赖图诊断,避免扩展、内容包和资源工具分叉实现同一机制。 GFValidationReportDictionary新增merge_report(),用于合并多个字典报告的问题并显式复制调用方指定的统计字段。GFCapabilityRecipe新增validate_recipe_report(),用于在工具链中直接获取GFValidationReport形式的 Recipe 结构诊断。GFStorageUtility新增get_storage_directory_path(),可无副作用解析存储目录路径。GFConfigTableImporter新增validate_json_record(),用于按GFConfigTableSchema校验 JSON object 形式的单条配置、manifest 或内容元数据。GFResourceRegistryTools新增build_dependency_report(),用于生成资源依赖闭包的结构化诊断报告,包含缺失、过滤、循环和上限命中信息。- 新增
GFVirtualListModel,用于大量可变尺寸列表的可见范围、累计偏移、overscan 和滚动锚点修正计算。 - 新增
GFPolynomialMath,用于高阶到低阶多项式系数的采样、导数、根生成和实根求解。 GFTouchJoystick.PositionMode新增FOLLOW,用于触点超出摇杆半径时让摇杆中心跟随触点。GFGravityProbe3D新增CombinationMode,支持求和、最强力场和最高优先级力场组合;GFGravityField3D新增priority与get_gravity_priority()供优先级采样使用。GFVariantData新增diff_variant(),用于生成纯 Variant 数据的结构化差异报告。
🔄 机制更改 (Changed)
GFConfigValidationReport的稳定 issue context 字段新增value、expected_value、actual_value、supported_values、supported_formats和supported_content_types,便于编辑器工具给出可操作诊断。GFContentPackageManifest、GFContentPackageCatalog与GFContentPackageUtility的诊断报告改用GFValidationReportDictionary通用形态,避免内容包依赖配置表专用报告语义。GFExtensionSettings的外部扩展根目录和GFExtensionUsageAudit的扫描/忽略根目录复用GFPathTools,与扩展 catalog 保持一致的路径集合规范化语义。GFExtensionManifest读取时会裁剪标量文本字段,规范化依赖 ID、标签和扩展脚本路径列表,减少调用方重复清洗,同时保留空路径声明供校验报告。GFExtensionSettings与扩展导出过滤插件现在会在 manifest 图无效时阻断启用扩展 manifest 查询、installer/editor 路径收集、启用扩展脚本加载和导出扩展过滤,并把问题提前报告到扩展加载或导出阶段。GFExtensionSettings.get_extension_resource_path()与load_enabled_extension_script()现在只允许解析扩展根目录内资源,不再把user://、其他扩展目录或越界路径作为扩展资源返回。GFResourceResolverUtility的直接路径 fallback 现在默认关闭;需要把res://、uid://或user://直接作为资源键时,必须显式传入{ "allow_direct_path": true }。GFContentPackageManifest的资源路径边界收紧为包内相对路径或包根内res://路径;uid://不再作为内容包 manifest 资源路径接受,避免 UID 指向包外资源时绕过 root 隔离。tools/gf_maintenance.py release-status现在默认拒绝脏工作区,并会扫描addons/gf中高于当前发布版本的@since标注,避免把未发布 API 打进旧版本包。GFDirectoryWatchUtility的监听路径、排除路径和排除子目录匹配复用GFPathTools,并与资源注册表、音频扫描和内容包保持一致的纯字符串路径集合规范化语义。GFConfigTableSchema与内置配置校验规则会在类型、集合、范围、资源路径和文本 key 错误中尽量写入实际值、期望值和支持集合/格式。GFConfigRegexValidationRule现在会缓存当前pattern的编译结果,并在pattern改变时重新编译,减少大表批量校验时的重复正则编译成本。GFCapabilityRecipe.validate_recipe()现在会为 entry/group 问题输出稳定 path,并报告空分组、重复分组和重复条目 warning。GFStorageUtility.dispose()现在会清理异步队列、文件锁、迁移注册表、最近读取结果,并释放内部 helper 回链。GFTouchJoystick.direction_changed与get_direction()现在返回已应用死区并保留模拟强度的摇杆向量;死区外会把剩余行程重映射到 0..1,而不是直接归一化。
🐛 Bug 修复 (Fixed)
GFDependencyGraphTools现在会对PackedStringArray形式的依赖列表执行和Array一致的空值过滤、空白裁剪和去重,避免等价依赖 ID 被误判为缺失依赖。GFCapabilityUtility现在会校验外部实例、provider 返回实例和场景根节点脚本是否继承声明能力类型,避免错误as_type或 Recipe 声明污染能力索引。GFGravityProbe3D的同帧采样缓存现在会把use_fallback_when_empty与fallback_acceleration纳入缓存键,避免同帧修改 fallback 配置后读到旧结果。GFContentPackageUtility.rebuild_catalog()现在会把坏 manifest 文件追加到最终报告后重新计算ok、error_count和issue_count,避免无效内容包 manifest 被报告为成功。GFDictionarySchema.configure()现在会在字段列表为空时仍正确应用allow_extra_fields、coerce_values、fail_on_coerce_error和metadataoptions。GFBindableProperty.set_value()现在会安全处理不兼容 Variant 类型比较,避免 Object/String、Object/null、Dictionary/String 等 loose 输入触发 Godot 运行时比较错误。GFLogUtility删除日志文件时会把user:///res://路径转成本地路径,并静默跳过已不存在的文件。
🔌 API 变动说明 (API Changes)
- 新增公开设置
gf/extensions/external_roots。 - 新增公开类
GFPathTools、GFDependencyGraphTools、GFResourceResolverUtility、GFContentPackageManifest、GFContentPackageCatalog、GFContentPackageUtility、GFSchemaField、GFDictionarySchema、GFVirtualListModel与GFPolynomialMath。 - 新增公开方法
GFPathTools.normalize_root_paths()、GFExtensionSettings.get_external_extension_roots()、GFExtensionSettings.set_external_extension_roots()、GFValidationReportDictionary.merge_report()、GFStorageUtility.get_storage_directory_path()、GFConfigTableImporter.validate_json_record()、GFCapabilityRecipe.validate_recipe_report()、GFResourceRegistryTools.build_dependency_report()、GFVariantData.diff_variant()、GFModel.release_dependencies()、GFSystem.release_dependencies()与GFUtility.release_dependencies()。 GFExtensionSettings.get_extension_resource_path()与load_enabled_extension_script()的路径边界收紧为扩展 root 内资源。GFResourceResolverUtility.resolve()、resolve_path()、load()、load_async()和make_asset_group_entries()的options.allow_direct_path默认值从 true 调整为 false。GFTouchJoystick.PositionMode新增枚举值FOLLOW;GFTouchJoystick的方向输出语义从归一化向量调整为保留模拟强度的向量。GFGravityField3D新增公开属性priority和公开方法get_gravity_priority();GFGravityProbe3D新增公开枚举CombinationMode与公开属性combination_mode。
📘 升级指南 (Migration Guide)
- 依赖
GFTouchJoystick.direction_changed出死区后固定单位方向的项目,应在消费端对非零向量调用normalized();需要模拟强度时可直接使用新向量长度或 InputMap action strength。 - 如果项目曾用
GFExtensionSettings.get_extension_resource_path()或load_enabled_extension_script()加载扩展 root 外脚本,应改为项目侧显式ResourceLoader.load()/load(),或把脚本放回对应扩展目录;扩展资源 API 不再承载任意脚本加载。 - 如果项目曾把
res://、uid://或user://路径直接传给GFResourceResolverUtility当作资源键,应改为注册稳定资源键;仅工具链或迁移脚本确实需要路径直通时,传入{ "allow_direct_path": true }。 - 如果内容包 manifest 曾用
uid://声明资源路径,应改为包内相对路径或包根内res://路径;需要 UID 直通的项目应在项目侧资源解析流程显式处理,不把它写入 GF Content Package manifest。 - 如果项目曾用
add_capability_instance()、add_scene_capability()、provider 或 Recipe 把实例注册为不在其脚本继承链上的声明类型,应改为让实例脚本继承该能力基类,或按实例真实能力类型注册。
📁 核心受影响文件 (Affected Files)
addons/gf/kernel/extension/gf_extension_catalog.gdaddons/gf/kernel/extension/gf_extension_settings.gdaddons/gf/kernel/base/gf_model.gdaddons/gf/kernel/base/gf_system.gdaddons/gf/kernel/base/gf_utility.gdaddons/gf/kernel/core/gf_architecture.gdaddons/gf/kernel/core/gf_binding.gdaddons/gf/kernel/core/gf_bindable_property.gdaddons/gf/kernel/core/gf_path_tools.gdaddons/gf/kernel/core/gf_dependency_graph_tools.gdaddons/gf/standard/utilities/assets/gf_resource_resolver_utility.gdaddons/gf/standard/utilities/assets/gf_resource_registry_tools.gdaddons/gf/standard/utilities/audio/gf_audio_bank_tools.gdaddons/gf/standard/utilities/io/gf_directory_watch_utility.gdaddons/gf/standard/utilities/ui/gf_virtual_list_model.gdaddons/gf/standard/foundation/math/gf_polynomial_math.gdaddons/gf/standard/foundation/validation/gf_validation_report_dictionary.gdaddons/gf/standard/foundation/variant/gf_variant_data.gdaddons/gf/standard/input/touch/gf_touch_joystick.gdaddons/gf/extensions/physics/nodes/gf_gravity_field_3d.gdaddons/gf/extensions/physics/nodes/gf_gravity_probe_3d.gdaddons/gf/standard/utilities/storage/gf_storage_utility.gdaddons/gf/standard/utilities/logging/gf_log_utility.gdaddons/gf/standard/utilities/config/gf_config_validation_report.gdaddons/gf/standard/utilities/config/gf_config_table_importer.gdaddons/gf/standard/utilities/config/gf_config_table_schema.gdaddons/gf/standard/utilities/config/validation/*.gdaddons/gf/standard/foundation/schema/gf_schema_field.gdaddons/gf/standard/foundation/schema/gf_dictionary_schema.gdaddons/gf/extensions/capability/recipes/gf_capability_recipe.gdaddons/gf/extensions/content_package/gf_extension.jsonaddons/gf/extensions/content_package/extension.gdaddons/gf/extensions/content_package/resources/gf_content_package_manifest.gdaddons/gf/extensions/content_package/runtime/gf_content_package_catalog.gdaddons/gf/extensions/content_package/runtime/gf_content_package_utility.gd