You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用set_deferred()修改CollisionPolygon2D的形状?

解决Godot中修改CollisionPolygon2D形状时的物理查询错误

你遇到的错误是因为物理引擎处于查询处理阶段(flushing queries)时,直接修改碰撞形状会干扰物理状态,因此Godot要求使用延迟方法完成修改。

正确使用set_deferred()修改CollisionPolygon2D形状的步骤如下:

  1. 复制当前多边形数组:polygon是Vector2类型的数组,直接修改数组元素无法触发属性变更的延迟处理,必须先复制出独立的数组副本。
  2. 修改副本数组:在复制后的数组上调整目标顶点的坐标。
  3. 通过set_deferred()设置新多边形:将修改后的数组以延迟方式赋值给polygon属性,让操作在物理处理完成后的安全时机执行。

示例代码:

# 复制当前多边形数组,生成独立副本
var updated_polygon = self.polygon.duplicate()
# 修改第一个顶点的x坐标
updated_polygon[0].x += 100
# 延迟设置polygon属性,规避物理阶段冲突
self.set_deferred("polygon", updated_polygon)

你也可以用call_deferred()调用自定义方法完成修改,逻辑会更清晰:

# 在需要修改的位置调用延迟方法
self.call_deferred("_adjust_collision_polygon")

func _adjust_collision_polygon():
    var updated_polygon = self.polygon.duplicate()
    updated_polygon[0].x += 100
    self.polygon = updated_polygon

两种方式的核心都是将修改操作推迟到物理帧处理完成后,以此避免触发area_set_shape_disabled错误。

内容的提问来源于stack exchange,提问作者cak3_lover

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:01:02