其他碰撞问题

你好,我尝试恢复了这样一个条件:如果角色在奔跑时按下右键并触碰到墙壁(例如),则返回等待状态,但它仍然像以前一样持续执行相同的行为。它不断在“奔跑”状态和“等待”状态之间切换,并且持续检测到实际上并不存在的墙壁。一旦我再次移除该条件,角色就能正常移动。

顺便提一下,我还注意到它持续出现另一个奇怪的现象:如果你紧贴墙壁并按下跳跃键,当角色下落时,似乎会在瞬间检测到它已接触地面,从而可以再次跳跃,如此循环往复,直到你可以通过连续跳跃爬上墙顶。:sweat_smile:

这是一个很容易复现的 bug,在版本 17 中并不存在,因为直到升级到版本 18 我才注意到它。例如,如果你将物体的下落速度设置为 100,就会更容易观察到该问题。

你可以使用我之前发送的测试项目来验证,该项目涉及子弹设置 bug、性能损耗问题以及开火按钮 bug(尚未修复 :winking_face_with_tongue:)。只需在“等待”状态添加一条控制台文本提示“等待”,在“奔跑”状态添加一条提示“奔跑”,然后移动角色,你就会看到问题。接着,建造一堵高墙,紧贴它并按下跳跃键,问题就会非常明显。

另外,该 bug 也会影响敌人。如果你设置条件:当敌人右侧与墙壁碰撞时,执行向左行走的动作,反之亦然,那么敌人会陷入循环,开始不断左右来回行走。

您可以尝试本文提出的解决方案,即简单地将任何在版本变更前已存在的游戏对象的 CollisionShape2D 的旋转值更改为另一个值,然后再改回 0。不知何故,当我做了这个简单的操作后,侧面检测又开始正常工作了。

您好,我按照视频中的操作进行了尝试,但问题仍未解决。我已修改了测试图块,以便您能看清地板图块的大小并更好地观察其行为。我还添加了文本消息,让您可以看到角色的状态。如果您查看输出窗口,会发现状态从 WAIT 变为 RUN,因为不知为何系统检测到了墙壁。如我之前所述,我设置了条件:当处于 WAIT 状态且按下右键(例如)时,如果未检测到墙壁,则进入 RUN 状态。然而,有时角色无法移动,因为它检测到了实际上并不存在的墙壁。同样的问题也发生在移动过程中,因为我设置了当检测到移动方向上有墙壁时,状态会变为 WAIT。此外,我还调整了角色的下落速度,以便更清晰地展示跳跃效果。如果您紧贴墙壁并按下跳跃键,在下落时系统会错误地检测到地面(实际上并不存在),从而允许您持续跳跃并攀爬墙壁。您也可以在敌人身上观察到类似的行为。以下是该项目的示例,我之前曾因子弹和火焰按钮的 bug 提交过。这是一个展示其运行方式的视频。

Grabación 2025-08-31 090429.zip (3.9 MB)

好吧,我已经使用上述逻辑创建了一个新的基本对象,仅包含碰撞体而没有动画,但并未出现我在上一条评论中描述的任何问题。考虑到所需的工作量,我不得不尝试移除碰撞体并为所有动画重新创建,以查看这是否能解决问题……

进一步测试:我删除了之前发送视频中的敌人碰撞体并重新制作,因为很简单——每一帧都是正方形,但错误仍然存在。
然后我尝试了 BAZ 给我的解决方案:旋转碰撞体再将其重置为 0,错误依旧。为了测试,我将碰撞体重新设为 90 度并保持该状态。测试项目后,一切正常。
我加载了其他项目并做了同样的操作,将碰撞体保持在 90 度,结果也都正常……这让我非常惊讶。于是我加载了一个刚开始使用 AGM 时的旧项目,发现使用相同的逻辑也能正常运行。这促使我思考并调查这些项目之间的共同点,以及这个旧项目与其他项目之间的不同之处。我意识到,除了那个旧项目外,我在所有项目中都使用了脚本“ark_agm_rotate_to_velocity.gd”来实现子弹的自动旋转。我认为该脚本可能在某种程度上破坏了对象的碰撞体,因为我在一些对象上测试过它,随后又将其移除或保留在其他对象上。
看来我不得不将所有碰撞体旋转至 90 度,并在所有动画中重新调整大小;或者,从零开始重新创建所有对象,不再使用该脚本,并尝试在项目中的任何地方彻底清除其痕迹……:man_facepalming:

