NGUI-Sprite擴展鏡像功能

當我們工程裏有許多對稱的圖的時候,可以利用鏡像來實現同樣的效果顯示。並且減少了圖集的大小佔用。一方面減少了資源佔用,另一方面運行內存也會降低一些。

在UIBasicSprite.cs 腳本中添加我們的代碼:

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;
		}
	}

擴展後就可以實現鏡像效果了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章