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键");
}
}
}
}
}
配置虚拟按键
设置虚拟按键
在项目设置中,可以设置虚拟按键,具体设置方法如下:
- 打开左上角 项目-项目设置-输入映射

- 设置虚拟按键名称,点击添加!

- 点击虚拟键后面的“+”号,添加虚拟按键对应的物理按键,可以添加多个按键!

- 直接按下想设置的按键,然后点击确定即可!

- 如图,我添加了两个触发虚拟按键的物理按键,分别是“space”和“鼠标侧键1”,点击关闭即可保存设置!

监听虚拟按键
配置好虚拟按键后,就可以直接监听虚拟按键了,我的配置如图所示!
在看代码之前先介绍两个方法:
- GetAxis():该方法接受两个参数,都是设置的虚拟按键的名称,第一个虚拟按键按下时返回-1,第二个虚拟按键按下时返回1,如果都没有按下则返回0。如果两个按键都按下,则返回0。
- 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}");
}
}

浙公网安备 33010602011771号