지난번에 해커톤 때 사용하다 남은 아두이노를 이용하여 간단하게 DIY 할 수 있는 VR 컨트롤러를 제작해보았고, Unity와 연동해서 사용할 수 있도록 Bluetooth 플러그인을 제작했었다. 그런데 기록용으로 블로그에 글을 남겼었더니 생각보다 많은 사람(?)들이 질문을 남겨주었고, 돌이켜보니 내가 하던 프로젝트에 굉장히 의존적으로 제작되었기 때문에 다른 사람들이 코드를 가져다가 사용하기가 좀 불편했었다.
그래서 이번 길었던 연휴에 틈틈이 짬을 내서 다시 코드를 수정했고 기존에 Java 단에서 처리되었던 패킷 검사 기능들을 Unity C# 스크립트와 에디터 상에서 어느 정도 간단하게 컨트롤 할 수 있는 방식으로 개선되었다. (오래전에 만든 코드이고 그냥 훅~하고 짜서 주석이 없어서 그런지 코드가 엉망진창.... 읽는 데만 조금 시간이 걸렸다.) 이번 포스팅을 통해 어떤 방식으로 플러그인이 개선되었는지와 주로 질문이 나왔던 부분에 대해 설명하고, 사용법에 대해서 간단하게 설명하는 시간을 가지면 될 것 같다.
개선점
일단, 기존에는 $[32바이트 데이터]# 형태로 이루어져 있던 패킷 검사기를 Unity에서 유동적으로 조절할 수 있도록 개선되었다. $와 #대신 원하는 문자를 패킷의 시작과 끝을 표현하는 데 사용할 수 있고, 안에 들어가는 데이터의 길이도 조절할 수 있다. 또한, 비교적 간단하게 데이터를 구분할 수 있게 '\n'으로만 데이터를 구분하는 작업도 만들어 두었다. (사용법은 아래에서 설명) 덕분에 플러그인을 사용하는 사람이 입맛에 맞게 데이터를 분리하는 방법을 정할 수 있다.
자주나온 질문
일단,
첫 번째로 자주나온 질문인 오타 문제는 이번에 용어와 컨벤션을 통일하면서 해결했다.
두 번째는 보통 34바이트 규격으로 만들어진 패킷 때문에 발생한 문제들이었는데 개선 사항을 통해 더이상 문제가 될 것 같지는 않다.
세 번째로 BAUD RATE에 관련된 질문이었는데 이 설정값은 블루투스 모듈과 칩셋 사이에서 데이터를 얼마만큼의 주기로 가져가 뿌릴 것인지에 대한 설정이므로 유니티에서 신경쓸 것이 없다.
일단 개선사항을 통해서 대부분의 데이터 파싱 로직을 유니티로 끌어 올렸기 때문에 코드만 읽을 줄 안다면 쉽게 쉽게 사용할 수 있을 것같다.
사용법
일단, 사용법을 Github Readme에 작성해둘 것이다. (아마 이 포스팅이 좀 더 간단하게 작성될 예정)
데모씬의 하이러키 구조이다. 항상 있는 카메라의 자식으로 플러그인 오브젝트들을 끼워 넣었다. 기능들을 사용하고 싶다면 Bluetooth와 Model이 씬 위에 있으면 된다. 간단하게 $[2바이트]# 패킷 구조로 세팅해두어 사용했고 정수 2개를 받아 'X Axis'와 'Y Axis'에 각각 뿌려주고 Character를 해당 값의 속도를 가지도록 만들어준다. 조이스틱을 이용하면 캐릭터를 컨트롤 할 수 있는 구조로 되어있다.
먼저 패킷의 구조를 정해보자 BluetoothModel의 인스펙터를 살펴보면 다음과 같은데
'Is Packeted Data'라는 친구는 $[32바이트 데이터]#처럼 앞뒤 구분이 있게 전송되는 데이터인지 체크하는 부분이다. False로 세팅해두면 '\n'을 기준으로 데이터를 파싱한다.
'Packet Size'를 통해 'Start Char'와 'End Char'를 포함한 패킷의 길이를 설정할 수 있고, 시작과 끝을 구분할 수 있다. Mac Addresses는 주변 디바이스들의 정보를 보여준다. (아마 사용하는 일은 없을 것이다.)
이렇게 사용하고 원하는 부분에서 옵저버 패턴으로 모델을 구독하게되면 데이터가 파싱될 때마다 데이터를 넘겨주니 입맛대로 가공해서 View로 뿌려주면 된다.