티스토리 뷰
많은 프로그래머들은 assert 가 유용하다는 사실을 알고 있습니다. '하늘로 차라'를 만들면서 가장 많이 썼던 코드 중 하나인 Debug.Assert() 활용법을 적어봅니다.
유니티는 하나의 게임 씬(scene)에 여러 객체를 넣고, 그 객체를 중심으로 메인 게임 로직이 돌아가는 경우가 많을 것 입니다. 특히 게임 매니저 객체나, 네트워크 매니저 객체, 혹은 주인공 객체등으로 구성할 수 있습니다. 이렇게 되면 어느 규모 이하의 개발까지는 이 객체에 연결된 script 에 많은 public GameObject 들을 노출시키고, 다른 game object 들을 연결하게 됩니다. 그리고 이 연결을 종종 끊고 다른 객체들을 연결하기도 합니다.
그런데, 이런 과정들을 거치다보면 종종 실수로 객체의 연결이 끊어진 채 지나치게 되기도 합니다. 그러다가 나중에 릴리즈 후에 발견하거나, 특정 상황이 되었을 때만 크래시를 내기도 하죠. 주로 null exception 이 발생할 것 입니다.
이를 방지하기 위해서 항상 Start() 에서 Debug.Assert() 를 이용해서 해당 객체의 연결이 살아있는지를 확인하면 매우 편리합니다. 그러면 빨리 문제를 확인할 수 있습니다. 빠른 문제 확인은 더 단단한 프로그래밍을 할 수 있게 도와줍니다.
다음과 같은 형태로 코드를 작성하면,
public GameObject main_character_; void Start() { Debug.Assert(main_character_); } void Update() { if (height_ > 100.0f) { main_character_.foo(); } } |
위의 코드의 Update() 함수를 보면 특정 조건이 만족했을 때 main_character_ 를 사용하게 되는데 이 때 main_character_ 의 연결이 끊어졌음을 확인하게 된다면 상당히 위험합니다. 그러므로 Start() 에서 미리 main_character_ 가 연결이 잘되어있음을 Debug.Assert() 를 통해서 확인해두는 것이 안전합니다.
main_character_ 를 inspector 에서 연결하지 않거나, main_character_ 의 변수 이름을 바꿔서 inspector 에서 연결을 끊어버리거나 했을 때 빨리 발견할 수 있습니다.
한 줄 결론: inspector 에서 가져오는 객체들은 항상 Start() 에서 assert 를 걸고 쓰는 습관을 들이면 좋습니다.