손으로 하는 테트리스 만들기 (2) 유니티로 옮기기

2021. 1. 20. 21:45뚝딱뚝딱 만들기 Devlog/프로젝트 Devlog

지난번에 이어서 이번에는 유니티로 옮기는 과정입니다.

 

1. ardity 설치

유니티에서 아두이노 데이터를 읽어오는 방법이 있는데, 시리얼 포트를 유니티가 사용할 수 있습니다.

arduino 개발 툴에서 시리얼 모니터에 해당하는 기능이 있는 셈입니다.

이거를 편하게 해주는 게 바로 ardity입니다.

ardity를 asset store에서 찾아서 받았습니다.

Assets 폴더에 있는 Ardity\Scripts\Samples\SampleUserPolling_ReadWrite.cs와

Ardity\Scripts\SerialController.cs를 잘 보면 대충 감이 옵니다. (SampleUserPolling_ReadWrite만 봐도 될 것 같아요)

-Serial Controller

우선 Serial Controller 컴포넌트를 어딘가에 달아줘야 합니다.

저는 serial이라는 빈 오브젝트에 달아줬습니다.

그리고 여기에 포트명(저의 경우 COM3)과 시리얼 통신 속도(저의 경우 115200)을 적어주면 됩니다.

 

여기서 Message Listener에 오브젝트를 넣으면 시리얼 통신으로 데이터를 받을 때 콜백 함수를 실행해줍니다.

OnCollisionEnter처럼 OnMessageArrived를 사용할 수 있습니다.

 

SerialController.cs 121번 줄

저는 일단 콜백을 안 쓰고 하기로 했습니다.

 

-시리얼 통신

시리얼 통신 중 송신은 시리얼 모니터 입력창에 쓰는 거랑 동일한 기능입니다.

아까 만들어둔 SerialController 컴포넌트에서 SendSerialMessage를 실행해주면 됩니다.

아래 코드는 A를 누르면 A를, Z를 누르면 Z를 시리얼 통신으로 입력하는 부분입니다.

SampleUserPolling_ReadWrite.cs 36번 줄

시리얼 통신 중 수신은 시리얼 모니터에 나오는 것을 한 줄 단위로 읽습니다.

여기서 주의할 점은 너무 빠른 속도로 많은 메세지가 수신되면 몇 개의 메세지는 드랍됩니다.

위와 비슷한 방법으로 Serial Controller에 ReadSerialMessage를 실행해주면 시리얼 출력 한 줄을 반환해줍니다.

아래 코드는 시리얼 통신으로 받은 메세지를 전부 "Message arrived : 출력내용"의 형식으로 출력해주는 부분입니다.

 

SampleUserPolling_ReadWrite.cs 53번 줄

 

 

2. 움직이는 손 만들기

위 예제를 참고해서 자이로센서에 따라 게임오브젝트가 회전하는 기능을 만들었습니다.

읽어온 메세지를 split해서 회전벡터로 가공해 hand오브젝트에게 넘겨주는 방식입니다.

 

GyroReader.cs 의 DecryptMessage(string)

벡터에 들어간 순서가 2,0,1이고 x에는 -가 붙어있는 건 그대로 넣으면 이상하게 돼서 맞게 수정했습니다.

여기서 hand는 HandController 컴포넌트이고, FeedVector은 받아온 벡터를 그대로 rotation에 적용합니다.

HandController 컴포넌트는 나중에 손 역할을 해줄 큐브에 우선 달아줬습니다.

 

추가로 자이로센서를 수평으로 둬도 이상한 각도로 기울어진 큐브가 나와서 영점을 맞춰주는 기능을 추가했습니다.

 

GyroReader.cs의 DecryptMessage(string)

여기에 R을 누르면 영점을 다시 잡아주는 기능도 만들었습니다.

 

GyroReader.cs의 Update()

여기까지 했을 때 아주 괜찮은 결과물이 나와서 행복했습니다.

 

 

영상 후반부를 보면 센서랑 큐브 회전이 일치하지 않는데, 이게 바로 그 말로만 듣던 드리프트 현상입니다.

하루빨리 고쳐야겠어요.

반응형