NGUI 는 TexturePacker 에서 Transform 회전 버 전 없 이 회전 하 는 Sprite 내 보 내기 지원

7383 단어
... 에 있다 ulua & tolua 기술 교류 군 ① 중 군 호 341746602, 한 대신 이 NGUI 앨범 이 회전 sprite 를 지원 하도록 하 는 기술 게시 물 을 분석 했다.
전송 문:http://www.maosongliang.com/archives/324?bsh_bid=1506423853
최근 며칠 동안 심혈 을 기울 여 연구 한 결과 매우 아 픈 문 제 를 발견 하 였 다.첫 번 째 sprite 는 회전 이 좋 은 것 이 아니 라 큰 신 이 자동 으로 회전 하 는 코드 를 썼 지만 회전 후의 Sprite 가 회전 노드 의 하위 노드 를 만 났 을 때 여러 가지 문제 가 발생 했다.앵 커 를 만 나 스스로 적응 할 때 도 여러 가지 일 을 한다.
그래서 transform 기반 이 아니 라 영역 을 그 리 는 선택 을 바탕 으로 해결 방안 을 생각 합 니 다.
c \ # 코드 를 붙 입 니 다.
설정 부분 읽 기
UISpriteData.cs
    // [Modify] by maosongliang, begin
    public bool rotated = false;
    // [Modify] by maosongliang, end

NGUIJson.cs
	static void LoadSpriteData (UIAtlas atlas, Hashtable decodedHash)
	{
		if (decodedHash == null || atlas == null) return;
		List oldSprites = atlas.spriteList;
		atlas.spriteList = new List();

		Hashtable frames = (Hashtable)decodedHash["frames"];

		foreach (System.Collections.DictionaryEntry item in frames)
		{
			UISpriteData newSprite = new UISpriteData();
			newSprite.name = item.Key.ToString();

			bool exists = false;

			// Check to see if this sprite exists
			foreach (UISpriteData oldSprite in oldSprites)
			{
				if (oldSprite.name.Equals(newSprite.name, StringComparison.OrdinalIgnoreCase))
				{
					exists = true;
					break;
				}
			}

			// Get rid of the extension if the sprite doesn't exist
			// The extension is kept for backwards compatibility so it's still possible to update older atlases.
			if (!exists)
			{
				newSprite.name = newSprite.name.Replace(".png", "");
				newSprite.name = newSprite.name.Replace(".tga", "");
			}

			// Extract the info we need from the TexturePacker json file, mainly uvRect and size
			Hashtable table = (Hashtable)item.Value;
			Hashtable frame = (Hashtable)table["frame"];

			int frameX = int.Parse(frame["x"].ToString());
			int frameY = int.Parse(frame["y"].ToString());
			int frameW = int.Parse(frame["w"].ToString());
			int frameH = int.Parse(frame["h"].ToString());

            // [Modify] by maosongliang, begin
            // Read the rotation value
            newSprite.rotated = (bool)table["rotated"];
            // [Modify] by maosongliang, end

            newSprite.x = frameX;
			newSprite.y = frameY;
            newSprite.width = frameW;
            newSprite.height = frameH;

            // Support for trimmed sprites
            Hashtable sourceSize = (Hashtable)table["sourceSize"];
			Hashtable spriteSize = (Hashtable)table["spriteSourceSize"];

			if (spriteSize != null && sourceSize != null)
			{
				// TODO: Account for rotated sprites
				if (frameW > 0)
				{
					int spriteX = int.Parse(spriteSize["x"].ToString());
					int spriteW = int.Parse(spriteSize["w"].ToString());
					int sourceW = int.Parse(sourceSize["w"].ToString());

					newSprite.paddingLeft = spriteX;
					newSprite.paddingRight = sourceW - (spriteX + spriteW);
				}

				if (frameH > 0)
				{
					int spriteY = int.Parse(spriteSize["y"].ToString());
					int spriteH = int.Parse(spriteSize["h"].ToString());
					int sourceH = int.Parse(sourceSize["h"].ToString());

					newSprite.paddingTop = spriteY;
					newSprite.paddingBottom = sourceH - (spriteY + spriteH);
				}
			}

            // [Modify] by maosongliang, begin
            if (newSprite.rotated)
            {
                int temp = newSprite.width;
                newSprite.width = newSprite.height;
                newSprite.height = temp;

                temp = newSprite.paddingLeft;
                newSprite.paddingLeft = newSprite.paddingTop;
                newSprite.paddingTop = temp;

                temp = newSprite.paddingRight;
                newSprite.paddingRight = newSprite.paddingBottom;
                newSprite.paddingBottom = temp;
            }
            // [Modify] by maosongliang, end

            // If the sprite was present before, see if we can copy its inner rect
            foreach (UISpriteData oldSprite in oldSprites)
			{
				if (oldSprite.name.Equals(newSprite.name, StringComparison.OrdinalIgnoreCase))
				{
					newSprite.borderLeft = oldSprite.borderLeft;
					newSprite.borderRight = oldSprite.borderRight;
					newSprite.borderBottom = oldSprite.borderBottom;
					newSprite.borderTop = oldSprite.borderTop;
				}
			}

			// Add this new sprite
			atlas.spriteList.Add(newSprite);
		}

		// Sort imported sprites alphabetically
		atlas.spriteList.Sort(CompareSprites);
		Debug.Log("Imported " + atlas.spriteList.Count + " sprites");
	}

