如果一个物体被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. HDU 4665 Unshuffle (2013多校6 1011 )

    Unshuffle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  2. 基于tiny4412的Linux内核移植(支持device tree)(一)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  3. 关于Java设计模式的一些概况

    设计模式(Design pattern)在软件行业一直都扮演着很重要的角色.最近感觉自己对设计模式的知识有些遗忘了,虽然以前也看了很多,但是坦白说,其实并没有怎么理解.基本还是为了应付面试.然后,在工 ...

  4. 一步一步学RenderMonkey(5)--渲染到纹理(RTT) 【转】

    转载请注明出处:  http://blog.csdn.net/tianhai110 渲染到纹理: 新建一个空effect; 添加渲染目标纹理, Add Texture-> Add Render ...

  5. Vuex内容解析和vue cli项目中使用状态管理模式Vuex

    中文文档:vuex官方中文网站 一.vuex里面都有些什么内容? const store = new Vuex.Store({ state: { name: 'weish', age: }, gett ...

  6. Windows最常用的8个网络CMD命令总结

    一,ping 它是用来检查网络是否通畅或者网络连接速度的命令.作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:网络上的机器都有唯一确定的IP ...

  7. 开发 nodejs REST 个人感想

    本来想拿 nodejs 做个 ip 查询小应用的,做的时候想着把基础弄好再做应用,没想到做着做着就变成 spring 了 可能太多数人觉得不知道怎么用,以后我会写详细点使用教程 个人感觉自己做出来的东 ...

  8. needtrue需要真实的答案

    现在从底层做起来,相当的不容易啊,无论是哪个行业,每个人都需要付出很多的努力.但是现在人们的心是浮躁的,都想一下得到自己想要的东西,钱也好,车也好,房子也好,女人也好.最近很喜欢两句话,这里写下来与大 ...

  9. JVM类加载机制详解(一)JVM类加载过程

    http://blog.csdn.net/zhangliangzi/article/details/51319033 http://chenzhou123520.iteye.com/blog/1597 ...

  10. C# 和 Java的区别积累

    1.类的继承 A.C#用 ":"符号: B.Java用关键字 extends: 2.接口的实现 A.C#用 ":"符号: B.Java用关键字 implemen ...