Capability 能力启停、索引与诊断¶
这一页说明能力的 active 状态、反向索引、轻量分组查询和 receiver 诊断报告。
能力启停¶
GFCapability 与节点能力基类都内置 active 状态。建议通过 Utility 修改启停状态:
var capabilities := Gf.get_utility(GFCapabilityUtility) as GFCapabilityUtility
capabilities.set_capability_active(enemy, HitboxCapability, false)
停用 Node 能力时,框架会临时禁用该能力节点树的 process_mode,重新启用时恢复原状态。若停用期间项目层主动把某个子节点的 process_mode 改成其他值,重新启用时会保留这次运行时修改,避免覆盖项目层控制。能力可实现 Hook 响应状态变化:
反向索引与分组查询¶
能力挂载后会进入运行时索引,便于从全局角度查询“哪些对象拥有某个能力”:
var damageables := capabilities.get_receivers_with(DamageableCapability)
var all_health_caps := capabilities.get_capabilities(HealthCapability)
也可以把 receiver 加入轻量分组,并执行分组与能力交集查询:
capabilities.add_receiver_to_group(enemy, &"enemies")
var enemy_targets := capabilities.get_receivers_in_group_with(
&"enemies",
DamageableCapability
)
分组只负责查询索引,不改变 Godot 场景树分组,也不接管 receiver 生命周期。receiver 释放后,查询路径会自动清理失效索引;如果索引中的能力实例已经失效,get_receivers_with() 也会在返回前清理对应记录。tick() 中的周期性清理会按 prune_invalid_receivers_per_tick 分批推进,避免大量 receiver 同时失效时造成单帧尖峰;如果需要立刻得到精确索引,仍可主动调用 prune_invalid_receivers() 做全量清理。
能力诊断¶
复杂实体组合能力时,可以用 inspect_receiver() 获取当前 receiver 的能力、依赖、自动补齐关系和分组信息,便于调试面板、编辑器工具或测试断言使用。
var report := capabilities.inspect_receiver(enemy)
if not report["ok"]:
for item in report["missing_dependencies"]:
push_warning("%s missing %s" % [item["capability"], item["required"]])
var dependency_check := capabilities.validate_receiver_dependencies(enemy)
诊断报告只描述“能力是否完整”和“索引中有什么”,不替代项目自己的实体合法性规则。