Unity3D 如何判断一个3D世界游戏对象消失在屏幕中

在本文,笔者将教你如何判断一个3D世界游戏对象在屏幕中的可见性判断(2套方案)

1. 方案一

动画演示:

关键代码:

using UnityEngine;
public class testcamera : MonoBehaviour
{
    public GameObject ball;
    void Update()
    {
        if (IsVisible(ball.GetComponent().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("可见");
    }
}

演示动画:

科学观看需结合笔者小结哦

测试小结:
这两个事件真的是搞事情啊,很诡异,从演示来看:

  1. 游戏对象Enable和Disable ,分别输出可见和不可见;
  2. 在屏幕内,及时被其他物体遮挡,依旧输出可见;
  3. 在屏幕内,不管有没被遮挡,停止播放时输出不可见;
  4. 在屏幕内,仅存该游戏对象时,Scene视角和Game视角共同均不可见时输出不可见,反之亦然;
  5. 在屏幕内,如果存在其他可能接受其阴影的游戏对象(譬如地面)时,其Y轴将变成很大的值才被认为不可见(动画演示中,在出现Cube后,请密切关注transform组件Position.Y数值变化)

友情提示:这个小结呢,请亲们结合动画体会哈。

3. 总结:

  1. 记得哈,就算是游戏对象不可见,他身上挂载的逻辑依旧会执行(想想这些输出语句是怎么出来的) ;
  2. 学习笔记,一切从简。

你可能感兴趣的:(Unity3D 如何判断一个3D世界游戏对象消失在屏幕中)