유니티 세계에서 통신을 하기 위한 방법으로 소캣, HttpRequest 등 다양한 방법들이 있습니다. 그 중 저는 실시간 양방향 통신이 필요해서 소캣을 이용하여 NetworkManager
를 만들었습니다.
😭 일반 소켓을 웹에 사용하면 웹 소캣이겠지.. 라고 생각한 무지했던 과거의 나..
하지만 일반 소캣과 웹 소캣은 프로토콜부터 달랐으며 서로 통신도 안된다는 것을 깨닫고 웹 소캣 통신을 하기위해 여러가지 시도를 하게 됩니다. 그 중 성공했던 방법을 공유해 드리겠습니다. 👍
System.Net.WebSockets (실패)
첫 번째로 시도한건 C# 에서 바로 사용할 수 있는 System.Net.WebSockets 이었습니다. 라이브러리를 받을 필요 없이 바로 추가해서 사용할 수 있기 때문이었습니다.
유니티 에디터에서는 잘 돌아가는 것을 확인했지만 WebGL 빌드 후 웹에서 실행했을 때는 안되는.. 기이한 현상이 발생합니다. 구글링 중 다음과 같은 정보를 찾았습니다.
조금만 더 찾아보고 시도할 걸 그랬습니다. 😭😭😭
NativeWebsocket (실패)
코파일럿의 힘을 빌렸습니다! 👍 NativeWebSocket 패키지를 받고 사용하라고 나옵니다! 하지만 README.md에 System.Net.WebSockets
이 내장되어 사용한다고 적혀있네요. 하지만 코파일럿이라 믿고 진행합니다.
이번 시도도 에디터에서 잘 작동하는 것을 확인했지만 WebGL 로 빌드가 되지 않았습니다. 이유는 소캣에 수신된 데이터를 부르는 함수 DispatchMessageQueue()
가 해당 클래스에 없다고 빌드 자체가 되지를 않더라구요.
WebSocket.cs 파일에 전처리기로 WebGL 과 에디터가 나뉘어 있었습니다. 여기서 DispatchMessageQueue()
는 에디터 모드에서만 작동된 다는 것을 알았고, WebGL 에서 웹 소캣을 사용하려면 자바스크립트 코드를 유니티로 가져와서 사용해야 한다는 것도 깨달았습니다.
WebGL 은 따로 DispatchMessageQueue() 함수를 불러줄 필요가 없었던 것이죠. 해당 함수를 삭제하고 빌드하니 정상 빌드 되었습니다! 하지만 웹에서 작동은 하지 않았습니다. 😭😭
UnityWebSocket (성공)
구글링해보니 UnityWebSocket 을 발견했고, 해당 라이브러리로 변경해서 시도해 보았습니다. 에디터 및 WebGL 빌드 후 웹에서 정상 작동하는 것을 확인했습니다! 😄
위 프로젝트와 무엇이 다를까 관찰하던 도중 .jslib
파일에서 dynCall_vi
를 호출하는 방법이 다른 것 같았고, 유니티 문서에 아래와 같이 변경됐다고 하는 것 같았습니다.
결론은 UnityWebSocket 를 사용하면 웹 소캣 구현하는데 큰 무리가 없을 것 같으며 시간이 충분할 때 .jslib
만드는 방법도 알아봐야 할 것 같습니다. 😄