NGUI 镜像拼接

1 篇文章 0 订阅
1 篇文章 0 订阅

增加一个偏移值,避免像素采样采到边缘处产生一条黑线
在这里插入图片描述
在这里插入图片描述
修改后:
在这里插入图片描述

镜像拼接:
using UnityEngine;
using System.Collections.Generic;

public abstract class UIBasicSprite : UIWidget
{
public enum Type
{
Simple,
Sliced,
Tiled,
Filled,
MirroredSimple,
MirroredSliced,
MirroredCrossSimple,
Advanced,
}

protected void Fill (List verts, List uvs, List cols, Rect outer, Rect inner)
{
mOuterUV = outer;
mInnerUV = inner;
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.MirroredSimple:
SimpleMirroredFill(verts, uvs, cols);
break;

case Type.MirroredSliced:
SlicedMirrorFill(verts, uvs, cols);
break;

case Type.MirroredCrossSimple:
SimpleCrossMirrorFill(verts, uvs, cols);
break;

case Type.Advanced:
AdvancedFill(verts, uvs, cols);
break;
}
}

// 拉伸左右镜像的填充方法实现
void SimpleMirroredFill(List verts, List uvs, List cols)
{
Vector4 v = drawingDimensions;
Vector4 u = drawingUVs;
Color co = drawingColor;
verts.Add(new Vector3(v.x, v.y));
verts.Add(new Vector3(v.x, v.w));
verts.Add(new Vector3((v.x + v.z) / 2, v.w));
verts.Add(new Vector3((v.x + v.z) / 2, v.y));
uvs.Add(new Vector2(u.x, u.y));
uvs.Add(new Vector2(u.x, u.w));
uvs.Add(new Vector2(u.z, u.w));
uvs.Add(new Vector2(u.z, u.y));
cols.Add(co);
cols.Add(co);
cols.Add(co);
cols.Add(co);
verts.Add(new Vector3((v.x + v.z) / 2, v.y));
verts.Add(new Vector3((v.x + v.z) / 2, v.w));
verts.Add(new Vector3(v.z, v.w));
verts.Add(new Vector3(v.z, v.y));
uvs.Add(new Vector2(u.z, u.y));
uvs.Add(new Vector2(u.z, u.w));
uvs.Add(new Vector2(u.x, u.w));

uvs.Add(new Vector2(u.x, u.y));
cols.Add(co);
cols.Add(co);
cols.Add(co);
cols.Add(co);
}

