진행 상태를 보기 위해 progress bar가 필요합니다.
예쁜 UI 스프라이트로 입혀야 하기 때문에, 유료 에셋 GUI_PRO_KIT 샘플에 있던 녀석을 가져다가 구현했습니다.
문제 없이 잘 되다가, 어느 순간 progress bar가 동작하지 않는 것을 확인했습니다
정상 작동하는 progress bar
동작하지 않는 progress bar
[현상]
1. progress bar를 구현한 3개의 scene 중에, 2개의 scene에서는 정상 작동
1개의 scene에서만 슬라이드 내용물 - FillRect가 채워지지 않음
2. 런타임 상황에서 FillRect 대상인 GameObject Inspector를 확인 - RectTransform의 PosX와 Width가 NaN 이 되어 있음
3. 런타임 상황에서 PosX와 Width에 값 입력이 안됨
RectTranfom에 다음 메시지가 출력됨 - Some values driven by Slider.
Unity uGUI 객체인 Slider를 사용하는데, Slider 컴포넌트가 오작동을 하는 상황으로 확인되었습니다.
[문제 해결 과정]
필사적으로 구글링을 해보았지만 쓸만한 포스트를 찾지 못했습니다.
비슷한 사례로 ScrollView에서 RectTransform 값이 NaN 으로 변한다는 글이 있네요.
2014년부터 2017년까지 가끔씩 보고되는 사례입니다.
유니티 담당자도 리포트를 받고 수정했다고 하는데, Unity 버전이 올라도 계속해서 발생하는 것 같네요.
- Unity 버전 다운그레이드 : (오늘 업데이트한 2020.3.16f1 -> 2020.3.12f1) - NaN 동일 증상 발현
- GUI_PRO_KIT 구성과 코드를 버리고 Unity > UI > Slider 새로 추가 - NaN 동일 증상 발현
- Slider에서 내가 사용하지 않는 HandleRect를 넣어보기도 하고 삭제해 보기도 함 - NaN 동일 증상 발현
- 런타임시에 다른 GameObject의 RectTransform을 Copy Component 해서 FillRect 대상의 RectTransform에 Paste Component Values 함 - 가끔 NaN 값이 숫자로 나오고 이후 정상 작동함
- (문제 해결) Slider Component 에서 FillRect 할당을 None으로 없애고, 내 코드에서 Slider.fillrect를 해당 GameObject의 RectTranform로 할당 - Slider가 정상 작동함
private void Start()
{
sliderBar.fillRect = fillRectTransform;
}
[알게 된 내용]
Slider (혹은 ScrollView 등에서) Component가 제어하는 대상의 RectTransform이 가끔 오작동을 합니다.
최초 구성, 할당시에 특정 상황에서 제어하는 대상의 RectTransform 값을 다룰 때, divide by 0 등의 상황이 발생해서 NaN 값이 나오는 것으로 추측됩니다.
오작동하는 RectTransfrom(GameObject)를 None으로 끊어버리고, 스크립트의 Start() 등에서 해당 RectTransform을 할당해주면 초기화 오류 상황을 피할 수 있었습니다.
4시간 정도 고생한 끝에 해결했네요.
항상 발생하는 오류가 아니어서 어려운 문제일 거라고 생각은 했는데요.
Slider 컴포넌트가 오작동 하는 것을 확인한 순간에는 심장이 덜컥 내려앉았습니다. 해결 못하면 progress bar를 모두 빼야하는구나 싶었거든요.
최근에 Awake 와 Start 함수의 타이밍을 공부하며 컴포넌트 초기화에 관심이 있어서 해결의 실마리를 찾았던 것 같습니다.
8년 넘게 유니티 개발을 하면서도 Awake에 무관심해서 Start 함수에 초기화 코드를 다 때려박았었거든요.
아직도 가야 할 길이 멀구나 생각하며, 오늘도 어찌어찌 코딩을 계속합니다.