본문 바로가기
프로그래밍/유니티

[Unity UGUI / C#] 이미지를 원래 크기로 + α 문제 해결

by 김시루시루르 2021. 9. 5.

하는 스크립트. 런타임중에 작동 가능합니다. 유니티 에디터 상에서는 바로 이 버튼입니다.

이걸 근데 .. 고작 이거때문에 C#을 쓰자니 뭔가 웃기네

여튼 스크립트랄까 함수는 이것.

1
GetComponent<Image>().SetNativeSize();
cs

이걸 쓰면 Image 컴포넌트의 Source Image로 들어가있는 스프라이트를

입력된 크기, 변형된 크기와 상관 없이 원래 스프라이트의 크기로 돌리기가 가능합니다.

다만 이미지 타입이 Simple 혹은 Filled로 되어있는 이미지에서만 가능합니다.

다른 타입에선 에디터에서도 이 버튼이 사라지기도 하죠...


저는 이 스크립트를 버튼의 하이라이트 등 트랜지션(스프라이트 스왑)에 쓰고있었는데

(왜 트랜지션 옵션을 안 쓰냐면 그게 다 그럴만한 이유가 있습니다 나중에 공개(?))

 

얼마전 UI를 최적화하려고 이것저것 만지고 있었는데 갑자기 뭔가.. 문제가 생기는거예요

그래서 뭔가 하고 봤더니 이 스크립트가 불러오는 에러인 경우였거든요

그 문제의 기록을 하려고 오늘 이 글을 씁니다

이름붙이자면 "앵커 프리셋을 바꿨는데 갑자기 UI가 흐트러지는 경우"랄까.. 이름붙이기도 어렵네

 

어쨌든.

스크립트는 대충 이미지 하이라이트를 켜고 끄는 과정에서 원래 크기로 스크립트를 쓰는 거였어요

그런데 .. 이것저것 정리하다가 앵커 프리셋을 이걸로 바꿨었거든요 (이거 뭐라고 하는거야 스트레치 미들?)

어차피 이 UI는 한 단이라 X좌표는 전부 0으로 통일인데 굳이 X좌표를 더 신경쓰고 싶지 않아서

stretch로 바꿨단말이죠 그리고 Y좌표를 원래대로 바꿔준 다음에 .. 실행을 해봤는데

자꾸 이렇게 되는거예요 흑흑

셋네이티브사이즈는 예전부터 쓰고있었어서 대체 뭐가 문제인지 알 수 없었는데

실행 중에 트랜스폼 설정을 보니까

앵커 프리셋이 이걸로 바뀌어있더라고요 으윽

그래서 실행을 끈 다음에 다시 앵커 프리셋을

스트레치에서 미들 센터로 바꿨더니 원래대로 잘 나오더군요

반대로 스트레치를 유지한 상태에서 셋네이티브사이즈를 실행하지 않는 경우에도 문제가 없더라고요.

 

이것저것 해봤는데, 스트레치 상태에서 셋네이티브사이즈를 하는건 ... 이런 문제를 동반하는것같습니다

이 스크립트를 쓰면 앵커가 미들 레프트가 되는건가? 했는데 .. 그것도 아니고

그냥 스트레치 상태에서만 미들 레프트가 되는거고, 스트레치가 아닌 앵커 프리셋에선 문제가 없더라고요

 

꼭 스트레치와 셋네이티브사이즈를 같이 써야겠다! 하시는 분들은

스트레치를 쓰는 부모 오브젝트를 둔 뒤에, 그 자식 오브젝트로 셋네이티브사이즈를 쓰는

스트레치가 아닌 앵커 프리셋을 가진 오브젝트를 두시면 문제가 생기지 않습니다.

제가 겪어본 바로는 그렇습니다. (그래서 스트레치를 똑같이 썼는데 왜 다른 결과가!! 라며 더 절망했죠)

 

물론 런타임 중 앵커를 조절하는 스크립트도 있으니 그걸 병행하면 어떻게 될지도 모르겠지만

그냥.. 이 방법이 더 쉽잖아요.

어쨌든 이걸로 오늘의 문제는 해결되었습니다! 와!

댓글