티스토리 뷰

 유니티에서 프로그래밍을 하다가 '이건 앞으로도 계속 이런 형태로 프로그래밍을 하는게 좋겠는데' 라는 생각이 드는 것 중에 하나가 콜백을 사용하는 프로그래밍 패턴입니다. 이걸 한번 소개해보겠습니다.


 

 하늘로 차라 Up Up Up!




유니티에서 프로그래밍을 하다보면, 외부 라이브러리를 사용할 때 종종 콜백을 사용하게 됩니다. 여기서 말하는 콜백이란, '라이브러리가 xxx 라는 동작을 하고 나면 니가 원하는 함수를 호출해줄께' 라는 것입니다.

 예를 들면, Google Play Game 의 로그인하는 함수를 호출할 때 결과를 받는 함수를 인자로 넘겨주거나, Unity AD 광고를 보여주는 함수를 호출할 때 게이머가 광고를 다봤으면 true, 중간에 끊었으면 false 를 넘겨받는 함수를 인자로 넘겨주거나 입니다. 그리고 구글에 구매 요청을 보낼 때도 결과를 받기 위해서 콜백 함수를 넘겨줍니다.


 이런 콜백 함수를 통해서 무엇인가를 하려고 할 때 조금 애매할 수 있습니다. 예를 들어 현재 씬에 ShopManager 라는 MonoBehavior 객체가 있고, 이 객체에 OnShopResult() 함수가 있어서 구글 구매 요청 함수에 OnShopResult() 함수를 넘겨줬습니다. 그래서 구글 구매 요청 함수가 어떤 처리를 하고 나서 OnShopResult() 함수를 호출하려고 하는데, 어떤 상황(사용자가 그 사이에 다른 씬으로 갔다던지 등등) 때문에 ShopManager 가 없다면 어떻게 될까요? 실제로는 아마 C# 에서는 콜백을 넘길 때 this 를 캡쳐해서 가지고 가기 때문에 문제는 없지 않을까요? 그런데 ShopManager 는 살아있다고 치더라도, 하위 컴포넌트들은 다 살아있을까요? OnDisable() 같은 곳에서 하위 객체들을 Destroy() 했다던지, 리소스들을 해제했다면? 그래서 OnShopResult() 에서 화면에 결과를 그리기 위해서 해제된 리소스에 접근한다면 아마 크래시가 되겠죠. 그리고 이미 없어졌다고 가정하는 씬이 실제로는 살아있다는 것도 이상합니다.


 물론 위의 상황이 잘 발생하지는 않을 거라는 건 압니다. 하지만 좀 찝찝함을 지울 수가 없어서, 저는 위와 같은 상황에서는 싱글톤을 활용하는 패턴을 사용하였습니다.


1. XXXResult 라는 클래스를 싱글톤으로 하나 만듭니다.

2. 어떤 함수의 결과를 위한 콜백을 넘길 때 XXXResult 싱글톤에 set_result() 함수로 마킹을 해둡니다.

3. ShopManager 같은 객체의 Update() 함수에서 XXXResult 를 계속 감시하다가, set_result() 가 되었을 때 그 결과를 받아와서 처리를 하고, clear_result() 함수를 호출해서 그 결과를 삭제해둡니다.


위와 같은 패턴으로 프로그래밍을 해두면, 앞에서 적어둔 애매한 상황을 해결할 수 있습니다. 콜백을 등록해놓고 결과를 받기 전에 씬 이동이 일어나면, ShopManager 는 그냥 자연스럽게 삭제되고, XXXResult 싱글톤 감시를 안하게 될 뿐이니까요.


 '하늘로 차라' 에서는 위의 패턴을 다음과 같은 상황에 사용하였습니다.


* 아이템을 구글을 통한 구매 후 현재 화면을 갱신할 때

* Unity AD 결과를 받은 후 화면에 코인 획득을 표시할 때


 로그인 과정 중에도 사용할 여지가 있었으나, 개발 스케줄 상 적용하지는 않았습니다;;


 다들 즐거운 프로그래밍 하세요~

신고
댓글
댓글쓰기 폼
공지사항
최근에 달린 댓글
Total
669
Today
0
Yesterday
1
링크
TAG
more
«   2017/11   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
글 보관함