• 可见性判断


    1.前言

    游戏物体可见性判断有多种方法,比如OnBecameVisible。但是上述方法有一个问题,就是只有移动游戏物体时才会生效,移动cameran则不会生效。所以不得使用其他方法,本文转载此文

    2.方法

    如果一个物体被unity判定为”退一万步讲也一定不可见“,则unity不会去渲染它,但是如果我们给此物体添加了逻辑,这个逻辑仍然会被执行。

    因此,假如这个逻辑是巨耗性能的逻辑,比如说”mesh的每个顶点都按sin(t)波动“之类,那么我们需要手动根据可见性去优化这个逻辑,比如不可见就停了它,或者不可见时运行一个此逻辑的极简版等。

    所以需要能获得物体的可见性。

    方法1:

    MeshRender.isVisible;

    如果MeshRender.isVisible==true,说明unity认为这个mesh”退一万步讲也一定不可见“。

    这个方法的好处是没有一点儿额外开销,因为在unity运行场景管理算法的时候这些东西都已经得到了,而且一般来讲最多也就是对数复杂度。

    这个方法的局限性是如果gameObject没有MeshRender这个组件,例如是一个巨复杂的模型的根节点,那么这个方法没法直接用,只能把每个带MeshRender的子孙节点都遍历一遍。

    方法2:

    bool I_Can_See(GameObject Object) {
    
      Plane[] planes = GeometryUtility.CalculateFrustumPlanes(Camera); 
        if (GeometryUtility.TestPlanesAABB(planes , Object.collider.bounds))
        return true;
      else
        return false;
    }
    

    参考: http://answers.unity3d.com/questions/8003/how-can-i-know-if-a-gameobject-is-seen-by-a-partic.html

    这个方法好处是

    1,不依赖于是否存在MeshRender组件。

    2,可以自建包围盒,增加了灵活性,甚至可以故意造一个错误的包围盒来用(比如比模型实际范围大一倍或者小一倍)。比如在复杂模型的根节点上建一个名为boundingBox的切点,为它添加一个boxCollider,调节这个boxCollider让它包围整个模型。

    3,不用遍历子孙节点,直接用视截体planes去判断这个collider.bounds是否可见即可。

    缺点是:这个判断是有一小点儿开销的,如果物体成百上千可能会导致可察觉的开销。

  • 相关阅读:
    线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
    C#打印图片
    javascript 地址栏写法
    SQLServer获取Excel中所有Sheet
    C#多页打印实现
    clear在CSS中的妙用
    mitmproxy使用总结
    本地回路抓包问题
    博客园界面优化
    CentOS基于MySQL提供的Yum repository安装MySQL5.6
  • 原文地址:https://www.cnblogs.com/llstart-new0201/p/12992201.html
Copyright © 2020-2023  润新知