ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 마치며

    댓글

Designed by Tistory.