我做了一个开关墙壁,可以打开关闭,然后另外一个对象可以通过拉杆移动,
如果我在本来可以开关墙壁的位置停止 移动对象,然后打开墙壁,这时碰撞会随机把 移动对象挤压去某个位置。

想请教一下如何有效合理的解决这个问题?
我最初是给移动对象加入判定:如果陷入墙体内时 → 就往X轴移动50像素。
但设置后好像并没有产生任何效果。还是被挤压弹走。不知在哪一步出错了,只好来论坛请教!
我做了一个开关墙壁,可以打开关闭,然后另外一个对象可以通过拉杆移动,
如果我在本来可以开关墙壁的位置停止 移动对象,然后打开墙壁,这时碰撞会随机把 移动对象挤压去某个位置。

想请教一下如何有效合理的解决这个问题?
我最初是给移动对象加入判定:如果陷入墙体内时 → 就往X轴移动50像素。
但设置后好像并没有产生任何效果。还是被挤压弹走。不知在哪一步出错了,只好来论坛请教!
你是否使用了“移动和跳跃”设置中的“启用角点校正”选项?
说来惭愧,完全不知道这是什么功能 ![]()
我刚去开启测试了下,依然会被挤压弹飞,和没开启前好像没任何不同
我为你编写了一个小型自定义动作,供你尝试。
BazEjectOverlapAction.gd (26.8 KB)
它有两种工作方式,通过第一个选项“Who Moves”(谁移动)来选择。
Push Others(推动其他物体):放置在墙壁上。将其放在墙壁碰撞体开启状态之前的那个状态中。当该状态运行时,它会检查与墙壁碰撞形状重叠的物体,并在同一帧内将其移开,这样物理引擎就没有机会将其推开。这是针对你的设置首先推荐尝试的方法,因为它最可靠。
Push Self(推动自身):放置在移动的物体上。在任何可能会卡住的状态中,它会每一帧检查自己是否处于墙壁、方块或其他固体物体内部,并自行退出。不过,这种方法是在与引擎自身的推力进行竞争,因此如果你仍然看到物体先跳动然后才稳定下来,请改用墙壁上的“Push Others”。
Push Direction(推动方向)选择物体移动的方向。Nearest(最近)选择最短的退出路径,或者你可以强制向左、向右、向上或向下。
Push Padding(推动填充)是物体移动后与墙壁边缘之间留下的间隙,而不是移动的总距离,因此通常 2 或 3 就足够了。
要用你的墙壁进行测试:
实在太感谢Baz先生了!我测试了一下。未能成功可能操作上有误差
目标组选择里并不能选我自己的编组。但这应该没关系我选择了默认的全部,我的开启墙壁的动画,前几帧碰撞框是未启动的,最后一帧才启动碰状况。
我在这个动作的动作下加入了 Push Others,但进入测试还是被挤压弹走了。
于是我尝试按您说的在开启中间加入一个新动作专门用来检测,但还是一样被挤压弹走 ![]()
想请问下 Push Others 这个动作是如何检测其他碰撞框的?比如 墙壁在 1层碰撞框无遮罩,移动对象无无层1遮罩,这样可以吗? 我测试下也是没反应。还请baz指点
我也测试了下Push Self,产生了效果,但每次打开墙壁它都会自行移动,它作为墙壁对象没任何卡住在空中也移动了,每次关闭再打开都会移动一段距离
顺便问一下,在面具不匹配的情况下,墙壁仍然会把物体推开吗?还有,他具体把“推其他物体”放在哪里了(是哪个状态,墙壁的框是否存在于该状态动画的最后一帧)?
S.C,抱歉给你添麻烦了,这两个问题都是我这边的原因。你测试的那个版本只在墙箱已经开启时才会检查它,而 AGM 动画编辑器会将墙箱保持关闭状态直到最后一帧,因此它从未检测到需要推送的对象。我已经修复了这个问题,并调整了时序:现在它会读取墙壁自身的动画,并在箱子开启前的一瞬间进行推送,而不是在状态刚开始时。已更新的文件已附上,只需替换 custom_actions 文件夹中的那个文件即可。
BazEjectOverlapAction.gd (37.0 KB)
对于“推送其他对象”(Push Others),请将其放在播放关闭动画的同一状态上,不再需要额外的状态。它唯一需要的条件是:在该动画的第一帧中,墙箱处于关闭状态,这正是你目前所拥有的设置。“推送自身”(Push Self)则应放在会被卡住的物体上,放在任何状态均可,现在它不仅能从即将关闭的墙壁中脱身,也能从已经是实体的方块等物体中脱身。
关于碰撞掩码,它使用与碰撞体自身相同的图层和掩码,没有要求必须是第 1 层。如果双方掩码都看不到对方的图层,它们根本就不会发生碰撞,自然也就没有东西可推。如果你仍然遇到了掩码不匹配却被推开的情况,请告诉我,那将是另一个不同的问题。
墙壁随“推送自身”漂移是我的 bug,掩码设为 0 会导致它将所有物体视为实体。这个问题也已修复,不过“推送自身”本意是用于移动物体,而非墙壁。群组下拉菜单目前仅列出默认群组,“所有群组”(All Group)可以正常工作,我接下来会处理自定义群组。
请告诉我进展如何!
报告baz,我刚用新版替换后还是和原来一样被挤压弹走。未能成功实现移动对象的X轴平移。
这里可以看一下我的墙壁动画。碰撞框的第一帧是开启,后面的帧则是禁用。
而我的动作开启和关闭都是使用这个动画,墙砖块关闭就直接播放。如果是开启墙砖块就使用了动画倒放。
您的动作就是放在开启倒放的动作里。失败了。也就是最后一帧开启了碰撞框的动画。
墙砖块
移动对象
我在多次测试里尝试把两者的碰撞层和遮罩都打开,依然不行
感谢提供截图,这正是缺失的关键部分。我发送的版本只能识别墙壁动画正向播放,而你的关闭状态是反向播放的,因此它从未检测到箱子出现,也就没有执行任何操作。我重新构建了你的设置:箱子在第一帧开启,之后关闭,并反向播放,新文件会在箱子开启前将对象推出。墙壁也保持不动。如果你更倾向于将逻辑放在移动对象上,同样的修复方法也适用于 Push Self。
你的图层和掩码设置是正确的,墙壁使用图层 2,移动对象使用掩码 2,这正是系统查找的配对组合,因此无需更改。
已附上更新后的文件,请替换 custom_actions 目录中的原文件,并将动作保留在你原本放置的位置,即 enable 状态内部。如果替换后仍然出现推动现象,能否发送墙壁对象的场景文件,以便我直接运行测试?
BazEjectOverlapAction.gd (38.1 KB)
非常感谢baz的帮助
前来报告,我把更新的动作放在砖块墙壁上 Push Others,依旧是失败了。
把动作安装在移动对象身上,让它自己“推送自身”(Push Self),成功了一次了,但这是随机的,后续好多次都无法成功依然是被挤压弹走。可能是根据位置不同判定?
我提供上砖块墙壁和移动对象的tscn+vs,他们都是通过两个开关来切换形态。
使用空场景测试就OK!(可能需要你在新建场景里重新设置全局开关)
Moving Object.zip (4.7 KB)
switch_brick.zip (4.0 KB)
突然想起如果baz还保留我之前邮件发的场景可以直接在里面测试
砖块墙壁和移动对象里的开关可以直接替换成按键触发开启关闭会更简单,player都可以省略了 ![]()
很抱歉要提出这个请求,能否请你发送一个包含此确切场景、可直接用于测试的全新项目到 pgmmv-support@gotchagotcha.jp?这样我能最方便地调查你的具体情况,并相应地调整动作。我目前非常忙,这样做能极大地加快处理速度。
我见你许久没有回复已经大概知道用意所在了。我做了个mini版复现。
里面的砖块墙壁 按Z可以打开和关闭,同时已经加载了您的插件。
直接移动角色到砖块位置打开既可以测试。
Push Others_demo.rar (4.3 MB)
由于论坛容量限制,这个压缩包是双重压缩
非常感谢您的帮助,已经成功实现不被挤压的平移效果!
我在想之所以会被挤压到斜上角的原因,是否因为砖块墙是由多个小的正方形碰撞框组成,导致当移动对象嵌入时多个正方形碰撞框都在识别需要挪走它,从而导致对象被移动走的位置变得不稳定? 如果改成单个竖条碰撞框这种随机弹飞就会改善?(我去测试一下)
再次感谢baz先生的协助。
太棒了!
没错,确实就是这样。我一开始以为那面墙是一个单独的对象。![]()
是我的问题,没有提供足够详细的信息。
刚去测试了下,如果是单体碰撞框即便不用baz的插件,也不会出现随机的挤压弹飞,
AGM自身的碰撞弹出很符合直觉,哪边接近边缘就往那边平移出去。
原来如此,对象在多个碰撞框内才会出现挤压随机弹飞的现象,这里唯一要让它稳定下来就需要到您的插件了。貌似目前插件的群组不是对应项目的,如何可以对应真实群组就更好了。
我会调查一下。![]()