zoukankan      html  css  js  c++  java
  • 可见性判断

    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是否可见即可。

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

  • 相关阅读:
    mongodb 条件查询
    node 创建静态web服务器(下)(处理异步获取数据的两种方式)
    node 创建静态web服务器(上)
    node.js 从文件流中读写数据及管道流
    node.js 中的 fs (文件)模块
    vue-router 嵌套路由
    (转载)js调用打印机 打印整体或部分
    web react面试题
    vue 面试题
    vue 父页面中含子页面滑动,滑动结束,底部组件进行滑动
  • 原文地址:https://www.cnblogs.com/llstart-new0201/p/12992201.html
Copyright © 2011-2022 走看看