可见性判断
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是否可见即可。
缺点是:这个判断是有一小点儿开销的,如果物体成百上千可能会导致可察觉的开销。
原文地址:https://www.cnblogs.com/llstart-new0201/p/12992201.html
- 平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。
- python接口自动化4-绕过验证码登录(cookie)
- 洛谷P1313 计算系数【快速幂+dp】
- python接口自动化5-Json数据处理
- Numpy教程第1部分 - 阵列简介(常用基础操作总结)
- Session和Cookies的基本原理
- 浅析Numpy.genfromtxt及File I/O讲解
- 损失函数详解
- 排查Java的内存问题
- 使用两种方法让 ASP.NET Core 实现遵循 HATEOAS 结构的 RESTful API
- 设计模式六大原则(5):迪米特法则
- Selenium2+python自动化61-Chrome浏览器(chromedriver)
- 区块链可以减少社会不平等吗?
- 【干货】不止准确率:为分类任务选择正确的机器学习度量指标(附代码实现)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- TCB系列学习文章——云开发登录篇(九)
- 字符串操作的全面总结
- C 语言 C++ 中 assert 的用法
- kubernetes之StatefulSet控制器
- 如何使用 S3CMD 访问 COS 服务
- 利用STS临时密钥服务快速搭建直传页面的实践
- codeforces 1436C(二分+数学)
- WAF案例:为什么curl可以wget不行?
- React进阶(4)-拆分Redux-将store,Reducer,action,actionTypes独立管理
- React进阶(5)-分离容器组件,UI组件(无状态组件)
- React进阶(6)-react-redux的使用
- Kubernetes 1.19.0——服务svc(2)
- Android菜单的定义及ActionBar的实现
- 3分钟短文:Laravel表单验证的“指挥中心”:FormRequest
- 10 种跨域解决方案(附终极方案)