NGUI 는 TexturePacker 에서 Transform 회전 버 전 없 이 회전 하 는 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;
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.