这篇博客源自我在泰课在线的回答。链接: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。