Godot:在一组两个ViewportContainers中,只有第二个接收鼠标事件



我正在开发的3D FPS游戏遇到了一个令人沮丧的情况;鼠标和控制器,它们在其中控制单独的播放器。我已经能够用两个控制器实现这样的并排合作。特别是,我正试图为KBM播放器捕捉鼠标的移动,这样我就可以相应地旋转他的相机。

以下是Viewports的树:

-- Control
------ HboxContainer
---------- ViewportContainer
-------------- Viewport
---------- ViewportContainer2
-------------- Viewport

节点都已正确展开和拉伸。我已经在Control、HboxContainer和ViewportContainer节点上尝试了所有我能想到的鼠标过滤。我也尝试过设置";本地处理输入";对于两个视口均为true。然后我尝试将一个脚本附加到两个ViewportContainers,看起来像这样:

extends ViewportContainer
func _ready():
set_process_unhandled_input(true)
func _input(event):
print(event)
if event is InputEventMouse:
print('#############n', self.name, ' mouse event')

这样做的目的是看看我是否可以在ViewportContainers中捕捉鼠标事件,然后将事件传递到Viewport;鼠标玩家的生命。然而,我得到的唯一输出是这样的:

[InputEventMouseMotion:xxx]
#############
ViewportContainer2 mouse event

这就是我注意到奇怪和令人沮丧的行为的地方。只有第二个ViewportContainer正在接收鼠标事件。为了进一步证明这种行为,我确认,当控制器播放器使用左侧(第一个(Viewport,KBM播放器使用右侧(第二个(Viewpoint时,设备组合可以完美工作。

因此,我真正需要帮助的是弄清楚是否有一种方法可以用我现有的配置在第一个Viewport中接收鼠标输入。如果没有,我愿意尝试不同的树配置。我只需要能够有并排的视口,均匀地分割屏幕。

编辑

以下是我处理鼠标输入并相应旋转相应玩家相机的代码:

if not usingController && event is InputEventMouseMotion && Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
rotate_y(-event.relative.x * mouseSensitivity)
camera.rotate_x(-event.relative.y * mouseSensitivity)
var cameraRotation: Vector3 = camera.rotation_degrees
cameraRotation.x = clamp(cameraRotation.x,  (angleOfFreedom * -1) - 90, angleOfFreedom - 90)
camera.rotation_degrees = cameraRotation

经过我所做的所有研究,我确信某个控制节点正在消耗鼠标事件,但我只是不知道在哪里。我不断地挖掘,尝试不同的东西,直到我最终意识到我的播放器场景有一个HUD,它包含多个控制节点。你知道什么?这些控件都将鼠标过滤器设置为"0";停止";。将这些设置为";忽略";修复了我的问题,现在一切都如我所料。我一直在到处寻找可能导致这种情况的控制节点,除了播放器场景。因此,对于将来可能遇到此类问题的任何人来说,只要继续查看树中的每个场景,寻找设置了鼠标过滤器属性的控制节点即可。

这就是我想到的:你可以用这样的脚本进行自动加载,例如Pointing2D

extends Node2D

var position:Vector2D

func _input(event: InputEvent) -> void:
if not (
event is InputEventScreenDrag
or event is InputEventScreenTouch
or event is InputEventMouse
):
return
position = event.position

然后在需要的地方阅读Pointing2D.position。例如_process。如果你想知道它在帧之间移动了多少,你可以存储旧值:

var old_pointing_position:Vector2
func _process(_delta:float) -> void:
var pointing_position := Pointing2D.position
var delta_pointing_position := pointing_position - old_pointing_position
old_pointing_position = pointing_position

最新更新