Input.get_mouse_position
2026/4/14大约 5 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — Input.get_mouse_position
Input.get_mouse_position
定义
想象你正在电脑屏幕前移动鼠标——鼠标箭头在屏幕上滑来滑去,每时每刻都有一个"位置"。get_mouse_position 就是帮你读取这个位置的:它会告诉你鼠标当前在游戏画面上的坐标(X 和 Y)。
就像在地图上用手指点一下,地图会告诉你经纬度一样——get_mouse_position 返回的就是鼠标在游戏窗口中的"经纬度"。
一句话总结
get_mouse_position = "鼠标现在在屏幕上的哪里?"——返回一个 (X, Y) 坐标,原点在游戏窗口的左上角。
注意坐标系方向
Godot 的 2D 坐标系中,Y 轴向下为正。也就是说,鼠标在窗口左上角时坐标是 (0, 0),往右移 X 增大,往下移 Y 增大。如果你觉得"为什么鼠标往下走 Y 反而变大了",这是正常的。
函数签名
C#
public static Vector2 GetMousePosition()GDScript
Input.get_mouse_position() -> Vector2参数说明
此函数没有参数,直接调用即可。
返回值
Vector2 — 鼠标在视口(Viewport)中的当前位置坐标。
- 坐标原点
(0, 0)在游戏窗口的左上角 - X 轴向右为正方向,Y 轴向下为正方向
- 返回值的单位是像素
代码示例
基础用法
最简单的用法——每帧打印鼠标当前位置:
C#
using Godot;
public partial class TestMouse : Node
{
public override void _Process(double delta)
{
Vector2 mousePos = Input.GetMousePosition();
GD.Print("鼠标位置: " + mousePos);
// 运行结果: 鼠标位置: (450, 320)
// 鼠标位置: (452, 318)
// 鼠标位置: (455, 315)
// (每帧更新,数值随鼠标移动而变化)
}
}GDScript
extends Node
func _process(delta: float) -> void:
var mouse_pos := Input.get_mouse_position()
print("鼠标位置: " + str(mouse_pos))
# 运行结果: 鼠标位置: (450, 320)
# 鼠标位置: (452, 318)
# 鼠标位置: (455, 315)
# (每帧更新,数值随鼠标移动而变化)实际场景
在一个 2D 射击游戏中,让玩家的炮塔始终朝向鼠标位置——这是俯视角射击游戏最常见的操作:
C#
using Godot;
public partial class Turret : Node2D
{
public override void _Process(double delta)
{
// 获取鼠标在屏幕上的位置
Vector2 mousePos = Input.GetMousePosition();
// 计算从炮塔指向鼠标的方向角度
// LookAt 会让炮塔的"前方"(右方向)朝向目标点
LookAt(mousePos);
GD.Print("炮塔朝向角度: " + Mathf.RadiansToDegrees(Rotation) + "°");
// 运行结果: 鼠标在右方时 炮塔朝向角度: 0°
// 鼠标在下方时 炮塔朝向角度: 90°
// 鼠标在左方时 炮塔朝向角度: 180°
}
}GDScript
extends Node2D
func _process(delta: float) -> void:
# 获取鼠标在屏幕上的位置
var mouse_pos := Input.get_mouse_position()
# 计算从炮塔指向鼠标的方向角度
# look_at 会让炮塔的"前方"(右方向)朝向目标点
look_at(mouse_pos)
print("炮塔朝向角度: %s°" % rad_to_deg(rotation))
# 运行结果: 鼠标在右方时 炮塔朝向角度: 0°
# 鼠标在下方时 炮塔朝向角度: 90°
# 鼠标在左方时 炮塔朝向角度: 180°进阶用法
在一个 2D 游戏中,实现鼠标点击移动(类似 RPG 游戏的点击移动)——点击屏幕某个位置后,角色平滑移动到该位置:
C#
using Godot;
public partial class ClickMovePlayer : CharacterBody2D
{
[Export] public float ExMoveSpeed = 200f;
[Export] public float ExStopDistance = 5f;
private Vector2 _targetPosition;
public override void _Ready()
{
// 初始化目标位置为当前位置
_targetPosition = GlobalPosition;
}
public override void _UnhandledInput(InputEvent @event)
{
// 检测鼠标左键点击
if (@event is InputEventMouseButton mouseEvent
&& mouseEvent.ButtonIndex == MouseButton.Left
&& mouseEvent.Pressed)
{
// 记录点击位置作为移动目标
_targetPosition = mouseEvent.Position;
GD.Print("点击目标: " + _targetPosition);
// 运行结果: 点击目标: (350, 280)
}
}
public override void _PhysicsProcess(double delta)
{
// 计算到目标的距离
float distance = GlobalPosition.DistanceTo(_targetPosition);
if (distance > ExStopDistance)
{
// 还没到目标:朝目标方向移动
Vector2 direction = (_targetPosition - GlobalPosition).Normalized();
Velocity = direction * ExMoveSpeed;
GD.Print("移动中... 距离目标: " + distance.ToString("F1") + " 像素");
// 运行结果: 移动中... 距离目标: 150.3 像素
}
else
{
// 已到达目标附近:停止
Velocity = Vector2.Zero;
}
MoveAndSlide();
}
}GDScript
extends CharacterBody2D
@export var ex_move_speed: float = 200.0
@export var ex_stop_distance: float = 5.0
var _target_position: Vector2
func _ready() -> void:
# 初始化目标位置为当前位置
_target_position = global_position
func _unhandled_input(event: InputEvent) -> void:
# 检测鼠标左键点击
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
# 记录点击位置作为移动目标
_target_position = event.position
print("点击目标: " + str(_target_position))
# 运行结果: 点击目标: (350, 280)
func _physics_process(delta: float) -> void:
# 计算到目标的距离
var distance := global_position.distance_to(_target_position)
if distance > ex_stop_distance:
# 还没到目标:朝目标方向移动
var direction := (_target_position - global_position).normalized()
velocity = direction * ex_move_speed
print("移动中... 距离目标: %.1f 像素" % distance)
# 运行结果: 移动中... 距离目标: 150.3 像素
else:
# 已到达目标附近:停止
velocity = Vector2.ZERO
move_and_slide()注意事项
- 坐标系是视口坐标:
get_mouse_position返回的是鼠标在视口(Viewport)中的位置,不是全局世界坐标。如果你的摄像机有缩放或偏移,视口坐标和世界坐标是不同的。要获取世界坐标,需要使用摄像机的变换进行转换。 - 在
MouseMode.Captured模式下无效:当鼠标被锁定(捕获)模式时(比如第一人称游戏),鼠标被隐藏且无法自由移动,此时get_mouse_position返回的值不会更新。在这种情况下,应该使用InputEventMouseMotion的Relative属性来获取鼠标的移动偏移量。 - 触摸屏上的行为:在移动设备上,
get_mouse_position会返回最后一次触摸的位置。如果还没有任何触摸事件,返回值可能是(0, 0)。 - 窗口缩放的影响:如果游戏窗口被拉伸或缩放(比如窗口模式与全屏模式切换),返回的坐标仍然是视口坐标,可能需要根据视口大小和实际窗口大小进行换算。
- C# 差异:C# 中方法名用 PascalCase(
Input.GetMousePosition),GDScript 中用 snake_case(Input.get_mouse_position)。
