유니티

토글 그룹이 이상하게 작동해요!?

bugmin 2024. 8. 16. 11:16

토글 그룹의 경우 보통 여러 옵션중 하나만 선택 가능하도록 하고자 많이 사용되는데 내가 마주한 문제 상황은 다음과 같다.

 

 

그래픽 옵션서 상 중 하 의 토글 중 하나만 선택가능한데

 

확인 버튼을 누르면 선택한 그래픽 옵션이 적용되고

 

취소 버튼을 누르면 어떤 토글을 골랐던 선택 이전, 즉 기존의 토글이 유지되도록 하고자하는데

 

문제는 종종 취소 버튼을 눌러도 기존의 토글이 유지가 안되는 문제였다.

 

예를 들어 기존 옵션이 High 일 때 Medium을 체크하고 취소를 눌러도 High가 유지되어야하는데 다시 설정창을 키면 Medium으로 나오는 것이다.

 

이 문제에 있어 핵심은

 

"오브젝트가 비활성화 되어있으면 토글 그룹은 정상적으로 작동하지 않는다"

 

는 사실이다.

 

해당 설정 화면은 유저가 설정 버튼을 눌러야만 나오는 팝업 UI이고

누르지 않는다면 비활성화된 상태로 있을 것이다.

 

토글 그룹 의도대로 하나만 체크 되게 하려면 반드시 토글 그룹 컴포넌트와 오브젝트가 활성화되어 있어야한다.

 

이는 아래의 실험을 통해 알 수 있다.

 

토글그룹이 부착된 오브젝트가 비활성화되어 있는 모습이다.

 

 

원래라면 토글 그룹의 토글들 중 하나만 IsOn을 킬 수가 있지만

 

토글 그룹 컴포넌트가 달린 부모가 꺼진 상태선 토글0, 토글 1 둘다 IsOn이 킬 수 있게 된다.

 

이는 토글그룹이 달린 부모 오브젝트가 비활성화되어 있기에 토글 그룹도 비활성화가 되었기 때문이다.

 

둘다 IsOn이 체크되었으니까 만일 토글그룹이 달린 부모 오브젝트를 활성화 시키면 둘 다 체크가 되어있을까?

 

실제로 한 번 켜보자

 

 

실제 수행해보면 토글은 IsOn된 토글 중 하이라키 창에서 가장 하단에 있는 마지막 하나만 체크가 된다. 

 

이제 다시 문제 상황으로 돌아와보자

 

기존 그래픽 세팅이 High

 

 

내가 Medium로 변경 후 취소를 눌렀다면

 

 

일단은 Medium의 토글이 IsOn으로 남아있지만 위의 코드와 같이 UserInfo에 기존 그래픽 옵션에 대해 따로 저장을 하고 있기 때문에 위와 같은 코드를 작성하면 기존 옵션인 High의 index를 true로 바꿀 것이다.

 

참고로 High 가 index 0, Medium이 index 1, Low가 index 2 이다.

 

아무쪼록 토글 그룹은 하나만 옵션 선택을 허용하기 때문에 Medium이 꺼지고 기존의 옵션인 High가 체크돼야 할 것으로 보이지만

 

Medium이 그대로 체크가 되어있다.

 

이것이 바로 위에서 언급한

 

"오브젝트가 비활성화 되어있으면 토글 그룹은 정상적으로 작동하지 않는다"

 

의 상황이기 때문이다.

 

 

나는 코드에서 토글 그룹이 달린 오브젝트가 비활성화된 상태에서 위와 같은 코드를 동작시킨 것이고

고로 High와 Medium 둘다 체크된 상태가 된 것이다.

 

아까 말했듯이 둘다 체크된 상태에서 토글 그룹이 달린 부모 오브젝트가 활성화되면 IsOn이 체크된 토글 중 하이라키 상에서 가장 하단의 토글의 IsOn이 활성화가 된다.

 

High보단 Medium이 하이라키 창에서 하위의 토글이기 였기 떄문에 Medium이 활성화가 되는 것이다.

 

이 문제를 해결하는 것은 매우 간단하다.

 

 

토글 그룹이 달린 부모 오브젝트를 먼저 활성화시킨 다음에 토글의 IsOn을 조작하는 것이다.

 

위의 코드서 base.SetActive(true)가 부모 오브젝트를 활성화하는 코드이다.

기존에는 base.SetActive(true)가 isOn 조작보다 아래에 있었기에 해당 문제가 발생한 것이다.

 

이렇게하면 토글의 IsOn이 하나만 활성화가 될 것이다.

 

이번 트러블슈팅을 통해 인스팩터창에서 할 수 있는 건 코드상에서도 할 수 있다는 걸 유념하고 반대로 코드상에서 할 수 있는 것을 인스팩터창에서 미리 확인해보고 코드를 짜보는 것도 좋아보인다.

 

요약하자면

토글의 IsOn 조작은 토글 그룹이 달린 부모 오브젝트가 활성화된 상태일 때 하자는 것이다.

물론 토글 그룹 자체도 활성화가 되어있어야한다.