当前位置:   article > 正文

Unity优化之OnTriggerStay方案替换_unity ontriggerstay性能

unity ontriggerstay性能

介绍:

OnTriggerEnter: 当有其他Collider进入当前对象的触发器时触发。它只会在进入瞬间被调用一次。
OnTriggerStay: 当其他Collider在当前对象的触发器内停留时触发。在每一帧都会被调用,只要其他Collider在触发器内停留。
OnTriggerExit: 当其他Collider离开当前对象的触发器时触发。它只会在离开瞬间被调用一次。

游戏开发中会经常用到OnTriggerStay方法,比如一些特殊区域,玩家进入就会进入特殊状态,比如持续扣血。但是OnTriggerStay是属于碰撞检测类的API,走的是物理检测,当使用数量情况比较大的时候,还是会消耗不小的性能。我会介绍另一张方案去替换OnTriggerStay

举例,我们有一个Enemy的脚本,Enemy提供一个扣血的方法

  1. public class Enemy : MonoBehaviour
  2. {
  3. private float curBlood;
  4. public void DeclineBlood(float value)
  5. {
  6. curBlood -= value;
  7. }
  8. }

常规实现:特殊区域脚本如果用OnTriggerStay方法实现

  1. public class SpecialArea : MonoBehaviour
  2. {
  3. private void OnTriggerStay(Collider other)
  4. {
  5. if (other.GetComponent<Enemy>() != null)
  6. {
  7. other.GetComponent<Enemy>().DeclineBlood(2);
  8. }
  9. }
  10. }

缺点:物理性能消耗高,且每次物理帧只能对一个物体进行操作,如果要改检测时间间隔,通俗的说是扣血密度,要在Edit - Project Setting - Time,里面进行设置

另一种实现:使用OnTriggerEnter +OnTriggerExit+List+Update实现

  1. public class SpecialArea : MonoBehaviour
  2. {
  3. private List<Enemy> allEnemys=new List<Enemy>();
  4. private void OnTriggerEnter(Collider other)
  5. {
  6. if (other.GetComponent<Enemy>() != null &&
  7. !allEnemys.Contains(other.GetComponent<Enemy>()))
  8. {
  9. allEnemys.Add(other.GetComponent<Enemy>());
  10. }
  11. }
  12. private void OnTriggerExit(Collider other)
  13. {
  14. if (other.GetComponent<Enemy>() != null &&
  15. allEnemys.Contains(other.GetComponent<Enemy>()))
  16. {
  17. allEnemys.Remove(other.GetComponent<Enemy>());
  18. }
  19. }
  20. private float declineInterval=0.2f;//时间切片
  21. private float curTime = 0;
  22. private void Update()
  23. {
  24. curTime += Time.deltaTime;
  25. if (curTime >= declineInterval)
  26. {
  27. curTime = 0;
  28. for (int i = 0; i < allEnemys.Count; i++)
  29. {
  30. allEnemys[i].DeclineBlood(2);
  31. }
  32. }
  33. }
  34. }

用空间换时间的思想,虽然代码量提上去了,但是减少了物理判定的性能损耗以及更加灵活了,我可以修改declineInterval去修改检测时间的间隔。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/94695
推荐阅读
相关标签
  

闽ICP备14008679号