물에 살고싶은 개발자

NGUI Sprite 변경 문제 본문

Unity3D

NGUI Sprite 변경 문제

돼지사랑 2016. 1. 8. 18:52

뜻밖에 버그가 터졌다.

크다면 크고 별거아니라면 별거아닌 버그이지만, 

아주 간단한부분에서 터진 버그인데,


스프라이트컴포넌트와 박스콜라이더,버튼 컴포넌트가 붙어있는 오브젝트가 있다.

코드에서 스프라이트 컴포넌트에 동적으로 접근해서 이미지를 바꿔줄 목적이였는데

문제가 생겼다 로그를 찍어봐도 이상이 없고 코드에도 이상이 없고 스프라이트 이미지의 이름에 오타가 있거나 한것도 아닌데 정작 결과물은 변경이 안되는 것이다.

뭐가 문제인가 질문글을 살포하고 이래저래 테스트도 해보고 하는과정에서 알게됏다


버튼 컴포넌트와 내 시스템스크립트의 실행순서 문제라는것을...

간단히 말하자면 원인은 이렇다.

시스템스크립트에서 변경 -> 버튼 컴포넌트가 변경 -> 렌더링

이 과정을 거치니 당연히 나중에 실행된녀석이 결과가 되는것이다.


좀더 구체적으로 설명하자면 버튼 컴포넌트에는 스프라이트를 자동으로 바꿔주는 녀석이 있다.

이녀석이 문제다. 애초에 트윈타겟도 None으로 바꿔놓아도 에디터를 클릭이라도 클릭하면 

자신이 붙어있는 오브젝트가 할당된다.(플레이상태가 아니더라도) 그렇기때문에 자동적으로 스프라이트에 기본적으로 맨 처음 설정한 디폴트값(여기서는 이미지A라고 하자) A가 버튼의 스프라이트 노멀에도 같이 할당되는 것이다.

문제는 이놈이 실행을시켰을때 버튼이 아무 동작을 하지않고있는 상황에서 스프라이트를 바꿔주는 녀석이라서

위에서 설명햇듯이 내가 스크립팅으로 변경을 하더라도 나중에 노멀에 할당된 A라는 스프라이트로 바꿔버리는 것이다. (버튼컴포넌트가 참 편하라고 만들어놧는데도 이래저래 사고를 많이치는놈이다-_- 버튼이벤트도 프리팹으로 만들면 붙여둔 스크립트가 멋대로 빠져버려서 버튼이벤트 스크립트를 따로 만들어서 붙여쓴다.)


아무튼 이래서 문제해결을 위해 

ComplateChars[i].spriteName = CharArray[temp];
mCharView_CompleChars.transform.GetChild(i).GetComponent().normalSprite = CharArray[temp];


이런식의 코드를 추가해줫다. 물론 하드코딩이고 일시적으로 막아둔것이긴 하지만..

근본적인 문제를 해결하려면 NGUI 코드를 수정하거나 직접 접근해서 해줘야하는데

그래봐야 그냥 가독성만 떨어지고 안좋을거같아서 하드코딩을 선택했다.

(참고로 위 코드는 이해를 돕기위해 코드를 길게 풀었다. 가독성을 높이려면 따로 변수를 만들어서 쓰면 될것이다.)

Comments