NGUI의 UISprite를 텍스쳐로 복사해 사용하기

2017. 6. 27. 22:01프로그래밍/Unity

반응형
SMALL


NGUI를 사용하는 입장에서 편리하기 때문에 왠만하면 UISprite로 모든 작업처리를 한다.

 

굳이 텍스쳐를 사용하지 않아도 됀다는 뜻이다.


하지만 모든 툴은 내입맛에 딱 맞지 않는 경우가 발생하기 마련..




3D오브젝트에서 텍스쳐를 사용하는데 아틀라스에 있는 내용을 가져다 쓰고 싶은경우가 생겼다. 

(이외에도 텍스쳐에 아틀라스이미지를 가져다 쓰고싶은 경우가 생길 수 있을 것이다...)



텍스쳐 대신에 UISprite를 쓸수있으면 좋으련만...



아틀라스의 픽셀을 따다가 새로운 텍스쳐를 만들어 반환하는 함수를 발견해서 

다음과 같은 방식으로 수정을 가했다.


 public Texture2D UISpriteToTexture(UISprite targetSpr, bool noneAlpha = false)

{

//if(targetSpr.GetAtlasSprite() == null ) return null;

int atlasWidth  =targetSpr.GetAtlasSprite().width;

int atlasHeight = targetSpr.GetAtlasSprite().height;


int atlasStartX = targetSpr.GetAtlasSprite ().x;

int atlasStartY = targetSpr.GetAtlasSprite ().y;


Texture2D tepTex = new Texture2D (atlasWidth, atlasHeight, TextureFormat.RGBA32, false);

Texture2D srctex = (Texture2D) targetSpr.atlas.texture;


for(int a = 0; a < atlasHeight; a++)

{

for(int b = 0; b < atlasWidth; b++)

{

Color c = srctex.GetPixel(b+atlasStartX, a+( targetSpr.atlas.texture.height-(atlasHeight+atlasStartY )));

if(noneAlpha)

{

if( c.a == 0 )

{

// 알파 없애고 싶을때 사용

c.r = c.g = c.b = c.a = 1;

}

}

tepTex.SetPixel(b,a,c);

}

}

  tepTex.EncodeToPNG();

     tepTex.Apply();

 return tepTex;

}





그러나 유니티 익셉션 발생..


UnityException: Texture 'Atlas' is not readable, the texture memory can not be accessed from scripts. You can make the texture readable in the Texture Import Settings.


GetPixel() 함수에서 발생하는 익셉션이다.



스크립트로 texture를 제어하기 위해서는 유니티에서 해당 texture(아틀라스)를 선택한 다음 

Inspector panel의 (Texture Importer) 세팅에서 Texture Type을 Advanced로 선택해 주고(최신버전에는 어드벤스 탭이 따로 있다) 

Read/Write Enabled 체크 하면 됀다.



//더불어 추가로 ARGB32 로 설정해주자






반응형
LIST