博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
unity3d camera.culling mask
阅读量:7028 次
发布时间:2019-06-28

本文共 1608 字,大约阅读时间需要 5 分钟。

原地址:http://www.cnblogs.com/88999660/archive/2013/03/14/2959439.html

官方文档对CullingMask的注释只是说了通过位移运算符,可以添加选中层。 假设要摄像机只显示第10层,11层,12层。写成:

camera.cullingMask = 1<<10 + 1<<11 + 1<<12;

但是为什么要这样觉得很奇怪。于是研究了一下。

通过print发现,随便一个层,它前面所有层的和,不会大于它自身的值。 这样的话,可以只用一个int变量保存多个类似布尔型的数据,节省内存。
然后我写了一个读取CullingMask值的函数。智商拙技。如果用二进制去做更快 传入值是CullingMask的值,输出的int数组是同时选中了哪几个层。
[2012/12/10补充]      最近又发现2个LayerMask的”隐藏方法“,帮助文档里应该没有: public static extern string LayerToName (int layer); public static extern int NameToLayer (string layerName); 可以在层名和层序号之间互相转换,都是静态方法直接用类名调用。 


例子下载:  (5 K) 下载次数:17 

当cullingMask为Nothing时,值是0。 当cullingMask设置为everything时,值是-1。这时如果有层要关闭,就减去这个层的值。 比如第8层的值是 256。那关闭第8层后的值是 -257[-1-(1<<9)] 因为设置everything时的数值比较特别,和算法没关系。所以代码我就不做修改了。如果要使用负数可以自己转换一下。

public int[] calcMask(int val){  int[] result = null;    int flag1 = 0;  int flag2 = 0;  List
tmpLayers = new List
(); List
resultLayers = new List
(); for(int i=1; i<=val; i*=2) { tmpLayers.Add(i); }//把val和首个层之间的层添加入数组.数组元素从小到大顺序 tmpLayers.Add(tmpLayers[tmpLayers.Count-1]*2); //使用递归计算选中的层 recursiveCalcMask(val, tmpLayers, ref resultLayers); for(int i=0; i< resultLayers.Count; i++) { resultLayers[i] = (int)Mathf.Log(resultLayers[i], 2); //用Mathf.Log以2为底数。去求图层编号。 } result = new int[resultLayers.Count]; resultLayers.CopyTo(result); return result;}public void recursiveCalcMask(int val, List
arr, ref List
outArr){ for(int i= 0; i
val) { recursiveCalcMask(val - arr[i], arr, ref outArr); outArr.Add(arr[i]); } }}

 

你可能感兴趣的文章
硬盘的读写原理
查看>>
实例 centos自动挂载、备份windows共享文件夹,并删除第7日前当天的备份
查看>>
LNMP下动静分离部署phpmyadmin软件包
查看>>
如何写更好的自动化测试用例
查看>>
60再谈指针
查看>>
repost
查看>>
android异步加载AsyncTask
查看>>
GCC Stack-Smashing Protector
查看>>
虚拟机Visualbox安装Ubuntu Server
查看>>
用带余除法可以解决一切部分分式的题目
查看>>
vs 生成事件
查看>>
jmeter 实战项目总结2——微信端
查看>>
php.ini 中文版
查看>>
即时通信客户端流程,
查看>>
布隆过滤器redis缓存
查看>>
01-数据仓库之数据建模
查看>>
Nginx 安装
查看>>
hidesBottomBarWhenPushed 设置为NO的问题
查看>>
cisco常用命令详解
查看>>
谁在追踪谁?
查看>>