最近这段时间在公司负责开发新手指引功能,要实现一个铺满屏幕的黑底中只露出一个可操作的圆形的显示效果,考虑到这个圆形可能出现在屏幕的任何位置,如果想确保铺满屏幕的话需要使用的图片将会很大,为了实现这么一个显示效果使用这么大的图集资源显然是不可取的。所以我们开始使用的是一张有圆形空洞的矩形图片加上四张拉伸放大的黑色图片拼接出这个效果,但是当打包到手机平台时图片间的边缘会出现很明显的缝隙,显然不是我们想要的效果,这时我想到了NGUI的UISprite自带的九宫格切割效果,决定尝试可以修改UISprite来实现我称之为“反向九宫格”的效果。(PS:由于公司项目选用的是NGUI 2.7.0的老版本所以本次实现也是基于这个版本。但是我想思路是共通的。希望可以帮助到有需要的人。)
说干就干,首先在UISprite里的Type枚举添加一个新类型ReverseSliced,并修改OnFill函数和border,在border的get方法中添加了一个ReverseSliced的条件
public enum Type
{
Simple,
Sliced,
Tiled,
Filled,
ReverseSliced,
}
public override void OnFill (BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> cols)
{
switch (type)
{
case Type.Simple:
SimpleFill(verts, uvs, cols);
break;
case Type.Sliced:
SlicedFill(verts, uvs, cols);
break;
case Type.Filled:
FilledFill(verts, uvs, cols);
break;
case Type.Tiled:
TiledFill(verts, uvs, cols);
break;
case Type.ReverseSliced:
ReverseSlicedFill(verts, uvs, cols);
break;
}
/// <summary>
/// Sliced sprites generally have a border.
/// </summary>
public override Vector4 border
{
get
{
if (type == Type.Sliced || type == Type.ReverseSliced)
{
UIAtlas.Sprite sp = GetAtlasSprite();
if (sp == null) return Vector2.zero;
Rect outer = sp.outer;
Rect inner = sp.inner;
Texture tex = mainTexture;
if (atlas.coor