方法一:使用unity系统函数 OnBecameVisible 和 OnBecameInVisible
//物体在屏幕内
void OnBecameVisible()
{
Debug.Log(gameObject.name +"出现");
}
//物体在屏幕外
void OnBecameInvisible()
{
Debug.Log(gameObject.name+"消失");
}
注意:物体只要有一部分在屏幕内OnBecameVisible都会执行,只有物体完全在屏幕外才会执行OnBecameInvisible.
方法二:使用GeometryUtility.CalculateFrustumPlanes,但物体必须有边界或带边界的碰撞检测
//Bounds 是物体的边界 使用renderer.bounds或使用带colider获取
//Camera 是场景的主摄像机
public bool IsVisibleFrom(Bounds bounds, Camera camera)
{
try
{
//获取到摄像机视锥的几个面
Plane[] planes = GeometryUtility.CalculateFrustumPlanes(camera);
//检查视锥面和物体边界是否相交
return GeometryUtility.TestPlanesAABB(planes, bounds);
}