美文网首页Unity 3D 学习笔记unityUnity技术分享
Unity3D 如何判断一个3D世界游戏对象消失在屏幕中

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

作者: 雨落随风 | 来源:发表于2017-08-29 00:34 被阅读102次

    在本文,笔者将教你如何判断一个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("可见");
        }
    }
    

    演示动画:

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

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

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

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

    3. 总结:

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

    相关文章

      网友评论

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

      本文链接:https://www.haomeiwen.com/subject/afmndxtx.html