多个对象的随时间损坏(90FPS/VR 问题)
Damage Over Time on Multiple Objects (90FPS/VR Problems)
我不是在寻找填鸭式的解决方案,而是在寻找一些见解,因为我已经尝试了许多不同的方案来获得良好的性能。
我有一个场景,我想随着时间的推移从对撞机(射弹)对 X 数量的敌人(僵尸)造成伤害。
当前问题设置
目前,我的 Projectile 附有一个脚本,它将 StartCoroutine
onTriggerEnter
随着时间的推移减少僵尸的生命。这非常有效,直到你想同时伤害超过 15 个左右的僵尸。
我认为这是来自所有 StartCoroutine 中发生的一些魔法。这是我在 OnTriggerEnter
.
上调用的协程
IEnumerator DoDOT(float damageDuration, int damageCount, float damageAmount)
{
damagingOverTime = true;
int currentCount = 0;
while (currentCount < damageCount)
{
zombieHealth -= damageAmount;
yield return new WaitForSeconds(damageDuration);
currentCount++;
}
damagingOverTime = false;
}
可能的解决方案
现在我已经完成了一个简单的测试(僵尸数量增加一倍),我将随时间推移损坏机制硬编码到僵尸更新函数中。当然,当我开始场景时,每个僵尸都开始随着时间的推移受到伤害,但没有性能问题。
我想我可以在我的 Zombie 游戏对象 "watching" 中更新一个 Damage Over Time 标记,然后我的 Projectile 可以激活该标记 OnTriggerEnter
。随着时间的推移,僵尸更新将开始施加伤害。有更多经验的人可以告诉我这是否是正确的方法,如果不是,那是什么?
提前感谢您的宝贵时间。
编辑:性能目标 90 FPS 而不是 60FPS. 我当前为 DOT 启动协程的过程实际上可以正常工作理论在 60FPS 环境中,因为在它可能导致帧丢失之前你有更多的处理空间。但是当你瞄准 90FPS 时,同一个协程无法处理它,因为我们不再有额外的处理空间。我试图找出为什么我的可能解决方案在 90FPS 环境中提供更有效的结果,或者在 90FPS 环境中提供更有效结果的可能解决方案是什么。
PS - 这不是真正的另一个僵尸射击游戏,这些术语只是示例 :D
这里需要进行一些调试。
你可以做一些事情,比如计算这个函数被调用的次数,以确保它没有被调用太多次。
您可以尝试做的另一件事是将其移至射弹本身的更新方法并保留被该射弹击中的所有敌人的列表(只需将它们添加到 OnTriggerEnter 的列表中)。
因此,不是在后台使用许多协程 运行,而是在一个简单的循环中处理所有事情,循环遍历所有被它击中的敌人。
P.s在手机上写这篇文章如有错误请见谅
我不是在寻找填鸭式的解决方案,而是在寻找一些见解,因为我已经尝试了许多不同的方案来获得良好的性能。
我有一个场景,我想随着时间的推移从对撞机(射弹)对 X 数量的敌人(僵尸)造成伤害。
当前问题设置
目前,我的 Projectile 附有一个脚本,它将 StartCoroutine
onTriggerEnter
随着时间的推移减少僵尸的生命。这非常有效,直到你想同时伤害超过 15 个左右的僵尸。
我认为这是来自所有 StartCoroutine 中发生的一些魔法。这是我在 OnTriggerEnter
.
IEnumerator DoDOT(float damageDuration, int damageCount, float damageAmount)
{
damagingOverTime = true;
int currentCount = 0;
while (currentCount < damageCount)
{
zombieHealth -= damageAmount;
yield return new WaitForSeconds(damageDuration);
currentCount++;
}
damagingOverTime = false;
}
可能的解决方案
现在我已经完成了一个简单的测试(僵尸数量增加一倍),我将随时间推移损坏机制硬编码到僵尸更新函数中。当然,当我开始场景时,每个僵尸都开始随着时间的推移受到伤害,但没有性能问题。
我想我可以在我的 Zombie 游戏对象 "watching" 中更新一个 Damage Over Time 标记,然后我的 Projectile 可以激活该标记 OnTriggerEnter
。随着时间的推移,僵尸更新将开始施加伤害。有更多经验的人可以告诉我这是否是正确的方法,如果不是,那是什么?
提前感谢您的宝贵时间。
编辑:性能目标 90 FPS 而不是 60FPS. 我当前为 DOT 启动协程的过程实际上可以正常工作理论在 60FPS 环境中,因为在它可能导致帧丢失之前你有更多的处理空间。但是当你瞄准 90FPS 时,同一个协程无法处理它,因为我们不再有额外的处理空间。我试图找出为什么我的可能解决方案在 90FPS 环境中提供更有效的结果,或者在 90FPS 环境中提供更有效结果的可能解决方案是什么。
PS - 这不是真正的另一个僵尸射击游戏,这些术语只是示例 :D
这里需要进行一些调试。 你可以做一些事情,比如计算这个函数被调用的次数,以确保它没有被调用太多次。
您可以尝试做的另一件事是将其移至射弹本身的更新方法并保留被该射弹击中的所有敌人的列表(只需将它们添加到 OnTriggerEnter 的列表中)。 因此,不是在后台使用许多协程 运行,而是在一个简单的循环中处理所有事情,循环遍历所有被它击中的敌人。
P.s在手机上写这篇文章如有错误请见谅