鼠标点击获取GlobalPosition坐标异常及怪物生成位置偏移求助
解决鼠标点击获取世界坐标生成怪物的问题
先明确坐标定义
InputEventMouseButton.Position是视口像素坐标:以视口左上角为原点,数值和窗口分辨率直接挂钩。- 你遇到
GlobalPosition是Position两倍的情况,大概率是因为项目开启了2倍像素缩放(比如项目设置里的Display/Window/Size/Scale设为2),或者当前视口的scale属性为2。GlobalPosition是相对于根视口的坐标,缩放会让两者成比例。
正确获取世界坐标的方法
核心是把视口坐标通过相机转换成世界空间坐标——因为你的相机跟随角色移动,直接用事件坐标会和世界位置脱节。
C#实现代码
public override void _UnhandledInput(InputEvent @event) { // 只处理鼠标按下瞬间,避免重复生成怪物 if (@event is InputEventMouseButton mouseEvent && mouseEvent.Pressed && Input.IsActionPressed("attack")) { // 获取当前视口的主相机 Camera2D mainCamera = GetViewport().GetCamera2D(); // 将视口坐标转换为世界坐标(2D场景Z轴传0即可) Vector2 worldPosition = mainCamera.UnprojectPosition(mouseEvent.Position); EnemySlime newSlime = Slime.Instantiate<EnemySlime>(); // 用GlobalPosition直接绑定世界位置,避免父节点坐标影响 newSlime.GlobalPosition = worldPosition; AddChild(newSlime); } }
GDScript参考版本
func _unhandled_input(event): if event is InputEventMouseButton and event.pressed and Input.is_action_pressed("attack"): var main_camera = get_viewport().get_camera_2d() var world_position = main_camera.unproject_position(event.position) var new_slime = Slime.instantiate() new_slime.global_position = world_position add_child(new_slime)
注意事项
- 必须用
GlobalPosition给怪物赋值:如果父节点不是世界根节点,直接设Position会使用父节点的本地坐标,导致位置偏移。 - 相机的缩放、偏移会自动被
UnprojectPosition处理,无需手动计算。 - 加上
mouseEvent.Pressed判断:避免按住鼠标时反复生成怪物。
内容的提问来源于stack exchange,提问作者Animaliss
相关产品推荐
相关产品推荐

