U3D sorting layer, sort order, order in layer, layer深入辨析

1,layer是对游戏中所有物体的分类别划分,如UIlayer, waterlayer, 3DModelLayer, smallAssetsLayer, effectLayer等。将不同类的物体划分到不同的层,便于相机拣选,在相机的cullmask中可以选择渲染哪些层,不选择的层则不会渲染。还可以用于射线检测对象的拣选,可以指定只对某些层的对象进行射线检测。

2,canvas默认是屏幕空间的2D对象,在屏幕空间时仅具有sort order属性,当把它设置为世界空间时,sort order属性消失了,变成另外两个属性: sorting layer, order in layer。

当把画布设置为worldspace后,画布及画布上的UI对象在世界空间默认也是靠Z值来决定渲染顺序的,离相机远的先渲染。当设置了sorting layer后,渲染的次序就由sorting layer来确定了。sorting layer是自定义的标识符,哪个sortinglayer在前(在layer & tags中设置的先后顺序)哪个先渲染。

order in layer是个数值,是在同一个sorting layer内的细分,sorting layer相同时order in layer的数值越小越先渲染。

屏幕空间的东西都处于UI层不需要sorting layer,只提供sort order(其实也就是order in layer)。 默认情况下sort oder都是0,此时UI物件按照在hierachy中出现的顺序决定渲染顺序。如果sort order不同时,值越小越先渲染。

3,特别注意sprite默认是个3D空间的物体,就算把它放到一个屏幕空间的canvas上,它仍然是3D空间的物体,只遵循3D空间的规则:总是会被UI挡住。

 4,同时具有sorting layer, order in layer的对象:sprite, 世界空间的canvas,说明这两种GO是可以相互遮挡的。

比如挂在世界空间画布上的角色名字和用sprite实现的遮罩,通过调整sorting layer及order in layer就可以实现两者之间的先后

仅具有sort order的对象:屏幕空间的canvas

只具有sorting layer的对象:不存在

只具有order in layer 的对象:不存在

没有sorting order这个东西!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这段代码的优化空间还是比较大的,以下是我给出的一些建议: 1. 使用 with 语句打开文件,这样可以确保文件被正确关闭,同时可以减少代码行数。示例: ``` with open(filename, 'r') as file_object: lines = file_object.readlines() ``` 2. 在循环中避免多次计算相同的值,可以将这些值计算出来后存储在变量中。示例: ``` idx_layer_ratio = [idx_layer/num_layers for idx_layer in range(1,num_layers+1)] num_cu_float_list = [pow(idx, idx_gradient)*num_atom_a_layer for idx in idx_layer_ratio] ``` 3. 可以使用列表推导式代替循环,可以使代码更加简洁高效。示例: ``` num_random = [i for idx_layer in range(num_layers) for i in random.sample(range(idx_layer*num_atom_a_layer, (idx_layer+1)*num_atom_a_layer), int(num_cu_float_list[idx_layer]))] num_random.sort() ``` 4. 对于字符串的操作可以使用 f-string 或者 format 函数,可以使代码更加简洁易读。示例: ``` strT = f"{strT[:14]}2{strT[15:]}" ``` 综上所述,优化后的代码如下所示: ``` import random filename = 'supercu.lmp' with open(filename, 'r') as file_object: lines = file_object.readlines() num_layers = 150 num_atom_a_layer = 20000 idx_gradient = 0.1 idx_layer_ratio = [idx_layer/num_layers for idx_layer in range(1,num_layers+1)] num_cu_float_list = [pow(idx, idx_gradient)*num_atom_a_layer for idx in idx_layer_ratio] num_random = [i for idx_layer in range(num_layers) for i in random.sample(range(idx_layer*num_atom_a_layer, (idx_layer+1)*num_atom_a_layer), int(num_cu_float_list[idx_layer]))] num_random.sort() for index in range(len(lines)): strT = lines[index] strL = strT.split() if int(strL[0]) in num_random: strT = f"{strT[:14]}2{strT[15:]}" lines[index] = strT with open(filename, 'w') as file_object: file_object.write("".join(lines)) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值