NGUI-Sprite扩展镜像功能

当我们工程里有许多对称的图的时候,可以利用镜像来实现同样的效果显示。并且减少了图集的大小占用。一方面减少了资源占用,另一方面运行内存也会降低一些。

在UIBasicSprite.cs 脚本中添加我们的代码:

<span style="white-space:pre">	</span>public enum Type
	{
		Simple,
		Sliced,
		Tiled,
		Filled,
		Advanced,
		Mirrored,
	}

调用方法:

protected void Fill (BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> 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.Advanced:
			AdvancedFill(verts, uvs, cols);
			break;

			case Type.Mirrored:
			MirroredFill(verts, uvs, cols);
			break;
		}
	}

具体实现代码:

void MirroredFill (BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> cols)
	{
		Texture tex = mainTexture;
		if (tex == null) return;

		Vector2 size = new Vector2(mInnerUV.width * tex.width, mInnerUV.height * tex.height);
		size *= pixelSize;
		if (tex == null || size.x < 2f || size.y < 2f) return;

		Color32 c = drawingColor;
		Vector4 v = drawingDimensions;
		Vector4 u=new Vector4(mInnerUV.xMin,mInnerUV.yMin,mInnerUV.xMax,mInnerUV.yMax);

		float x0 = v.x;
		float y0 = v.y;

		float u0 = u.x;
		float v0 = u.y;
		bool yb = true;
		while (y0 < v.w)
		{
			x0 = v.x;
			float y1 = y0 + size.y;
			float v1 = u.w;

			if (y1 > v.w)
			{
				v1 = Mathf.Lerp(u.y, u.w, (v.w - y0) / size.y);
				y1 = v.w;
			}
			bool b=true;
			while (x0 < v.z)
			{
				float x1 = x0 + size.x;
				float u1 = u.z;

				if (x1 > v.z)
				{
					u1 = Mathf.Lerp(u.x, u.z, (v.z - x0) / size.x);
					x1 = v.z;
				}
				float offset=0.3f;
				verts.Add(new Vector3(x0-offset, y0-offset));
				verts.Add(new Vector3(x0-offset, y1+offset));
				verts.Add(new Vector3(x1+offset, y1+offset));
				verts.Add(new Vector3(x1+offset, y0-offset));

				float yoffset = size.y != 1 ? 0.001f : 0.0f;
				float xoffset = size.x != 1 ? 0.001f : 0.0f;
				if(yb)
				{
					if(b)
					{
						uvs.Add(new Vector2(u0-xoffset, v0));
						uvs.Add(new Vector2(u0-xoffset, v1+yoffset));
						uvs.Add(new Vector2(u1, v1+yoffset));
						uvs.Add(new Vector2(u1, v0));
					}
					else
					{
						uvs.Add(new Vector2(u1, v0));
						uvs.Add(new Vector2(u1, v1+yoffset));
						uvs.Add(new Vector2(u0-xoffset, v1+yoffset));
						uvs.Add(new Vector2(u0-xoffset, v0));
					}
				}
				else
				{
					if(b)
					{
						uvs.Add(new Vector2(u0-xoffset, v1+yoffset));
						uvs.Add(new Vector2(u0-xoffset, v0));
						uvs.Add(new Vector2(u1, v0));
						uvs.Add(new Vector2(u1, v1+yoffset));
					}
					else
					{
						uvs.Add(new Vector2(u1, v1+yoffset));
						uvs.Add(new Vector2(u1, v0));
						uvs.Add(new Vector2(u0-xoffset, v0));
						uvs.Add(new Vector2(u0-xoffset, v1+yoffset));
					}
				}

				cols.Add(c);
				cols.Add(c);
				cols.Add(c);
				cols.Add(c);

				x0 += size.x;
				b=!b;
			}
			yb=!yb;
			y0 += size.y;
		}
	}

扩张后就可以实现镜像效果了。

时间: 2024-08-30 14:43:46

NGUI-Sprite扩展镜像功能的相关文章

使用Oracle 11g分区自动扩展的功能的一个小问题

Oracle 11g下使用分区自动扩展的功能,非常方便,不过同时也带来一个问题,就是导出.导入之后,建表语句改了,下面来做个实验: SQL> select * from v$version; BANNER ------------------------------------------------------------------------------ Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Pr

BrnShop开源网上商城第六讲:扩展视图功能

