PIero
1
我想让跟随玩家的子对象和跟随敌人的子对象发生碰撞检测,但无论怎样设置图层或遮罩,它们都会互相穿过。
跟随设置的子对象之间无法发生碰撞吗?另外,如果子对象设置为不分离地跟随,是否也无法与瓦片发生交互?
动作游戏制作器的墙壁判定非常脆弱,当物体靠近墙壁时会被推入,高速碰撞时很容易被埋入墙壁或地面。相比RPG Maker MV,它的判定也脆弱得多。即使只是缓慢地将物体推到墙边,被推入的物体也会穿透墙壁。朝墙壁飞去的敌人对象在下落时也会卡住,无法掉落。
因此,我想如果能用一个带有较大碰撞判定的子对象作为缓冲,是否可行?但似乎还是不可能吗?
当父对象被埋入时,逃脱的方法非常有限。特别是对于非操作角色的物体,控制起来非常困难。
如果有什么不容易被埋入墙壁的设置或替代方案,希望能告知我。谢谢。
Baz
2
在子对象的 ChildSettings 中,你是否尝试过使用“附近”跟随类型选项?
PIero 您好,
动作游戏制作器的墙壁判定非常脆弱,当物体靠近墙壁或高速碰撞时,很容易被嵌入墙壁或地面中。
与 ACTK MV 相比,其稳定性也差很多。即使只是缓慢地将物体推到墙边,被推的物体也会轻易穿透墙壁。
向墙壁飞去的敌人对象在下落时也会卡住,无法掉落。
我认为首先需要解决的是上述问题,因此想向您确认一下。
ACTION GAME MAKER 的墙壁判定系统直接使用了 Godot Engine 非常可靠的碰撞系统,通常情况下不应出现您所提到的这些现象。
我们推测可能存在某些我们未注意到的问题,或者您在使用 ACTK MV 时,可能通过直接偏移 position 等方式,使用了绕过 Godot 墙壁判定系统的方法。
如果您方便的话,是否可以分享出现问题的项目文件?
PIero
4
谢谢您的回复。我设置的是始终跟随父母的模式,但当瓷砖接触不到的子对象被其他对象推到墙上时,就会被卡住。通过更改设置,我认为问题已经解决了。谢谢您。
PIero
5
感谢您的回复。
目前,我的游戏结构是:敌人对象作为父对象,仅与瓦片发生交互,而子对象则仅与玩家发生接触判定。当玩家被多个敌人挤压在墙边时,会出现穿透的情况。目前我通过在墙边放置一个具有较大碰撞判定的物体来暂时解决这个问题。
另外,这可能应该另开一个线程讨论,但有时在某些情况下,原本设置为禁用(disabled)的攻击碰撞(Attack Collision)会意外地被开启,导致在本应没有攻击判定的动画中出现攻击判定。在调试的碰撞检测中不会显示,而且其他非攻击动画中也已将disabled设置为开启,但一旦这种情况发生,只要玩家向敌人靠近就会持续造成伤害。在我的项目中,当角色受到伤害时这种情况经常出现。可能我遗漏了某些设置,但也有可能是bug,因此如果能对此进行简单确认,我将不胜感激。
另外,攻击命中敌人后会发射一个击中标记(hit mark)作为子弹,但这个过程非常耗性能。当多个敌人同时发射击中标记时,我的电脑会卡顿近一秒。我知道动作游戏制作工具在单帧内同时生成多个对象方面存在困难,但目前这严重限制了可制作游戏的范围,因此如果将来能对此进行优化,我将非常感激。
项目数据应如何发送给您呢?
感谢您的报告。
GUILD 具有发送私信的功能,请点击我的头像,通过“发送消息”功能发送给我。
由于项目文件可能较大,麻烦您使用如 GigaFile 便等文件共享服务发送给我。
感谢您提供的项目数据!
在进行调查时,我想确认一下:将敌人的墙壁判定分为父对象和子对象两种类型,其意图是什么?我认为单独使用父对象的墙壁判定可能无法实现某些功能,因此才采取了这种划分方式。请不吝赐教。
PIero
8
通常情况下,玩家和敌人的子对象的碰撞检测会相互接触,但在冲刺穿过或敌人下落等情况下,我们不希望它们接触,因此仅在这些时刻让子对象的碰撞检测消失。(目前仍在开发初期,部分设置尚未完成。)
敌人的父对象的碰撞检测仅与瓷砖发生接触。当父对象的HP降为0时,子对象也会随之消失。
相反,如果将碰撞检测赋予玩家侧的子对象,穿墙的频率会大幅减少,但由于无法在每个敌人个体上独立控制碰撞检测的有无,导致制作的灵活性受限。
如果能够通过变量等方式切换碰撞层遮罩,或许无需使用子对象也能在一定程度上解决问题,但目前尚不清楚是否可行,因此现阶段仍采用当前方法。
首先,关于嵌入的问题,很可能是碰撞层/遮罩设置不当导致的。
在Godot的碰撞系统中,除非一方是静止的,否则通常建议将层/遮罩设置为双向碰撞。
在您的项目中,设置如下:
- 瓦片:层 1,2,3,9,12,遮罩 9
- 敌人(主体):无层,遮罩 3
- 敌人(子对象):层 1,9,12,遮罩 9,12
- 玩家:层 1,遮罩 9
敌人嵌入墙壁的问题:敌人→瓦片之间,遮罩3与层3会发生碰撞;但瓦片→敌人时,由于敌人没有设置层,因此不会发生接触。因此,瓦片无法对敌人施加反推力,导致敌人“穿透”墙壁。
玩家被夹在敌人中间时嵌入的问题,可能与子对象化设置及上述设置有关。敌人主体无法“看到”玩家,因此不会与玩家发生碰撞,试图穿透玩家;但敌人的子对象会与玩家发生碰撞,于是试图跟随穿透的敌人主体而对玩家施加推力。然而,瓦片仅设置了遮罩9,无法产生反推力。最终结果是,玩家为了摆脱与子对象的嵌入而被推挤,最终嵌入墙壁。
解决方案建议:请将“敌人主体”与“瓦片”、“玩家”与“瓦片”之间的层/遮罩设置为可相互碰撞。
另外,
Attack Collision 的 disabled 开启后反而关闭,或在本不应有攻击判定的动画中却出现了攻击判定
经检查,发现 InvincibleSettings 中“无敌时将碰撞判定改为攻击判定”属性被开启,这可能是导致问题的原因。
这个默认值设为开启是不合适的,我会向开发团队报告,建议将其默认值改为关闭。
感谢您的配合。
PIero
10
谢谢您的回复。
关于无敌状态中的攻击判定,我已经理解了,非常感谢您的指导。
关于墙壁判定的问题,我希望能将敌方对象彼此始终设置为不接触,因此我做了如下设置,但结果并没有改变:
- 瓦片:图层1、2、3,遮罩1、2、3
- 敌人(主体):图层2,遮罩3
- 敌人(子对象):图层1,遮罩1
- 玩家:图层1,遮罩1
我的设置是否有问题?
或者,当子对象(跟随在不同图层的父对象上)被压到图层时,是否应该认为它会被“填满”?
或者,当子对象层被不同层的父对象追随时,是否应该认为它会被“压入”其中?
我还没有详细查看具体的实现,但大概率应该认为它会被“压入”。
因为“不分离并追随之类的实现”,通常会每帧将子对象传送到主体的位置。
在这种情况下,通常接触只会导致互相推开,但推开的瞬间,子对象会再次传送到被“压入”的位置,这样一来,玩家又会被再次推开,最终导致玩家单方面持续被推开。
如果像下面这样,通过遮罩(mask)设置,让玩家与敌人(子对象)不发生接触,避免被子对象推挤,问题就可以解决。
- 瓦片:层1,遮罩1、2、3
- 敌人(主体):层3,遮罩1
- 敌人(子对象):层3,遮罩2
- 玩家:层2,遮罩1
不过,如果希望实现“玩家被敌人推开”的效果,可能需要放弃使用子对象,而直接实现墙壁碰撞判定。
通过将碰撞判定分给父对象和子对象,可以实现不同的效果。如果您能说明一下具体想实现什么,或许我可以提供更具体的建议。
PIero
12
抱歉,我尝试了一下,如果我没有理解错的话,按照这个设置,玩家和敌人完全不会接触,所以添加子对象就没有意义了。
正如我之前提到的,敌人和玩家之间基本是有接触判定的,但在冲刺等特定动作期间,希望可以不接触而穿过(此时仅让敌人的子对象暂时无视墙壁)。即使在穿过期间,敌人与地砖的接触判定也应始终存在。
也就是说,我希望准备两种墙壁判定:
并分别设置它们的有无时机。
因为这是近身格斗动作,如果没有接触判定,像大幅前冲的攻击或连击就会直接穿过敌人。如果直接取消主体的墙壁判定,可能会出现穿过地砖或掉落出屏幕的危险。
这不是普通的跳跃动作,而是类似格斗游戏的系统。
有人可能会问:为什么要做这么奇怪的系统?直接跳过去不就好了?或者用远程攻击不就行了?但只能说是,我想做这样的游戏。
如果不使用子对象,是否可以在一个对象上设置两种不同的墙壁判定,并分别设置图层和遮罩?有没有这样的方法?如果不行,我打算目前在玩家侧添加墙壁,当被地砖包围时,就自动传送到固定位置来应对。
抱歉说了这么多。
原来如此,您的目的是“只在玩家执行特定动作时让敌人穿过玩家”。如果是这样的话,可以在该动作执行期间,通过“更改属性”或“对象属性”来指定自身的GameObject节点,临时修改CollisionMask,使其暂时不与除瓦片外的其他对象发生碰撞,这样可行吗?
正常情况下:
- 瓦片:层1,掩码1、2、3、4
- 玩家:层2、4,掩码1、3
- 敌人:层3,掩码1、2
在穿过时:
这样应该可以实现敌人之间不碰撞,玩家与敌人平时可以接触,但在穿过时不会发生碰撞,对吗?
可以看出制作得非常细致,顺利解决真是太好了!
ACTION GAME MAKER 虽然在功能上比 RPG Maker MV 更多,但操作方式差异较大,相关信息也较少,因此如果遇到困难,建议可以到这个 RPG MAKER GUILD 或 DISCORD 等地方多多请教。
1 个赞