c# - Unity 中的碰撞器问题(近战 RPG)
问题描述
我正在 Unity 中制作游戏,并且在设置检测近战碰撞的方法方面遇到了很多麻烦。在研究了其他人提出的每一个关于这个问题的建议后,似乎没有一个有效,而且应该很容易实现的东西被证明是非常困难的。主要问题是冲突不会一直注册。
我正在使用该OnTriggerEnter
方法进行碰撞检测,但这始终无法检测到所有碰撞。连同我尝试过的所有其他方法,包括使用碰撞检测的每种组合进行物理碰撞。
然后我将其更改为OnTriggerStay
方法,它检测到 100% 或接近 100% 的碰撞,尽管我对解决方法不满意,因为我看不出 OnTriggerEnter 不起作用的逻辑原因。
然而,这两种方法都存在另一个问题。也就是说,在同一次武器攻击期间,经常会多次触发碰撞。因此,如果我向敌人挥动剑,它会在同一挥动中触发两次,并对敌人造成两次伤害。
我的碰撞代码是
private void OnTriggerStay(Collider other)
{
if (canDamage == true)
{
float damage = wielder.GetComponent<BaseStats>().GetStat(Stat.Damage);
other.gameObject.GetComponent<Health>().TakeDamage(wielder, damage);
}
}
任何人都可以提出一种方法来添加到此代码中,以便接受第一次碰撞,但随后任何进一步的碰撞(在武器的特定摆动期间)都不会。
另外,请记住,在这个游戏中,单次武器挥动有可能击中多个敌人。所以它需要允许击中敌人 1,然后阻止敌人 1 受到进一步的伤害,但仍然允许敌人 2 或敌人 3 等在与他们接触时受到伤害的可能性。
或者,对于一般碰撞系统的任何反馈以及更好的替代方案的建议将不胜感激:)
解决方案
我建议如下:
确保你的对撞机尺寸不是很小。Unity 物理引擎不适用于小型对撞机。如有必要,最好扩大一切。玩它。
collisionDetectionMode
将刚体的更改为 以CollisionDetectionMode.ContinuousDynamic
用于快速移动的物体(例如您的剑),以及其他需要碰撞的物体(例如您的敌人),请将其设置为CollisionDetectionMode.Continuous
。如果这不起作用,请尝试不同的组合。它可能会影响性能。你可以在这里阅读更多关于它的信息。为了解决多次击中的问题,我只需创建一个在攻击期间进入我的剑触发器的游戏对象列表,在我伤害敌人之前,我会检查它是否已经在该列表中。如果它在名单上,不要受到伤害。如果没有受到伤害并将其添加到列表中。每次再次开始攻击或攻击结束时清除列表。
推荐阅读
- python - 如何调整误差线的水平线?
- firebase - 如何在颤动中禁用firebase日志?
- php - 在 PHP 中用星号屏蔽敏感字符的函数
- javascript - 如何使用 puppeteer 截取 RGBA 屏幕截图?
- c# - 在 Renci SSH.NET 中启动自定义 SSH 子系统(相当于 ch.ethz ssh2.Session.StartSubSystem())
- r - 如何在R中按汉字分组
- javascript - 根据按下的键更改图像的位置?
- sql - NOT IN 上的 SQL 查询性能增强
- java - sendKeys 不适用于带有 SLIDER 的输入文本框,但它适用于 CLEAR 输入字段(selenium java)
- session - 烧瓶会话不保存价值/跨请求持续存在