Godot无法响应鼠标点击等输入事件时,检查这些内容
阅读原文时间:2023年08月10日阅读:5

注:本文以Godot 4.0 为基准,可能其他版本也能参考。

这是我用C#写项目时发现的,可能和gdscript使用者遇到的问题有一定区别。

如果你用Godot制作的游戏无法响应鼠标点击等输入事件,请检查下面这几种可能性,说不定能解决你的问题:

当你使用gdscript时,可能用脚本注册了gui_input信号,此时需要检查是否是Control,因为只有这个类型的实例有这个信号。

如果你注册的是pressed信号,那么需要检查类型是不是Button,不像某些平台,Godot的控件并不都有封装好的点击的信号。

如果你并没有用上述信号,而是重写了_Input(),则不用考虑此问题,也许应该看下面的项目。

因为只要是Node的实例,就可以_Input()以接受全局输入事件。

如果你的游戏有部分画面来自另一个视口(Viewport),

比如把另一个场景的物体显示在画面上侧显示血条之类的信息,

那么这个新的视口无法直接收到输入事件,即使_Input()也不会有响应。

如果你需要它响应_Input(),那么可以用代码转发事件,我试过在SubViewport上添加一个脚本,重写_Input()后直接将取得的事件参数转发给目标节点,再由它广播到它的子节点,广播时调用子节点的_Input()函数即可。当然,SubViewport直接广播给目标节点的子节点也是可行的。

如果你需要它通过gui_input信号之类的信号起作用,我目前没有实践经验,也许信号也是可以转发的。

tips:转发后,鼠标事件可能需要考虑坐标系转换。(我不确定需不需要转,因为我转发的是键盘输入)

这是我今天遇到的问题,有"不明遮挡物"挡住了我的鼠标输入。

这次经历告诉我,需要特别检查是否有ReferenceRect在你需要操控的控件上覆盖,因为它是一种Control,即使你勾选了EditorOnly,它仍然会遮挡住你的鼠标输入,我认为EditorOnly只会让方框看不见,但是它仍然有控件的作用,建议用代码或手动将其在场景树上隐藏(GetNode<CanvasItem>("RefRect").Visable=false),这样才不会遮挡输入。

这个问题只会影响gui_input信号(在C#中称GuiInput事件)。