在项目中有一个需求,就是判断一个物体是否在某个摄像机渲染的范围内,其实这个需求在很多场景中都会用到,也在网上搜索了下相关的实现方式,最终有一个比较不错的方案,所以想写篇博客记录一下。
还是照例先说实现的原理,在MonoBehaviour中有一个内置的函数OnWillRenderObject,这个函数的作用是在物体将要渲染之前由Unity引擎调用,而且他不只会调用一次,而是每次都会调用。那么我们可以记录下开始渲染的时间,然后在用一个变量记录上次渲染时的时间,然后通过对比当前渲染的时间和之前记录下的渲染时间,如果两次的时间不一致,那么说明物体在被渲染,如果一致,说明没有在渲染。下面我们可以看下实际的实现代码。
public MeshRenderer mesh;
public bool isRender = false;
private float lastTime;
private float currentTime;
void Awake ()
{
mesh = GetComponentInChildren <MeshRenderer> ();
}
void Start ()
{
}
void Update ()
{
if (currentTime != 0) {
isRender = currentTime != lastTime ? true : false;
lastTime = currentTime;
if (isRender) {
Logger.DebugLog ("在摄像机范围内");
} else {
Logger.DebugLog ("在摄像机范围外");
}
}
}
void OnWillRenderObject ()
{
//是需要渲染的摄像机
if (Camera.current.name == Camera.main.name) {
currentTime = Time.time;
}
}
初始状态isRender为false 意思是当前物体没有被渲染,如果isRender为true则物体在渲染。测试时,我们可以创建一个立方体然后挂载这个脚本。然后运行后拖拽立方体分别在摄像机内和摄像机外就可以看到控制台打印的Log。