Mask组件是比较常用的组件之一 可以使用Mask去限制渲染3D的RawImage的形状 官网的下面有Mask的实现原理,有点像shader里面的部分 Mask的主要作用是根据提供的图片对Mask所挂物体的子物体进行像素的遮挡
ShowMaskGraphic 如果有提供图片,则如果子物体部分与图片的有像素部分有些地方没重叠的话,这个没重叠的地方会显示提供图片
有些博客说Mask可以用于3D物体 ,这个还没亲自尝试 Mask一般和Image组件挂在同一个物体上 由image提供图片 如果没有提供图片 则mask会只显示它所挂物体的边界Rect部分与子物体的重叠部分 提供的图片有像素的部分与子物体的图片的重合部分会显示图形 透明的部分以及有像素但是与子图片不重合即空余部分会不显示图形 Mask可以提供任意形状的遮罩,比如三角形圆形五角星形,只要提供给他的图片正确并且子图片的重合部分正确 如果发现提供图片的透明部分对于子物体还是有遮挡 则这张图片的一这部分透明部分不是全透明,需要美工再做处理
但是,Mask有一些缺点
- 会生成额外的drawcall
比如一张图本来是一个drawcall的 Mask使用后Mask显示的部分生成一个DrawCall 因为Mask隐藏的一部分会生成一个Drawcall Unity有个机制是在同一个图集里面的所有使用的图片合批成一个drawcall,但是在这基础上 每次使用mask都会生成一个额外的drawcall,就是说如果我使用了六个mask,则会由7个drawcall,除了六个是mask生成的外,还有一个是合批后的
- 对提供的图片像素要求高 因mask对提供图片的每个像素显示部分都会进行渲染,所以提供的图片有一些小点之类的,只要范围够大,都能看出来,这就要求提供的图片需要裁切处理比较到位
- 会有锯齿感 如果Mask用于限制小图标那还好,限制大图的话锯齿感明显
对于这些缺点unity本身也给出了一些替代方案,
- Unity提供了RectMask2D来提供矩形的2D显示限制,这个组件不会增加额外drawcall,在一些情况下可以代替Mask,但是有时这个组件会出BUG 自己编写mask UGUI进阶知识[二]自定义多边形image image精确点击以及 不继承monobehaviour的类如何在inspector显示自定义变量的编辑器知识