Unity问答——怎么知道屏幕中目前有多少个敌人?

时间:2023-03-10 05:28:02
Unity问答——怎么知道屏幕中目前有多少个敌人?

这篇博客源自我在泰课在线的回答。链接:http://www.taikr.com/group/1/thread/92

问:怎么知道屏幕中目前有多少个敌人?

答:

思路一:仅适用于2D游戏,因为这个方法没有考虑Z轴。如果物体被其它物体遮挡,没有被摄像机渲染,不应该算是显示在 屏幕中。

如何遍历每个敌人的屏幕坐标,判断是否位于屏幕内?

(1)如何得到游戏对象的屏幕坐标?

Vector3 screenPos = Camera.main.WorldToScreenPoint(this.transform.position);

  (2)如何遍历敌人?

  方法一:给敌人都加个Tag——Enemy,根据Tag查找。

  GameObject[] gos = GameObject.FindGameObjectsWithTag("Enemy");

  遍历gos, 根据(1),计算敌人的屏幕坐标,如果在屏幕内(跟Screen.width和Screen.height对比),累加,得到总数。

  或者在敌人所挂脚本每帧运行的时候,判断敌人是否在屏幕内,如果不在,就Destroy掉。这样就避免了在得到敌人数组时在进行遍历判断。

  方法二:弄个敌人对象的集合,生成时就加到集合里,销毁时就从集合里Remove掉。方法类似方法一。

  思路二:适用于2D游戏和3D游戏

  MonoBehaviour.OnBecameVisible() 变得不可见
  MonoBehaviour.OnBecameInvisible() 当不可见
  MonoBehaviour.OnWillRenderObject() 将要渲染

  MonoBehaviour提供的这三个方法,都可以用来判断。

  具体做法:在OnBecameVisible或者OnWillRenderObject中,根据Tag判断游戏对象是否是敌人,如果是, 则enemyNum++;在OnBecameInvisible中enemyNum--。若想知道是哪些敌人,就弄个集合,在OnBecameVisible或者OnWillRenderObject中Add, 在OnBecameInvisible中Remove。