Godot 3.5.1:如何让Area2D箭头碰撞后附着在移动飞镖靶上?
解决Godot 3.5.1中箭头附着移动飞镖靶的问题
你当前的代码只是停止了箭头的进程,但箭头还是独立节点,不会跟着飞镖靶移动。要实现附着效果,核心是把箭头变成飞镖靶的子节点——子节点会自动继承父节点的位置变换,跟着一起移动。具体修改步骤如下:
核心修改思路
- 碰撞触发时,将箭头的全局坐标转换为飞镖靶的本地坐标,避免位置偏移
- 把箭头添加为飞镖靶的子节点
- 停止箭头自身的运动逻辑,关闭不必要的碰撞
修改后的代码示例
func _on_Arrow_body_entered(body): if body.is_in_group("dart_board"): # 停止箭头自身的物理更新和进程 set_physics_process(false) set_process(false) # 可选:关闭箭头的碰撞体,防止后续干扰 $CollisionShape2D.set_deferred("disabled", true) # 将箭头的全局位置转换为飞镖靶的本地位置 var local_position = body.get_global_transform().affine_inverse().xform(global_position) position = local_position # 把箭头转为飞镖靶的子节点,实现跟随 if get_parent(): get_parent().remove_child(self) body.add_child(self)
关键细节说明
- 坐标转换:直接添加子节点会使用本地空间坐标,必须把箭头的全局位置转成飞镖靶的本地位置,否则箭头会突然跳到飞镖靶的原点位置。
- 关闭碰撞体:如果箭头的碰撞体还启用,可能会和飞镖靶或其他物体产生二次碰撞,影响体验,所以建议禁用。
- 信号确认:确保你已经把Area2D的
body_entered信号正确连接到箭头脚本的_on_Arrow_body_entered函数,且飞镖靶确实加入了dart_board组。
内容的提问来源于stack exchange,提问作者allen monzon
相关产品推荐
相关产品推荐

