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

如何为AnimatedSprite的每一帧绑定单独的CollisionPolygon2D?

为AnimatedSprite每帧绑定唯一CollisionPolygon2D的实现方法

以下两种方案在Godot 3.x和4.x版本均适用:

方案1:AnimationPlayer可视化配置(适合帧数量少、动画逻辑简单的场景)

  • 给AnimatedSprite节点添加多个CollisionPolygon2D子节点,每个碰撞节点对应一帧或多帧相同碰撞形状的动画帧,分别绘制好对应帧的碰撞形状,初始全部设置为不可见
  • 打开AnimationPlayer面板,选中需要配置的动画,在时间轴上对应每一帧切换的时间点,插入对应CollisionPolygon2D的visible属性关键帧:需要生效的碰撞设为true,其余碰撞设为false即可

方案2:脚本动态切换(适合帧数量多、需要灵活控制的场景)

提前把所有帧对应的碰撞形状顶点数据按帧序号存储,监听动画帧切换信号实时更新碰撞形状即可,Godot 4.x示例代码如下:

extends Node2D
@onready var anim_sprite = $AnimatedSprite2D
@onready var collision_poly = $CollisionPolygon2D
# 按动画帧顺序存储对应帧的碰撞顶点数组,索引对应帧序号
var frame_collisions = [
    PackedVector2Array([Vector2(-10, -20), Vector2(10, -20), Vector2(10, 20), Vector2(-10, 20)]),
    PackedVector2Array([Vector2(-15, -15), Vector2(15, -15), Vector2(15, 15), Vector2(-15, 15)]),
    # 按实际帧数量补充对应碰撞数据
]

func _ready():
    # 绑定帧切换信号
    anim_sprite.frame_changed.connect(_on_animation_frame_change)
    # 初始化第一帧碰撞
    _on_animation_frame_change()

func _on_animation_frame_change():
    var current_frame = anim_sprite.frame
    if current_frame < frame_collisions.size():
        collision_poly.polygon = frame_collisions[current_frame]

注意事项

  • 如果存在多个动画、不同动画的碰撞规则不同,可以把frame_collisions改为字典结构,key为动画名称,value为对应动画的帧碰撞数组,切换动画时同步切换读取的数组即可
  • 3D场景下逻辑完全一致,仅需将节点替换为AnimatedSprite3D和CollisionPolygon3D即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:06:03