Unity가 Web에서 어떻게 통신하는가?

우선 통신에 대해 시각화를 하면 위와 같다.
웹 ↔ Unity 통신이 무엇인가?
웹페이지 안에 Unity WebGL이 들어가면, 같은 브라우저 안에서 자바스크립트와 Unity(C#)가 함수를 서로 호출하는 관계가 된다. 거창한 네트워크 통신이 아니라 같은 페이지 안의 함수 호출이다.
- JS → Unity :
UnityInstance.SendMessage("객체명", "함수명", "문자열 데이터") - Unity → JS : jslib 파일에 정의한 JS 함수를 C#에서 호출
- 방향이 둘 다 있고, 주고 받는 건 보통 JSON 문자열 하나이다.
- 따라서 통신은 총 2번만 이루어진다.
배틀 페이지 전체가 Unity라면, 턴 진행, 데미지, 연출, 레벨업 연출이 전부 WebGL 안에서 돌아간다. 그 사이엔 웹과 대화하지 않는다. 웹이 끼어드는 건 딱 두 순간이다.
-
- 배틀 시작 — 웹이 Unity를 띄우면서 ‘이번 배틀에 대한 데이터’를 넘긴다.
{ 내 파티(레벨 포함), 상대 파티, 배틀 종류 }
- 배틀 시작 — 웹이 Unity를 띄우면서 ‘이번 배틀에 대한 데이터’를 넘긴다.
-
- 배틀 종료 — Unity가 “결과”를 웹에 돌려주고 홈으로 빠진다.
{ 승패, 쓰러뜨린 상대, 획득 경험치, 레벨업 결과 }
- 배틀 종료 — Unity가 “결과”를 웹에 돌려주고 홈으로 빠진다.
그 사이 수십 턴이 오가도 통신은 0이다. 즉, 중간 통신이 구조적으로 없다는 의미다.
그렇다면 배틀에 대한 경험치와 레벨업 같은 시스템은 어디서 관리될까?
배틀이 전부 Unity로 돌아간다면, 경험치 누적과 레벨업 판정도 Unity에서 하는게 자연스럽다. 매 전투의 경험치를 Unity가 들고 있다가 배틀 종료 시점에 정산하면 된다.
다만 변조 방지 한 가지는 남는다.
WebGL은 클라이언트라, Unity가 ‘레벨 100됐다’고 보낸 값을 그대로 믿고 DB에 저장하면 데이터가 조작될 위험이 있다.
따라서
- Unity가 계산 + 연출까지 다 관리 (사용자 경험은 Unity 안에서 해결)
- → 배틀 종료 시 결과 전달
- 서버는 받은 결과를 그대로 믿지 않고 “검산”만 함
- 쓰러뜨린 상대 base_exp 합이 보낸 경험치와 맞는가?
- 레벨이 비정상적으로 점프하지 않았는가?
- 이를 통과하면 저장, else 거절.
- 즉, 계산과 연출은 Unity가 하되, 서버는 최종 저장 전에 한 번 검증한다.
이러면 Unity 안에서 레벨업이 일어나는 시나리오를 그대로 가져갈 수 있고, 클라이언트 데이터 변조를 막을 수 있다.
- #TIL
- #Unity