在正式讲解扩展视图功能以前,我们有必要把视图的工作原理简单说明下.任何一个视图都会被翻译成一个c#类,并保存到指定的位置,然后被编译.这也就是为什么能在视图中包含c#代码片段的原因.下面我们通过一个项目具体的了解一下这个过程,首先我们新建一个mvc3项目,它的Index.cshtml视图文件的代码如下: 1 2 3 4 5 6 7 8 @{     ViewBag.Title = "主页"; } <h2>@ViewBag.Message</h2> <p&g

Unity3D使用NGUI实现简单背包功能

前话 在许多类型游戏中我们经常会使用到背包,利用背包来设置相应角色属性,多了背包也会让游戏增色拓展不少. 那在Unity3D游戏开发中该如何编写背包系统呢?因为有高人开发了NGUI插件,因此我们进行简单编写代码设置即可实现一个简单的背包功能了. 准备工作 新建一个工程PackageDemo 导入NGUI包(最新版3.9.8版的正版89刀) 准备好图片素材,使用NGUI将其打包成图集 背包 背包格子 物品 简单背包功能实现 第一步,添加NGUI控件,使用素材 项目目录以及场景列表如下: 要注意的是

玩转 Nginx 之:使用 Lua 扩展 Nginx 功能

1.Nginx 简介 Nginx 作为一款面向性能设计的HTTP服务器,相较于Apache.lighttpd具有占有内存少,稳定性高等优势.其流行度越来越高,应用也越来越广泛,常见的应用有:网页服务器.反向代理服务器以及电子邮件(IMAP/POP3)代理服务器,高并发大流量站点常用来做接入层的负载均衡,还有非常常见的用法是作为日志采集服务器等. Nginx 整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活.其中模块化设计是nginx的一大卖点,甚至http服务器核心功能也是一个模块.要

NGUI Sprite的各种Type(Simple、Sliced、Tiled、Filed、Advanced)

官方文档:http://www.tasharen.com/forum/index.php?topic=6704.0 下面是UISprite的Type截图,每一种Type都有不同的用途,在实际的项目中我们根据实际需求选择Type. 每一种Type的解释及适用场景: Simple:标准的Sprite,自适应大小 Sliced:九宫格切片,创建固定边框控件的最佳选择.边框固定,图片中间做拉伸(缩放),如角色头像,按钮背景 Tiled:平铺,一个Sprite缩放填充整个区域,如背景平铺 Filed:每个

apache的扩展配置功能说明

apache包含<virtualhost> <directory>等主配置模块. <VirtualHost *:80> ServerName xxx; DocumentRoot /var/www/html; access-log  /xxxx/xxx/xxx-log; error-log    /xxx/xxx/xxx-log; #以上配置参数后面的内容可以任意,只要存在 https的访问方式:安装 mod_ssl   防火墙开通443端口. 7版本开通防火墙:fire

给Mac系统浏览器扩展翻译功能

Google Chrome可以即时翻译网页.可是,如果你用惯了Safari,不想安装Google Chrome,又需要对外文网页即时翻译,那么,请看下面: 前提:先打开Safari,点击"显示-显示个人收藏栏"(或者直接按快捷键??B),地址栏下出现"个人收藏栏". 方法一: 1.按快捷键?D,先把任意一个网页添加到"个人收藏栏"中. 2.右键点击"个人收藏栏"中刚添加的网页链接按钮,点击"编辑地址": 3

OpenVswitch mirror 镜像功能

1 # 从int-br-eth1进入的包镜像一份给dummy0 2 # 现象:dummy0 可以抓到 int-br-eth1 进入的包 3 4 modprobe dummy 5 ip link set up dummy0 6 ovs-vsctl add-port br-int dummy0 7 8 ovs-vsctl -- [email protected] get port int-br-eth1 9 -- --id=@bbb get port dummy0 10 -- [email prot

100行代码完成github镜像功能

话说github应该是可以被访问的吧? 但这几天我这里时不时就抽风似的访问不了, 赶紧上网搜索看有无github的镜像网站, 居然没有搜到. 好吧,自己动手好了! 打开熟悉的VS code, 使用node js + request package 很快就完成了预期目标, 测试工作正常, 这里就献丑分享给大家来. 目前已经×××器部署了一份, 访问地址为 https://github.trs.ai, 当然,在有的浏览器会收到安全警告,提醒说这是一个仿冒网站,我们仿冒的是的确gihub嘛, 因此可忽