피드로 돌아가기
How Unity WebGL Talks to a WebSocket Server (The Hard Way)
Dev.toDev.to
Frontend

Unity WebGL-WebSocket 브릿지로 구현한 바이너리 세이프 통신 아키텍처

How Unity WebGL Talks to a WebSocket Server (The Hard Way)

Magithar Sridhar2026년 4월 7일7advanced

Context

Unity WebGL은 IL2CPP 컴파일 후 브라우저 샌드박스 내에서 동작하는 구조. C#의 System.Net.WebSockets 및 백그라운드 스레드 직접 접근이 불가능한 한계. 브라우저 네이티브 WebSocket API 호출을 위한 JavaScript 인터럽트 계층 필요.

Technical Solution

  • ITransport 인터페이스 기반의 Dual-Transport 아키텍처 설계로 WebGL과 Native 플랫폼 간 구현체 분리
  • .jslib 파일과 DllImport("__Internal")를 활용하여 C#에서 JavaScript WebSocket API를 호출하는 브릿지 구조 구축
  • 멀티 소켓 환경의 콜백 충돌 방지를 위해 GUID 기반의 Socket ID 라우팅 및 Dictionary 맵핑 전략 적용
  • 송신 시 GCHandle.Alloc을 통한 메모리 핀 고정으로 Garbage Collection에 의한 메모리 주소 변경 및 데이터 오염 방지
  • 수신 시 JavaScript _malloc으로 WASM 힙 메모리 할당 후 Marshal.Copy로 데이터를 복사하고 _free로 즉시 해제하는 메모리 관리 라이프사이클 설계
  • IL2CPP 스트리핑으로 인한 런타임 NullReferenceException 방지를 위해 link.xml 파일을 통한 타입 보존 설정 적용

Key Takeaway

서로 다른 런타임 환경 간의 상호 운용성을 확보하기 위해서는 추상화 인터페이스를 통한 플랫폼 분리와 정교한 메모리 소유권 관리 전략이 필수적임.


Unity WebGL 빌드 시 바이너리 데이터 전송이 필요하다면 반드시 _malloc/_free 기반의 수동 메모리 관리와 GCHandle 핀 고정을 적용할 것

원문 읽기