Unity에서의 서버(포톤)
로컬 권한 검사
내 입력은 내 캐릭터에서만 작동되어야지 리모트 플레이어까지 작동되면 안된다. 오브젝트가 로컬권한을 가지고 있는지 검사해야 합니다.
서버의 종류
전용서버
- 서버의 모든 자원이 온전히 네트워크 서비스를 유지하는데 사용되며, 서버가 플레이어로서 게임에 직접 참여하지 않는 형태
- 전용서버는 다른 서버 방식에 비해 고정비용이 많이 발생한다.
리슨서버
- 전용 서버가 없는 대신 플레이어 클라이언트 중 하나가 서버 역활을 한다.
- 게임에 플레이어로 참가하기 때문에 'Play as Host' 라고 부른다.
- 리슨 서버 방식에서는 호스트 플레이어의 컴퓨터 성능에 따라 네트워크 품질이 크게 달라 진다.
- 호스트가 게임을 종료 할 경우 진행 중인 게임을 일시 정지하고 남은 클라이언트 중에서 새로운 호스트를 선정하는 절차가 필요하다.
P2P
- 게임에 참가한 클라이언트 모두가 호스트의 역활을 겸합니다.
- 클라이언트가 각자 자신의 월드에서 자신의 담장 연산을 실행하고 다른 클라이언트에 결과를 전파합니다.
- 서버 유지비용 또한 발생하지 않으며 클라이언트끼리 직접 연결되기 때문에 클라이언트 수가 적은 경우에 한해서 다른 방법보다 네트워크 반응 속도가 빠릅니다.
- 참가자가 증가할수록 반응 속도가 눈에 띄게 느려집니다. (16명 상한성 -> 이것도 많다)
- 수치 변조(해킹)에 제일 취약합니다.
- 기본적인 서버의 구조는 호스트가 있으면 중요한 연산과 데이터는 호스트에서 관리하고, 클라이언트는 호스트의 실행 결과만 받기 때문에 클라이언트가 중요한 연산과 수치를 위조하는 겻이 상대적으로 어렵다.
- 하지만 P2P 방식에서는 각 클라이언트가 연산을 실행하고 서로 동기화 하기 때문에 특정 중요 수치를 위조하여 다른 클라이언트에 전파할 위험이 크다.
매치메이킹 서버
- 참가할 클라이언트들이 방 하나에 모이는 과정에서 사용할 서버
포톤 룸
- 네트워크를 통해 여러 클라이언트가 하나의 세션에 모여야 한다.
- 포톤에서 여러 클라이언트가 모인 네트워크상의 가상의 공간을 룸이라는 단위로 부릅니다.
네트워크 권한 분리
- 네트워크 게임은 공정한 결과를 보장하고 수치에 대한 위변조를 방지해야 한다.
- 서버와 클라이언트 사이의 권한을 분리하여 중요한 연산은 모두 서버(호스트)에 위임 하라는 규칙을 지켜야 한다.
호스트에 위임
- 호스트에 위임하는 두 가지 대표적인 이유
- 동기화에 오차가 존재하는 경우 기준이 되는 월드를 정하기 위해
- 클라이언트의 변조나 위조 행위를 막기 위해
- 네트워크 동기화는 전송 속도나 패킷 손실이라는 현실적인 문제 때문에 완벽하지 않다.
- 호스트가 아닌 클라이언트의 동작은 동작을 하는 척만 하고 실제 동작흔 호스트에서 일어난다.
- 위변조가 일어난 클라이언트의 비정상적인 동작은 호스트에서는 적용되지 않는다.
RPC
- 호스트에 처리를 위임하고 호스트가 처리 결과를 클라이언트에 전파하려면 RPC(remote procedure call, 리모트 프로시저 콜)를 구현해야 합니다.
- [PunRPC]로 선언된 메소드는 다른 클라이언트에서 원격 실행될 수 있습니다.
좀비 서바이벌 네트워크 실습
PUN
- PhotonNetwork
- 포톤과 관련된 여러가지 기능을 제공
- API
- ConnectUsingSettings() : 매치메이킹 서버에 접속한다.
- PhotonServerSettings 스크립터블 오브젝트에서 서버와 관련된 여러 가지 데이터 설정 가능
- JoinRandomRoom() : 현재 접속 가능한 방 중 임의로 접속한다.
- LoadLevel() : 방에 있는 모든 클라이언트를 특정 씬으로 이동시킨다.
- CreateRoom() : 방을 생성한다.
- MonoBehaviorPunCallbacks
- MonoBehaviour에 관련된 콜백 메소드를 제공
- PhotonView
- MonoBehaviourPun
- photonView 제공
- photonView 컴포넌트가 추가되어야 함