UIBasicSprite.cs
	//modify by Amumu begin
	private Quaternion vertsAngle = Quaternion.Euler(0, 180, -90);
	protected bool rotated = false;
	//modify by Amumu end
	protected void Fill (BetterList verts, BetterList uvs, BetterList 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;
		}
		//modify by Amumu begin
		if (rotated) {
			Vector4 v = drawingDimensions;
			float centerX = v.x + v.z;
			float centerY = v.y + v.w;

			for (int i = 0; i < verts.size; i++) {
				Vector3 vert = vertsAngle * verts[i];
				vert.x += centerY;
				vert.y += centerX;
				verts[i] = vert;
			}
		}
		//modify by Amumu end
	}

UISprite.cs
	public override Vector4 drawingDimensions
	{
		get
		{
                   .....
			//modify by Amumu begin
                        if(rotated){
			    return new Vector4(vw, vx, vy, vz);                        
			}
                        else{
			    return new Vector4(vx, vy, vz, vw);   
                        }
			//modify by Amumu end
		}
	}
	protected void SetAtlasSprite (UISpriteData sp)
	{
		mChanged = true;
		mSpriteSet = true;

		if (sp != null)
		{
			mSprite = sp;
			mSpriteName = mSprite.name;
			//modify by Amumu begin
			rotated = mSprite.rotated;
			//modify by Amumu end
		}
		else
		{
			mSpriteName = (mSprite != null) ? mSprite.name : "";
			mSprite = sp;
		}
	}
	public override void MakePixelPerfect ()
	{
		if (!isValid) return;
		base.MakePixelPerfect();
		if (mType == Type.Tiled) return;

		UISpriteData sp = GetAtlasSprite();
		if (sp == null) return;

		Texture tex = mainTexture;
		if (tex == null) return;

		if (mType == Type.Simple || mType == Type.Filled || !sp.hasBorder)
		{
			if (tex != null)
			{
				int x = Mathf.RoundToInt(pixelSize * (sp.width + sp.paddingLeft + sp.paddingRight));
				int y = Mathf.RoundToInt(pixelSize * (sp.height + sp.paddingTop + sp.paddingBottom));
				
				if ((x & 1) == 1) ++x;
				if ((y & 1) == 1) ++y;
				//modify by Amumu begin
				if (mSprite != null && mSprite.rotated) {
					int tmp = x;
					x = y;
					y = tmp;
				}
				//modify by Amumu end
				width = x;
				height = y;
			}
		}
	}

좋은 웹페이지 즐겨찾기