Krong Dev.
아카이브 목록

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

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

우선 통신에 대해 시각화를 하면 위와 같다.

웹 ↔ Unity 통신이 무엇인가?

웹페이지 안에 Unity WebGL이 들어가면, 같은 브라우저 안에서 자바스크립트와 Unity(C#)가 함수를 서로 호출하는 관계가 된다. 거창한 네트워크 통신이 아니라 같은 페이지 안의 함수 호출이다.

  • JS → Unity : UnityInstance.SendMessage("객체명", "함수명", "문자열 데이터")
  • Unity → JS : jslib 파일에 정의한 JS 함수를 C#에서 호출
  • 방향이 둘 다 있고, 주고 받는 건 보통 JSON 문자열 하나이다.
  • 따라서 통신은 총 2번만 이루어진다.

배틀 페이지 전체가 Unity라면, 턴 진행, 데미지, 연출, 레벨업 연출이 전부 WebGL 안에서 돌아간다. 그 사이엔 웹과 대화하지 않는다. 웹이 끼어드는 건 딱 두 순간이다.

    1. 배틀 시작 — 웹이 Unity를 띄우면서 ‘이번 배틀에 대한 데이터’를 넘긴다.
      { 내 파티(레벨 포함), 상대 파티, 배틀 종류 }
    1. 배틀 종료 — Unity가 “결과”를 웹에 돌려주고 홈으로 빠진다.
      { 승패, 쓰러뜨린 상대, 획득 경험치, 레벨업 결과 }

그 사이 수십 턴이 오가도 통신은 0이다. 즉, 중간 통신이 구조적으로 없다는 의미다.

그렇다면 배틀에 대한 경험치와 레벨업 같은 시스템은 어디서 관리될까?

배틀이 전부 Unity로 돌아간다면, 경험치 누적과 레벨업 판정도 Unity에서 하는게 자연스럽다. 매 전투의 경험치를 Unity가 들고 있다가 배틀 종료 시점에 정산하면 된다.

다만 변조 방지 한 가지는 남는다.

WebGL은 클라이언트라, Unity가 ‘레벨 100됐다’고 보낸 값을 그대로 믿고 DB에 저장하면 데이터가 조작될 위험이 있다.

따라서

  • Unity가 계산 + 연출까지 다 관리 (사용자 경험은 Unity 안에서 해결)
  • → 배틀 종료 시 결과 전달
  • 서버는 받은 결과를 그대로 믿지 않고 “검산”만 함
  • 쓰러뜨린 상대 base_exp 합이 보낸 경험치와 맞는가?
  • 레벨이 비정상적으로 점프하지 않았는가?
  • 이를 통과하면 저장, else 거절.
  • 즉, 계산과 연출은 Unity가 하되, 서버는 최종 저장 전에 한 번 검증한다.

이러면 Unity 안에서 레벨업이 일어나는 시나리오를 그대로 가져갈 수 있고, 클라이언트 데이터 변조를 막을 수 있다.

  • #TIL
  • #Unity