在本文,笔者将教你如何判断一个3D世界游戏对象在屏幕中的可见性判断(2套方案)
1. 方案一
动画演示:
关键代码:
using UnityEngine;
public class testcamera : MonoBehaviour
{
public GameObject ball;
void Update()
{
if (IsVisible(ball.GetComponent<Renderer>().bounds, Camera.main))
{
Debug.Log("可见");
}
else
{
Debug.Log("不可见");
}
}
public bool IsVisible(Bounds bounds, Camera camera)
{
// 得到摄像机的六个面
Plane[] planes = GeometryUtility.CalculateFrustumPlanes(camera);
// 判断边框bound是否在六个面内
return GeometryUtility.TestPlanesAABB(planes, bounds);
}
}
下面代码仅供移动小球
using UnityEngine;
public class moveball : MonoBehaviour {
private void OnMouseDrag()
{
Vector3 v3 = Input.mousePosition;
v3.z = 4;
transform.position = Camera.main.ScreenToWorldPoint(v3);
}
}
2. 方案二
实现原理:
演示代码:
using UnityEngine;
public class TestInvisable : MonoBehaviour {
private void OnBecameInvisible()
{
Debug.Log("不可见");
}
private void OnBecameVisible()
{
Debug.Log("可见");
}
}
演示动画:
测试小结:
这两个事件真的是搞事情啊,很诡异,从演示来看:
- 游戏对象Enable和Disable ,分别输出可见和不可见;
- 在屏幕内,及时被其他物体遮挡,依旧输出可见;
- 在屏幕内,不管有没被遮挡,停止播放时输出不可见;
- 在屏幕内,仅存该游戏对象时,Scene视角和Game视角共同均不可见时输出不可见,反之亦然;
- 在屏幕内,如果存在其他可能接受其阴影的游戏对象(譬如地面)时,其Y轴将变成很大的值才被认为不可见(动画演示中,在出现Cube后,请密切关注transform组件Position.Y数值变化)
友情提示:这个小结呢,请亲们结合动画体会哈。
3. 总结:
- 记得哈,就算是游戏对象不可见,他身上挂载的逻辑依旧会执行(想想这些输出语句是怎么出来的) ;
- 学习笔记,一切从简。