unity 怎么判断物体是否在摄像机视野中

我请分析下,unity 怎么判断物体是否在摄像机视野中
最新回答
阳光是我啃园的

2024-10-15 07:36:25

有NPC在屏幕中跑动,在跑出屏幕外后会被删掉。
现在问题是,如何判断NPC不在摄像机视野中。
网上搜了一下,最多的一个回答是“unity 事件中 有相关的事件 可参考”,但是看不懂。
另有人说投影到屏幕坐标,这个没有试过。一会去试试不在视野中和在视野中的投影有什么区别。
谁能告诉我一种比较简单的方法来进行判断(比如unity中一个函数搞定O(∩_∩)O~)
谢谢了!

【补充】:
将楼下方法挂在NPC上,可以检测得到,但是经过测试,在NPC出屏且移动一定距离后可以检测得到。
我自己试了一种方法,用NPC映射到屏幕坐标来判断(和屏幕的宽和高比较)
camera.WorldToScreenPoint(enemy.transform.position)
Screen.width
Screen.height

如果映射后的坐标不在屏幕内,则出屏了O(∩_∩)O~

偶尔看到这个方法,但是还没试,先粘到这里。
判断物体是否在视野内的方法。其实实现很简单,一个API方法而已。这个方法就是OnWillRenderObject(),在Unity3D文档描述中,当游戏对象对摄像机来说是可见的话,这个方法就会被调用。
我们来测试这个方法的功能。首先新建一个场景,在场景中放入一个方块和一个球体,还有加入光源,便于观察,我使用的是Unity3D5.0beta版本,在新建场景时会团默认创建光源,其他版本要自己加入。接下来,给球体加入刚体组件。运行场景,我们会发现球体会受重力影响掉下去,方块还在原位。
新建一脚本,如下所示:
using UnityEngine;

public class DetectVision:MonoBehaviour{

//传入方块的引用,用作标识
public GameObject cube;
//标识球体是否在摄像机视野内
public bool isRendering=true;

private float lastTime=0;
private float curtTime=0;

void Update()
{
//对比时间记录,如果不等,说明还在摄像机视野中。
isRendering = curtTime != lastTime ? true : false;
if (isRendering)
{
//在视野中,方块为红色
cube.GetComponent().material.color = Color.red;
}
else {
//不在视野中,方块变为白色
cube.GetComponent().material.color = Color.white;

}

//将当前时间传入上一帧时间记录中
lastTime = curtTime;
}

//如果对象可见,调用此方法
void OnWillRenderObject()
{
//将当前帧开始时间记录
curtTime = Time.time;
}
}
将脚本拖到球体上,并将方块对象拖到脚本上。运行程序,我们发现,刚开始方块是红色的。

当球体掉出视野后,方块变成了白色,效果图如下: