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

鼠标点击获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:39:59