유니티로 보통의 어플리케이션을 개발할 때에는 PC용이든 모바일용이든 상단의 플레이버튼과 VS의 디버그모드를 이용해서 동작을 확인하곤 했었다.


그러나 이번에는 생각없이 ARCore를 사용한 어플리케이션을 적당선까지 만들고 디버깅을 해보려니 웬걸 PC에는 모바일 카메라가 없었다..


처음에는 땡으로 빌드해서 폰에 넣고 돌렸는데 이 경우 각종 에러코드를 눈으로 확인할 수 없고 언제 어떤 라인을 지나는지, 변수에 값이 들어갔는지 아닌지를 확인하는 것이 너무나도 힘들었다.


그래서 이리저리 검색해보니 google에서 instant preview라는 툴을 제공하고 있었다.


원리를 제대로 확인해보지는 않았지만 adb를 이용해서 모바일의 화면을 넘겨받는 식인것 같다.




실행, 인스톨하는 방법은 대략


1. 데이터 주고받기가 가능한 USB 케이블로 스마트폰과 PC를 연결한다.


2. 스마트폰 개발자 모드에 들어가서 USB 디버깅을 켜고 이런저런 연결을 한다.


3. ARCore 사용을 활성화한 유니티 프로젝트에서 무작정 플레이버튼을 누른다.


이정도 되는데 이러면 알아서 인스톨 루트를 안내해준다.


자세한 부분은 google ARCore의 instant preview 관련 문서에 나와있다.


USB케이블을 이용하지 않고 wifi 접속 등으로 adb를 쓰는 방법도 있는가본데 훨씬 복잡한 것 같아서 필자는 사용하지 않았다.




instant preview를 사용하며 발견한 문제점이 좀 있는데,


1. 우선 한번 tcp port를 써서 adb가 실행되면 해당 프로세스는 하나의 Unity 프로젝트 프로세스에만 연결된다는 점.


컴퓨터를 재시작하면 당연하게도 프로세스가 종료되어 다시 새로운 프로젝트에 instant preview를 사용할 수 있는데 이것이 계속 껐다가 켜기 짜증난다.


이 경우는 유니티 에러로그에 뜨는 adb 포트번호를 기억해두고, 관리자 권한 명령 프롬프트(cmd)로 netstat -ano를 통하여 해당 포트를 사용하는 프로세스의 PID를 확인한 후, 작업관리자 - 세부 정보를 통하여 해당 PID의 프로세스를 꺼 주면 재시작 없이도 다시 이용할 수 있었다.


2. 터치 감지도 되긴 하는데 가운데의 드롭다운 메뉴를 건드리지 않고 시험해야 하는 점이 조금 짜증난다. 터치 영역도 화면 전체를 커버하긴 하지만 위치가 완벽하게 대응되는 느낌은 아니다.




그 외의 사용은 대체로 편하다. adb 프로세스가 살아있으면 usb케이블을 뽑았다가 연결해도 잘 동작할 정도.


혹시나 가로모드로만 실행된다면 모바일의 가로상태에 dependency가 있는 것이 아니라 유니티 프로젝트의 화면 비율 문제이니 그쪽을 바꿔보도록 하자.


구글의 문서에서는 유니티 build setting에서 debug옵션에 체크하라는 안내가 있던데 필자의 경우는 체크를 해제해도 문제없이 작동하였다.


오히려 debug 옵션을 켜고 시험해볼때에는 모바일에 부담이 가는지 카메라 속도나 면 인식 속도가 느려서 대체로 옵션을 끄고 사용했다.




어쨌든 instant preview를 사용한다면 유니티 프로젝트에서 휴대폰의 화면(휴대폰의 카메라가 켜져있는 경우 포함)을 보면서 디버그할 수 있기 때문에 VS에서 유니티의 프로세스를 연결하여 breakpoint를 찍거나 line by line으로 따라가는 것 등등 평소대로 디버깅이 가능해진다.



두서없이 생각나는대로 끄적였는데 조금 더 쓸게 생각나면 수정하도록 해야겠다.

게임 개발 중 프로젝트 내 오브젝트를 동적 생성 방식으로 바꾼 후 부터 디버깅에 애를 먹고 있다.

크고 작은 어려움이 있는데 지금 걸려있는 부분은 다음과 같다.

 

 

프리팹을 동적으로 가져와 인스턴스를 만들 때 오브젝트에 붙어있는 스크립트 등의 설정을 하려면 EventDelegate를 필연적으로 사용해야 한다.

(다른 방법이 있는지는 아직 잘 모르겠다.)

 

버튼을 눌러 UI를 변경하고 싶을 때 현재 있는 오브젝트를 전부 파괴하고 UI오브젝트를 다시 동적으로 만드는 방식인데,

중단점을 여기저기 걸어서 디버깅을 해본 결과 버튼을 클릭하면 그것을 인식하는 리스너 역할을 하는 함수 이름을 OnButtonClick이라고 할 경우 EventDelegate가 끝나고 오브젝트가 생성되는 타이밍은 OnButtonClick이 끝난 후이다.

 

이때, OnButtonClick이 끝난 후 생성된 특정 버튼의 Label을 바꾸고 싶은데 버튼 오브젝트마다 리스너를 하나씩 더 붙여야 하나 고민중이다.

그 많은 오브젝트에 하나하나 다 붙이기도 좀 뭐하고..

 

Update()를 만들어서 프레임마다 감지하기도 괜히 찝찝하다. 쓸데없는 낭비가 될 것 같다.

분명 좀더 괜찮은 방법이 있지 싶은데 검색을 하고 싶어도 키워드를 모르겠다.

 

뭐 요는 오브젝트가 생성되는 타이밍을 캐치해서 그 이후에 Label을 바꾸거나,

아예 오브젝트 생성코드에서 Label을 변경해두거나 둘중 하나를 실현하면 되는 것이다.

 

 

======================================================================

 

 

오브젝트 생성 자체는 EventDelegate를 거치지 않는다는 사실을 깨닫고 오브젝트 생성 함수에서 Label을 변경하였다.

FindChild("자식 오브젝트 이름")을 두세번 적용하여 찾아갈 수 있었다.

 

알고 보면 아무것도 아닌데 삽질만 잔뜩 한 기분이다..

 

어쨌든 디버깅 끝.

+ Recent posts