-
18장. 좀비 서바이버 멀티플레이어 : 네트워크 이론과 로비 구현Unity/레트로의 유니티 게임 프로그래밍 에센스 2021. 5. 21. 11:59
18.1 네트워크 동기화
- 4인 멀티플레이어 게임에서 플레이어 캐릭터는 총 16명이다.
- 각자 컴퓨터에 4개의 캐릭터가 존재.18.1.1 로컬과 리모트
- 로컬 오브젝트 : 주도권이 자신에게 있음
- 리모트 오브젝트 : 주도권이 네트워크 너머의 타인에게 있음
18.1.2 동기화
18.1.3 로컬 권한 검사
- 로컬의 플레이어 게임 오브젝트의 update() 등에서 확인.
18.2 게임 서버의 종류
18.2.1 전용 서버
- 서버의 모든 자원이 온전히 네트워크 서비스를 유지하는 데 사용.
- 서버가 플레이어로서 게임에 직접 참가하지 않는 형태. 서버 자신이 클라이언트가 아닐 때.
18.2.2 리슨 서버
- 전용 서버가 없는 대신 플레이어 클라이언트 중 하나가 서버 역할. Play as Host.
- 호스트 플레이어의 컴퓨터 성능에 따라 네트워크 품질이 크게 달라짐.
- 호스트가 게임 종료할 경우, 진행 중인 게임을 일시 정지하고 남은 클라이언트 중에서 새로운 호스트를 선정하는 절차가 필요(Host Migration)
18.2.3 P2P
- 게임에 참가한 클라이언트들 모두가 호스트 역할을 겸함. 서로 직접 연결된 형태.
- 일반적으로 서버는 연산을 담당해야하고, 서버가 하나일 경우 혼자서 전부 부담해야함.
- 서로가 연결되어 있어서 각자 자신의 월드 연산을 실행하고 다른 클라이언트들에게 전파.
- 참가자가 증가할수록 반응 속도가 눈에 띄게 느려짐. 통상 16명을 참가자 상한선. 인원 대비 유지해야하는 연결 회선의 개수가 많음. 16x15
- 수치 변조에 제일 취약.
18.2.4 매치메이킹 서버
18.2.5 포톤 룸
- 포톤의 룸은 유니티의 씬과 다른 계층에서 동작.
18.3 네트워크 권한 분리
18.3.1 호스트에 위임
- 중요한 연산을 호스트에 위임하는 2가지.
1) 동기화에 오차가 존재하는 경우 기준이 되는 월드를 정하기 위해
2) 클라이언트의 변조나 위조 행위를 막기 위해
18.3.2 RPC
- RPC(원격 프로시저 호출)
18.4 포톤 준비하기
18.4.1 포톤과 UNet
- UNet은 기본 내장된 공식 라이브러리. 2019이후에 다른 것으로 대체 예정.
18.4.2 PUN 2
- 포톤은 다양한 플랫폼과 게임 엔진을 지원하는 네트워크 종합 솔루션.
- PUN(Photon Unity Network) : 유니티용으로 제작된 포톤 네트워크 엔진.
18.5 로비 만들기
18.5.1 Lobby 씬 살펴보기
- Main Camera, Canvas, EventSystem : 신을 만들거나 새로운 UI 게임 오브젝트를 생성할 때 기본으로 생성되는 게임 오브젝트.
- Connection Info Text 게임 오브젝트의 텍스트 컴포넌트와 Join Button 게임오브젝트의 버튼 컴포넌트가 할당.
- Button 컴포넌트의 Interactable이 해제되면 사용자는 해당 버튼을 클릭할 수 없음.
18.5.2 LobbyManager 스크립트
- Photon.Realtime : 포톤의 실시간 네트워크 게임 개발용 C# 라이브러리
- Photon.Pun : Photon.Realtime을 포함한 포톤 C# 라이브러리를 유니티 게임 오브젝트와 컴포넌트로 사용할 수 있게 하는 PUN 라이브러리.
- MonoBehaviourPunCallbacks
> MonoBehaviour를 확장한 클래스로, Photon.Pun에서 제공.
> MonoBehaviour의 기능을 유지한 채 컴포넌트가 포톤 서비스에 의해 발생하는 콜백을 감지할 수 있게 함.
> PUN 구현 한계상 포톤 전용 이벤트는 override를 사용하여 구현해야 함.
18.5.3 Start() 메서드
18.5.4 OnConnectedToMaster() 메서드
18.5.5 OnDisconnected() 메서드
18.5.6 Connedt() 메서드
18.5.7 OnJoinRandomFailed() 메서드
18.5.8 OnJoinedRoom() 메서드
- OnJoinedRoom() 메서드는 룸 참가에 성공한 경우 자동 실행됨. PhotonNetwork.CreateRoom()을 사용해 사진이 룸을 직접 생성하고 참가한 경우에도 OnJoinedRoom()이 실행됨.
- 보통 대기(준비) 시간이 있음.
- SceneManager.LoadScene("Main") : 이전 씬의 모든 게임 오브젝트를 삭제하고 다음 씬을 로드하므로 로비 씬의 네트워크 정보가 유지되지 않음. 또한 플레이어들이 서로 동기화 없이 각자 Main 씬을 로드하기 때문에 다른 사람의 캐릭터가 보이지 않음.
- PhotonNetwork.LoadLevel():
> 룸의 플레이어들이 '함께 새로운 무대로 이동'하는 메서드. 방장이 PhotonNetwork.LoadLevel() 메서드를 실행하면 다른 플레이어들의 컴퓨터에서도 자동으로 PhotonNetwork.LoadLevel()이 실행되어 방장과 같은 씬을 로드함.
> 다른 플레이어가 단독으로 실행할 수 있으나. 혼자 실행되어 씬에 혼자 있는 상황이 발생할 수 있음.
> PhotonNetwork.LoadLevel()은 뒤늦게 입장한 플레이어를 위한 별도의 작업을 구현할 필요가 없음.
18.5.9 완성된 LobbyManager 스크립트
18.6 마치며
'Unity > 레트로의 유니티 게임 프로그래밍 에센스' 카테고리의 다른 글
19장 좀비 서바이버 멀티플레이어 : 네트워크 게임 월드 구현 (0) 2021.07.20 17장 좀비 서바이버 : 최종 완성과 포스트 프로세싱 (0) 2021.05.20 16장 좀비 서바이버 : 생명과 좀비 AI (0) 2021.02.17 15장 좀비 서바이버 : 총과 슈터 (0) 2021.02.13 14장. 좀비 서바이버 : 레벨 아트와 플레이어 준비 (0) 2021.02.12