如何在Godot中使用C#检测AnimatedSprite2D的鼠标点击?
解决Godot中仅点击AnimatedSprite2D时停止动画的问题
你的代码目前只判断了鼠标左键释放事件,但没有检查点击位置是否落在AnimatedSprite2D的范围内,所以不管点击屏幕哪里都会触发动画停止。下面提供两种可行的解决方案:
方案一:直接在_Input中判断点击位置
修改你的_Input函数,添加点击位置的检测逻辑:
public override void _Input(InputEvent @event) { // 仅处理鼠标左键释放事件 if (@event is InputEventMouseButton mouseEvent && !mouseEvent.Pressed && mouseEvent.ButtonIndex == MouseButton.Left) { // 将鼠标全局坐标转换为当前节点的本地坐标 Vector2 localMousePos = ToLocal(mouseEvent.GlobalPosition); // 检查点击位置是否在AnimatedSprite2D的范围内 if (GetRect().HasPoint(localMousePos)) { Stop(); } } }
关键说明:
- 合并了重复的类型判断,简化代码逻辑
ToLocal用于将鼠标的全局位置转换为当前节点的本地坐标,适配节点的父级变换(比如缩放、旋转)GetRect()获取AnimatedSprite2D的本地矩形范围,HasPoint判断坐标是否在该范围内
你也可以直接用全局坐标判断,效果一致:
if (GetGlobalRect().HasPoint(mouseEvent.GlobalPosition)) { Stop(); }
方案二:使用Area2D检测点击(更灵活)
如果你的动画帧有不同的碰撞区域,或者不想手动处理坐标转换,可以用Area2D来实现:
- 在AnimatedSprite2D节点下添加一个
Area2D子节点 - 给Area2D添加
CollisionShape2D,设置匹配AnimatedSprite2D大小的碰撞形状(比如RectangleShape2D) - 在Area2D的Inspector面板中,将
Monitorable设为true,Mouse Filter设为Stop - 连接Area2D的
input_event信号到AnimatedSprite2D的脚本 - 实现信号处理函数:
private void OnArea2DInputEvent(Node viewport, InputEvent @event, int shapeIdx) { if (@event is InputEventMouseButton mouseEvent && !mouseEvent.Pressed && mouseEvent.ButtonIndex == MouseButton.Left) { Stop(); } }
关键说明:
- Area2D会自动检测是否有输入事件落在其碰撞范围内,无需手动处理坐标
- 若动画帧有不同的碰撞区域,可以在动画的
AnimationPlayer中添加轨道,动态调整CollisionShape2D的形状
内容的提问来源于stack exchange,提问作者kaimaster
相关产品推荐
相关产品推荐

