• unity3d camera.culling mask


    官方文档对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); 可以在层名和层序号之间互相转换,都是静态方法直接用类名调用。 


    例子下载:  CalcLayer_D.unitypackage (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<int> tmpLayers = new List<int>();
      List<int> resultLayers = new List<int>();
      
      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<int> arr, ref List<int> outArr)
    {
      for(int i= 0; i<arr.Count; i++)
      {
       if(arr[i] == val)
       {
        outArr.Add(val);
        break;
       }
       else if(arr[i] < val && arr[i+1] > val)
       {
        recursiveCalcMask(val - arr[i], arr, ref outArr);
        outArr.Add(arr[i]);
       }
      }
    }
  • 相关阅读:
    org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [0, 1, param1, param2]
    在Springboot中Parameter 'XXX' not found. Available parameters are [1, 0, param1, param2]问题
    Springcould学习总结
    XXl-job基于springbooot的基本配置
    Nginx反向代理简单配置
    redis哨兵机制及配置
    redis的主从复制
    jedis在Java环境操作redis
    liunx环境redis的安装
    express之cookie和session
  • 原文地址:https://www.cnblogs.com/88999660/p/2959439.html
Copyright © 2020-2023  润新知