//九宫左右镜像的填充方法实现
void SlicedMirrorFill(List verts, List uvs, List cols)
{
Vector4 br = border * pixelSize;
if (br.x == 0f && br.y == 0f && br.z == 0f && br.w == 0f)
{
SimpleMirroredFill(verts, uvs, cols);
return;
}
Vector4 v = drawingDimensions;
Vector4 u = drawingUVs;
Color co = drawingColor;
Vector4 Half_Left_v = new Vector4(v.x, v.y, (v.x + v.z) / 2, v.w);//this is the left half of the region
Vector4 Half_Right_v = new Vector4((v.x + v.z) / 2, v.y, v.z, v.w);//this is the right half of the region
mTempPos[0].x = Half_Left_v.x;
mTempPos[0].y = Half_Left_v.y;
mTempPos[3].x = Half_Left_v.z;
mTempPos[3].y = Half_Left_v.w;
mTempPos[1].x = mTempPos[0].x + br.x;
mTempPos[2].x = mTempPos[3].x - br.z;
mTempUVs[0].x = mOuterUV.xMin;
mTempUVs[1].x = mInnerUV.xMin;
mTempUVs[2].x = mInnerUV.xMax;
mTempUVs[3].x = mOuterUV.xMax;

mTempPos[1].y = mTempPos[0].y + br.y;
mTempPos[2].y = mTempPos[3].y - br.w;
mTempUVs[0].y = mOuterUV.yMin;
mTempUVs[1].y = mInnerUV.yMin;
mTempUVs[2].y = mInnerUV.yMax;
mTempUVs[3].y = mOuterUV.yMax;

//上色流程
for (int x = 0; x < 3; ++x)
{
int x2 = x + 1;
for (int y = 0; y < 3; ++y)
{
if (centerType == AdvancedType.Invisible && x == 1 && y == 1) continue;
int y2 = y + 1;
verts.Add(new Vector3(mTempPos[x].x, mTempPos[y].y));
verts.Add(new Vector3(mTempPos[x].x, mTempPos[y2].y));
verts.Add(new Vector3(mTempPos[x2].x, mTempPos[y2].y));
verts.Add(new Vector3(mTempPos[x2].x, mTempPos[y].y));
uvs.Add(new Vector2(mTempUVs[x].x, mTempUVs[y].y));
uvs.Add(new Vector2(mTempUVs[x].x, mTempUVs[y2].y));
uvs.Add(new Vector2(mTempUVs[x2].x, mTempUVs[y2].y));
uvs.Add(new Vector2(mTempUVs[x2].x, mTempUVs[y].y));
cols.Add(co);
cols.Add(co);
cols.Add(co);
cols.Add(co);
}
}

mTempPos[0].x = Half_Right_v.x;
mTempPos[0].y = Half_Right_v.y;
mTempPos[3].x = Half_Right_v.z;
mTempPos[3].y = Half_Right_v.w;
//右侧水平翻转判断,因为右侧为左侧镜像,所以翻转处理正好相反

mTempPos[1].x = mTempPos[0].x + br.z;
mTempPos[2].x = mTempPos[3].x - br.x;
mTempUVs[3].x = mOuterUV.xMin;
mTempUVs[2].x = mInnerUV.xMin;
mTempUVs[1].x = mInnerUV.xMax;
mTempUVs[0].x = mOuterUV.xMax;

mTempPos[1].y = mTempPos[0].y + br.y;
mTempPos[2].y = mTempPos[3].y - br.w;
mTempUVs[0].y = mOuterUV.yMin;
mTempUVs[1].y = mInnerUV.yMin;
mTempUVs[2].y = mInnerUV.yMax;
mTempUVs[3].y = mOuterUV.yMax;

//上色流程
for (int x = 0; x < 3; ++x)
{
int x2 = x + 1;
for (int y = 0; y < 3; ++y)
{
if (centerType == AdvancedType.Invisible && x == 1 && y == 1) continue;
int y2 = y + 1;
verts.Add(new Vector3(mTempPos[x].x, mTempPos[y].y));
verts.Add(new Vector3(mTempPos[x].x, mTempPos[y2].y));
verts.Add(new Vector3(mTempPos[x2].x, mTempPos[y2].y));
verts.Add(new Vector3(mTempPos[x2].x, mTempPos[y].y));
uvs.Add(new Vector2(mTempUVs[x].x, mTempUVs[y].y));
uvs.Add(new Vector2(mTempUVs[x].x, mTempUVs[y2].y));
uvs.Add(new Vector2(mTempUVs[x2].x, mTempUVs[y2].y));
uvs.Add(new Vector2(mTempUVs[x2].x, mTempUVs[y].y));
cols.Add(co);
cols.Add(co);
cols.Add(co);
cols.Add(co);
}
}
}

