微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Godot 调试窗口不触发 area2d 信号

如何解决Godot 调试窗口不触发 area2d 信号

Video of what's happening exactly

规格为:

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

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

Godot 细节:

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

有什么我应该知道的,导致信号只在调试窗口在另一个显示器上时触发?我应该将调试窗口移到另一个显示器上并相信游戏可以运行吗?

代码片段

在我的动画控制器中创建 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 页面上发布了同样的消息,希望能有更好的知名度

解决方法

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

,

因为@Theraot 为在 Godot 的 Github 页面上编写问题奠定了基础,所以我能够在创建一个最小项目的同时确定上述错误的原因。

其实跟代码一点关系都没有,只跟项目设置有关。物理 FPS 设置为 60,而我的副屏能够捕捉到事件,因为 VSYNC 在默认情况下也处于开启状态(FPS 上限为刷新率,副屏为 24hz)。

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

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

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

编辑:

从用户@Theraot 获得洞察后,我忽略了 _process 和 _physics_process 的工作原理;对于我的用例,我所做的大部分事情都应该在 _physics_process 中,这样我就可以将引擎的物理 FPS 恢复为默认值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。