Godot-按键与鼠标事件检测

C# 输入事件检测

手写鼠标按下事件

配置起来相对繁琐一些,因为实际玩游戏的设备不一定只有键鼠,可能还有手柄。如果一个个手写的话,比较麻烦,而且容易出错。具体实现方式如下,可以在每一帧进行检测,也可以在_Input中进行全局检测。

using Godot;
using System;

public partial class InputTest : Node2D
{
	/// <summary>
    /// 测试输入事件
    /// </summary>

	public override void _Ready()
	{
		// 鼠标模式设置:显示、隐藏、捕获等等
		Input.MouseMode = Input.MouseModeEnum.Visible;
	}

	public override void _Process(double delta)
	{
		// 在_Process中检测持续按压状态
		if (Input.IsMouseButtonPressed(MouseButton.Left))
		{
			GD.Print("持续按压鼠标左键");
		}
	}

	public override void _Input(InputEvent @event)
	{
		// 检测鼠标点击事件
		if (@event is InputEventMouseButton mouseEvent)
		{
			if (mouseEvent.ButtonIndex == MouseButton.Left)
            {
				// 检测按下和松开
				if (mouseEvent.IsPressed())
				{
					GD.Print($"按下鼠标{mouseEvent.ButtonMask}键,位置: {mouseEvent.Position}");
				}
				else if (mouseEvent.IsReleased())
				{
					GD.Print("释放左键");
				}
			}
		}		
		// 检测键盘按键事件
		else if (@event is InputEventKey keyEvent)
		{
			if (keyEvent.Keycode == Key.A)
			{
				// 检测按下,持续按压,松开
				if (keyEvent.Pressed && !keyEvent.Echo)
				{
					GD.Print("按下A键");
				}
				else if (keyEvent.Pressed && keyEvent.Echo)
				{
					GD.Print("持续按压A键");
				}
				else if (!keyEvent.Pressed)
				{
					GD.Print("释放A键");
				}

			}
		}
	}	

}

配置虚拟按键

设置虚拟按键

在项目设置中,可以设置虚拟按键,具体设置方法如下:

  1. 打开左上角 项目-项目设置-输入映射img
  2. 设置虚拟按键名称,点击添加!img
  3. 点击虚拟键后面的“+”号,添加虚拟按键对应的物理按键,可以添加多个按键!img
  4. 直接按下想设置的按键,然后点击确定即可!img
  5. 如图,我添加了两个触发虚拟按键的物理按键,分别是“space”和“鼠标侧键1”,点击关闭即可保存设置!img

监听虚拟按键

配置好虚拟按键后,就可以直接监听虚拟按键了,我的配置如图所示!img
在看代码之前先介绍两个方法:

  1. GetAxis():该方法接受两个参数,都是设置的虚拟按键的名称,第一个虚拟按键按下时返回-1,第二个虚拟按键按下时返回1,如果都没有按下则返回0。如果两个按键都按下,则返回0。
  2. GetVector():该方法接受四个参数,分别设置两个X轴的虚拟按键和两个Y轴的虚拟按键,返回一个二维向量,向量的X轴和Y轴分别对应两个X轴和Y轴的虚拟按键的按下情况。四个参数对应的返回值为:-1,1,-1,1,

代码如下:

using Godot;
using System;

public partial class InputTest : Node2D
{
	/// <summary>
    /// 监听虚拟按键
    /// </summary>

	public override void _Ready()
	{
		// 鼠标模式设置:显示、隐藏、捕获等等
		Input.MouseMode = Input.MouseModeEnum.Visible;
	}

	public override void _Process(double delta)
	{
		// 监听虚拟按键状态:按下、持续按压、释放
		if (Input.IsActionJustPressed("Jump"))
		{
			GD.Print("Jump按下");
		}
		if (Input.IsActionPressed("Jump"))
		{
			GD.Print("Jump持续按压");
			// 获取虚拟按键按压力度
			float strength = Input.GetActionStrength("Jump");
			GD.Print($"Jump强度: {strength}");
		}
		if (Input.IsActionJustReleased("Jump"))
		{
			GD.Print("Jump释放");
		}
	}

	public override void _Input(InputEvent @event)
	{	// 设置移动事件
		// 获取水平轴方向的值,得到-1到1之间的浮点数
		float horizontal = Input.GetAxis("Left", "Right");
		GD.Print($"水平轴方向: {horizontal}");
		// 获取垂直轴方向的值,得到-1到1之间的浮点数
		float vertical = Input.GetAxis("Up", "Down");
		GD.Print($"垂直轴方向: {vertical}");
		// 获取平面2D向量
		Vector2 direction = Input.GetVector("Left", "Right", "Up", "Down");
		GD.Print($"二维方向向量: {direction}");
	}	
}
posted @ 2025-10-15 21:51  Jonia430  阅读(29)  评论(0)    收藏  举报