Godot无法响应鼠标点击等输入事件时,检查这些内容
注:本文以Godot 4.0 为基准,可能其他版本也能参考。这是我用C#写项目时发现的,可能和gdscript使用者遇到的问题有一定区别。
(资料图片)
如果你用Godot制作的游戏无法响应鼠标点击等输入事件,请检查下面这几种可能性,说不定能解决你的问题:
1 绑定gui_input信号
的节点是否是Control? 绑定pressed信号
的节点是否是Button?当你使用gdscript时,可能用脚本注册了gui_input信号
,此时需要检查是否是Control
,因为只有这个类型的实例有这个信号。
如果你注册的是pressed信号
,那么需要检查类型是不是Button
,不像某些平台,Godot的控件并不都有封装好的点击的信号。
如果你并没有用上述信号,而是重写了_Input()
,则不用考虑此问题,也许应该看下面的项目。
因为只要是Node
的实例,就可以_Input()
以接受全局输入事件。
Viewport
/SubViewport
?如果你的游戏有部分画面来自另一个视口(Viewport),比如把另一个场景的物体显示在画面上侧显示血条之类的信息,
那么这个新的视口无法直接收到输入事件,即使_Input()
也不会有响应。
如果你需要它响应_Input()
,那么可以用代码转发事件,我试过在SubViewport
上添加一个脚本,重写_Input()
后直接将取得的事件参数转发给目标节点,再由它广播到它的子节点,广播时调用子节点的_Input()
函数即可。当然,SubViewport直接广播给目标节点的子节点也是可行的。
如果你需要它通过gui_input信号
之类的信号起作用,我目前没有实践经验,也许信号也是可以转发的。
tips:转发后,鼠标事件可能需要考虑坐标系转换。(我不确定需不需要转,因为我转发的是键盘输入)
3 是否有遮挡物?这是我今天遇到的问题,有"不明遮挡物"挡住了我的鼠标输入。
这次经历告诉我,需要特别检查是否有ReferenceRect
在你需要操控的控件上覆盖,因为它是一种Control
,即使你勾选了EditorOnly
,它仍然会遮挡住你的鼠标输入,我认为EditorOnly
只会让方框看不见,但是它仍然有控件的作用,建议用代码或手动将其在场景树上隐藏(GetNode
),这样才不会遮挡输入。
这个问题只会影响gui_input信号
(在C#中称GuiInput事件
)。