嗯,我想我已经解决了我的难题。问题出在缩放后的对象上。如果你缩放一个对象,会导致碰撞问题。如果将其恢复为正常比例,就能正常工作。:man_shrugging:

感谢您的进一步测试!能否请您帮忙确认一下,ark_agm_rotate_to_velocity 脚本是否会干扰 AGM 的碰撞规则运行?这是我很久以前编写的一个脚本。如果一个物体本身被旋转,其附带的碰撞体确实会随之旋转。如果这种情况导致问题,我想我需要在原始论坛插件帖子中添加一些说明。

此处的缩放是指 GameObject 还是 CollisionShape?或者,此问题仅在 X 和 Y 使用不同的缩放比例时才会遇到?

你好,我会运行更多测试,但我认为脚本与此无关。问题出现在更改对象的缩放比例时。通常,缩放比例为 1/1。如果将其设置为 0.5/0.5,例如我之前设置的,就会出现墙壁检测问题。如果您想缩放对象并在舞台上移动它,这可能会成为一个问题。如果进行缩放,就会出现我在视频中提到的相同问题。我请您查看此问题。另外,我认为自动旋转功能应集成到引擎中,就像在 PGM 中已经实现的那样。

我进行了一些尝试,起初无法复现该问题。然而,在混合使用左右碰撞检测并使用0.5倍缩放的GameObject的条件下,我终于发现了一些异常行为。这里显然存在一个bug(我将报告它),但目前我无法确定我遇到的问题是否与您的相同。因此,如果您能分享您的最小复现项目会更好,但如果不方便也没关系。

已发送。这是同一个项目,之前因子弹设置导致的性能损失问题而发送,他们还检测到了火控按钮的问题。顺便说一句,子弹问题仍未解决。:winking_face_with_tongue:

我通过一些调整解决了这个卡顿的移动问题:

  • 移除了 Wait 中的 0% 速度,不知为何,如果将其设置为 0% 速度,它似乎会忽略输入或其他问题。我需要对此进行更多研究

  • 需要在停止向右/向左移动的条件中添加 visible_direction 检查:

不过,检测墙壁仍然很棘手……我会继续调查:

你好,我几周前已在该Steam帖子中讨论过将速度设置为0时会发生什么:

另外,我项目中的“幽灵”碰撞问题与角色的缩放比例有关。在我发送的项目中,角色的缩放比例为0.5/0.5。如果将其设置为1/1(即其实际缩放比例),则无论是移动还是跳跃,“幽灵”检测问题都会得到解决,并且无需任何修改即可完美运行。加载项目后不做任何修改,仅更改缩放比例,您就会看到它运行无误。问题出现在对角色进行缩放时;如果这样做,就会出现碰撞问题。

明白了,我现在明白你在说什么了。当缩放比例不是 1.0 时,跳向墙壁会以某种方式触发底部墙壁检测。

此视频中我之前上传的内容所显示的问题,无论是移动还是跳跃时,通过将对象比例恢复为 1/1 即可解决,无需修改游戏操作。这同时修复了角色和敌人的问题。
问题出在缩放对象时的碰撞检测上。
希望这能帮助理解我所解释的内容,因为谷歌翻译在不同语言之间有时会比较生硬。

Grabación 2025-08-31 090429.zip (3.9 MB)

是的,我为由此造成的额外困惑表示歉意。关于您问题的错误报告仍在处理中。