【问题标题】:Godot debug window not triggering area2d signalsGodot 调试窗口未触发 area2d 信号
【发布时间】:2021-03-16 06:00:24
【问题描述】:

Video of what's happening exactly

规格是:

  • 正在录制 2560x1080@60hz 的显示
  • 显示窗口离屏 3840x2160@24hz(也用 60hz 测试过)
  • Windows 10
  • GPU Nvidia 970 GTX

这周刚开始学习 godot,却因这种奇怪的行为浪费了几个小时。

戈多细节:

  • 不修改形状和实体的比例(不与物理混淆)
  • 开始尝试创建一个扩展 KinematicBody2D 的实体类,以在我的游戏中创建敌人的实例。现在只是使用虚拟块来测试碰撞是否确实有效(由于视频中发生的事情而在此停止)
  • 具有一个正方形纹理的大虚拟正方形被称为实体,与巨大的 Y 尺寸碰撞只是为了测试一下。
  • 我要触发信号的area2d是字符前面的小矩形。

有什么我应该知道的导致信号仅在调试窗口位于另一个显示器上时触发?我是否应该将调试窗口移至另一台显示器并相信游戏会正常运行?

代码 sn-ps

在我的动画控制器中创建 Area2D

func _create_shape_with_collision(s : Shape2D, parentNode : Node) -> Node:
    var ret = Area2D.new()
    ret.connect('body_entered', self, '_check_body_entered')
    var c = CollisionShape2D.new()
    c.shape = s
    parentNode.add_child(ret)
    c.disabled = true
    c.name = 'collision_shape'
    ret.add_child(c)
    return ret

信号功能

func _check_body_entered(body : Node):
    print(body.name)

PS:尝试在 Godot 的界面中键入一些内容来帮助自动完成,但我创建的类无法正常工作。

PS2:在 godot 的 reddit 页面上发布了同样的消息,希望能提高知名度

【问题讨论】:

  • 看起来像 Godot 中的一个错误。该视频说您使用的是 Godot 3.2.3。在撰写本文时,Godot 3.2.4 here 有一个候选版本,该候选版本有一些已知问题,但也修复了很多错误。在那里尝试你的项目。如果它也有同样的问题,请考虑在 Github here 上打开一个问题。鼓励一个有问题的最小项目。
  • @Theraot 因为它似乎在显示 1 中工作(显示 2 中的 godot 窗口),我将调试窗口设置为在显示 1 上打开,到目前为止一切似乎都运行顺利。如果我为游戏发布了一个可执行文件,我可以相信它会像这样工作吗?
  • 您的目标平台与您开发的平台相同吗?如果是的话,我希望它也能正常工作。此外,您可以继续导出并测试它。否则,无法替代在目标硬件上进行测试。我没有多显示器设置来为您测试。我不希望任何只有一台显示器的人会遇到这个问题。我想重申我之前的评论。首先,Godot 测试版和候选版本都很好。我在生产中使用过它们。只记得测试。我们现在正处于新马厩的边缘。其次,如果还没有解决这个问题,它应该打开一个问题。
  • 好的,我测试了它:在当前稳定版上导出,在 3.2.4-RC5 上调试和导出,问题仍然存在。猜猜是时候打开一个问题了。感谢您的澄清。

标签: godot


【解决方案1】:

确保在 Area2D 节点中有匹配的碰撞图层和蒙版。
Shape2D 是一种资源,这意味着如果您不创建 .new() 则所有 CollisionShape2D 都使用相同的形状实例。如果有人明确设置它是免费的,那么每个人都没有了(所以如果你不小心分配了一个空形状,请尝试打印)。当 CollisionShape2D 准备好时,在分配没有发生后调整大小有些奇怪。 但你也有可能不应该存在的c.disabled = true

【讨论】:

  • 嘿,伙计,谢谢您的回答-我将碰撞层和掩码用作所有内容,而不是默认设置。此外,由于脚本的另一部分在需要时将其切换为 disabled = false (如剑攻击的第 2 帧,如上面的视频链接中所示),我在附加时禁用了 collisionshapes2d。事实上,调试显示该区域在发出命令时变为蓝色(启用)。 (我还为我使用的每个 kinematicbody2d / area2d 创建了一个新的碰撞形状 2d,因为这似乎适用于我当前的管道。
【解决方案2】:

因为@Theraot 为在 Godot 的 Github 页面上编写问题铺平了道路,所以我能够确定上述 bug 的原因,同时创建了一个最小的项目。

其实和代码一点关系都没有,只是和项目设置有关。物理 FPS 设置为 60,而我的辅助屏幕能够捕获事件,因为默认情况下 VSYNC 也是打开的(以刷新率限制 FPS,辅助屏幕为 24hz)。

将物理 FPS 提高到 120(此时为经验值)使信号在所有显示器上都能正常工作。

很乐意接受更好的答案,解释更改此类数字的影响(对设备的压力等),如果这是一种不好的做法,或者是否有另一种方法可以为 Area2Ds 或 PhysicsBody2Ds 配置单个更快的滴答声。由于我目前缺乏知识/研究,无法写出这样的答案。试图在这一点上写它是一种诡辩。

由于我只是在编写游戏设计文档时编写一些基本的游戏元素,所以到目前为止对我来说非常好。

编辑:

在用户@Theraot 的洞察之后,我忽略了 _process 和 _physics_process 的不同工作方式;对于我的用例,我所做的大部分工作都应该在 _physics_process 中,因此我可以将引擎的物理 FPS 恢复为默认值。

【讨论】:

  • 我的直觉是,您正在做一些改变_process 中的物理的事情,因此与实际帧速率有关。 _physics_process 应该以配置的物理速率运行,因此不受当前监视器的影响。这让我觉得如果你从_process 移动到_physics_process 一定有一些代码可以让你的项目在不需要增加物理速率的情况下工作。我猜这就是您启用/禁用碰撞区域的地方。希望你能弄清楚并改进你的答案。
  • 你好@Theraot。非常感谢你的洞察力。事实上,我正在使用的 AnimationController 有一些与 _process 相关的东西。将其更改为 _physics_process 使一切正常(在将物理 fps 恢复为默认值之后),我什至花时间测试降低和提高物理 FPS 以检查行为是否相同。我相信这是一个强大的工具,可以检查游戏是否按预期运行(因为一切都运行得很慢,很容易看出逻辑中的缺陷,或者我对引擎的物理有任何疏忽,因为我不太熟悉它)。
猜你喜欢
  • 2022-08-03
  • 2020-04-12
  • 1970-01-01
  • 2022-01-15
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多