如何为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
相关产品推荐
相关产品推荐