//拉伸十字镜像的填充方法实现
void SimpleCrossMirrorFill(List verts, List uvs, List cols)
{
Vector4 v = drawingDimensions;
Vector4 u = drawingUVs;
Color co = drawingColor;
//drawingDimensions is divided into four areas
Vector4 upper_Left_v = new Vector4(v.x, (v.w + v.y) / 2, (v.x + v.z) / 2, v.w);//this is the upper left of the drawingDimensions
Vector4 lower_Left_v = new Vector4(v.x, v.y, (v.x + v.z) / 2, (v.w + v.y) / 2);//this is the lower left of the drawingDimensions
Vector4 upper_Right_v = new Vector4((v.x + v.z) / 2, (v.w + v.y) / 2, v.z, v.w);//this is the upper right of the drawingDimensions
Vector4 lower_Right_v = new Vector4((v.x + v.z) / 2, v.y, v.z, (v.w + v.y) / 2);//this is the lower right of the drawingDimensions

//左上图形,图片左下对应左下,左上对应左上,右上对应右上,右下对应右下
verts.Add(new Vector3(upper_Left_v.x, upper_Left_v.y));//左下
verts.Add(new Vector3(upper_Left_v.x, upper_Left_v.w));//左上
verts.Add(new Vector3(upper_Left_v.z, upper_Left_v.w));//右上
verts.Add(new Vector3(upper_Left_v.z, upper_Left_v.y));//右下
uvs.Add(new Vector2(u.x, u.y));//图片的左下角
uvs.Add(new Vector2(u.x, u.w));//图片的左上角
uvs.Add(new Vector2(u.z, u.w));//图片的右上角
uvs.Add(new Vector2(u.z, u.y));//图片的右下角
//uvs.add与verts.add中点的加入顺序构成区域顶点和图像顶点的一一对应关系
cols.Add(co);
cols.Add(co);
cols.Add(co);
cols.Add(co);
//左下角的图形,图片左下对应左上,左上对应左下,右下对应右上,右上对应右下
verts.Add(new Vector3(lower_Left_v.x, lower_Left_v.w));//左上
verts.Add(new Vector3(lower_Left_v.x, lower_Left_v.y));//左下
verts.Add(new Vector3(lower_Left_v.z, lower_Left_v.y));//右下
verts.Add(new Vector3(lower_Left_v.z, lower_Left_v.w));//右上
uvs.Add(new Vector2(u.x, u.y));//图片的左下角
uvs.Add(new Vector2(u.x, u.w));//图片的左上角
uvs.Add(new Vector2(u.z, u.w));//图片的右上角
uvs.Add(new Vector2(u.z, u.y));//图片的右下角
cols.Add(co);
cols.Add(co);
cols.Add(co);
cols.Add(co);
//右上角的图形,图片左下对应右下,左上对应右上,右下对应左下,右上对应左上
verts.Add(new Vector3(upper_Right_v.z, upper_Right_v.y));//右下
verts.Add(new Vector3(upper_Right_v.z, upper_Right_v.w));//右上
verts.Add(new Vector3(upper_Right_v.x, upper_Right_v.w));//左上
verts.Add(new Vector3(upper_Right_v.x, upper_Right_v.y));//左下
uvs.Add(new Vector2(u.x, u.y));//图片的左下角
uvs.Add(new Vector2(u.x, u.w));//图片的左上角
uvs.Add(new Vector2(u.z, u.w));//图片的右上角
uvs.Add(new Vector2(u.z, u.y));//图片的右下角

cols.Add(co);
cols.Add(co);
cols.Add(co);
cols.Add(co);
//右下角的图形,左下对应右上,左上对应右下,右上对应左下,右下对应左上
verts.Add(new Vector3(lower_Right_v.z, lower_Right_v.w));//右上
verts.Add(new Vector3(lower_Right_v.z, lower_Right_v.y));//右下
verts.Add(new Vector3(lower_Right_v.x, lower_Right_v.y));//左下
verts.Add(new Vector3(lower_Right_v.x, lower_Right_v.w));//左上
uvs.Add(new Vector2(u.x, u.y));//图片的左下角
uvs.Add(new Vector2(u.x, u.w));//图片的左上角
uvs.Add(new Vector2(u.z, u.w));//图片的右上角
uvs.Add(new Vector2(u.z, u.y));//图片的右下角

cols.Add(co);
cols.Add(co);
cols.Add(co);
cols.Add(co);

}

效果图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值