如果一个物体被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是否可见即可。

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

unity, 判断可见性的更多相关文章

  1. Unity判断用户联网状态,WiFi/移动网络/无网络

    Unity判断用户联网状态 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...

  2. Unity判断网络是否连接以及判断是否连接WiFi

    由于项目中的核心模块需要用到网络连接,所以需要首先检测用户是否有网络百度了下,有人说通过连接自己的服务器进行测试的,也有人说通过延迟来判断的最后发现原来Unity是提供了网络判断的方法的.Networ ...

  3. unity 判断平台(安卓,iOS还是编辑器)

    两种方式 --------------- C预处理器编译判断 --------------- #if UNITY_IOS // ... iOS项目才会编译 #elif UNITY_ANDROID // ...

  4. Unity判断网络连接类型

    使用NetworkReachability判断手机游戏当前的网络连接类型,是wifi还是234G using UnityEngine; using System.Collections; public ...

  5. Unity判断鼠标是否在UI(UGUI)上

    "EventSystem.current.IsPointerOverGameObject()" UI和3D场景同时都需要响应触摸事件,如果同时响应可能就会出现触摸UI的时候影响到了 ...

  6. Unity 判断Animatior是否播放完

    public Animator animator; void Start() { animator = this.GetComponent<Animator>(); } void Upda ...

  7. unity 判断是安卓还是IOS平台

    功能概述 储值功能,点击一个按钮(mSprites["Recharge"]),实现储值功能,在IOS平台上,该按钮下的功能全部隐藏,在安卓平台上正常显示按钮,实现相应功能 #if ...

  8. unity 判断物体是否在视角内(巧妙!)

    public var isRendering:boolean=false; private var lastTime:float=0; private var curtTime:float=0; fu ...

  9. unity GPU bound or CPU bound

    unity判断GPU CPUbound android 用unity profiler 里面的cpu时间 xcode有直接的显示

随机推荐

  1. 8VC Venture Cup 2016 - Final Round (Div. 2 Edition) D. Factory Repairs 树状数组

    D. Factory Repairs 题目连接: http://www.codeforces.com/contest/635/problem/D Description A factory produ ...

  2. Eclipse错误导致无法启动The workspace exited with unsaved changes in the previous session

    MyOpenSUSE:/home/jin/workspace # tail -f .metadata/.log !SESSION 2014-05-04 11:35:58.869 ----------- ...

  3. appium+python自动化50-生成定位对象模板templet(jinja2)

    前言 每次自己写pageobject定位元素对象太繁琐,格式都差不多,只是换个定位方法,这种就可以才有模板的方式,批量生成pageobject定位元素对象的模板 python里面生成模板有两个模块可以 ...

  4. VUE -- 如何快速的写出一个Vue的icon组件?

    伴随着Vue的诞生,它似乎就被人寄予厚望,不仅仅是因为其轻量级的MVVM设计方式,而且其实现了组件化开发模式,所以越来越多的人会拿Vue和AngularJS.React Native做比较.具体关于它 ...

  5. Swift之单例模式

    三种Swift实现单例模式的方法:全局变量,内部变量,dispatch_once方式 1. 全局变量 private let _singleton = Singleton() class Single ...

  6. Node & Cheerio & WebStorm 学习实验

    准备用cheerio去抓一些网页看看. 可以参考的材料有: http://www.cnblogs.com/CraryPrimitiveMan/p/3674421.html http://cnodejs ...

  7. css Table布局:基于display:table的CSS布局

    两种类型的表格布局 你有两种方式使用表格布局 -HTML Table(<table>标签)和CSS Table(display:table 等相关属性). HTML Table是指使用原生 ...

  8. oracle 解锁表的一个小问题

    最近开发的时候遇到一个小问题,执行一段sql之后发现 表被锁了 显示错误为:ora-00054:resource busy and acquire with nowait specified 百度之后 ...

  9. 职场二年级转型C++的困惑

    [来信] 老师.你好.看了你的博客和採訪.不由主自地给你发私信,感觉你能解答我的问题. 学生90后,2012年毕业于某不知名院校.两年工作经验(第一年C#,第二年java,直到如今),一直想转型C++ ...

  10. npm技巧

    你看一个同事正在编码,其中应用上了一些简写和技巧,不知为何,你不熟悉它并且你的大脑一片混乱,这种场景发生在过去我们每个人身上. 在这篇短文中,我们将会介绍一些非常实用的 npm 技巧.有很多文章中的技 ...