Unity/TIL

Unitu 멀티플레이 게임

김차루 2024. 6. 13. 21:07
스파르타 내배캠 39일차 TIL
C3조_ 이석삼조

 

 

 

※ 노션 정리※

 

요즘 잘 팔린 PC게임 중에 멀티 플레이가 아닌 게임이 있을까? 지금 머릿속에 떠오르는 것만 봐도 파스모포비아, 어몽어스, 구구덕스, 리썰 컴퍼니 등등... 인기 많았던 인디 게임의 대부분은 멀티 플레이었다. 지표를 확인하면 이 현상은 곧 사실이 되는 만큼 멀티 플레이 게임은 성행 중이다. 게임 개발을 공부하는 입장으로서 멀티 플레이는 꼭 알고 넘어가야 하는 부분이 됐다. 

 

 

그럼 멀티플레이 게임을 제작할 때 유의해야할 사항은 어떤 것이 있을까? 

 

 

멀티 플레이 게임 유의사항

1. 비동기 로직

서버에서 처리되는 로직들은 비동기적으로 처리된다. 즉, 결과를 바로 활용하는 것이 아닌 콜백 등을 통하여 처리 결과를 받아 이어서 처리하는 방식이다. 이 과정에서 프로그램의 복잡도가 매우 높아지며, 이를 관리하기 위해 코루틴이나 UniTask와 같은 비동기 처리를 전문적으로 하는 프레임워크를 사용하기도 한다. 

2. 틱 빈도

틱 빈도는 게임 서버가 로직을 업데이트하는 빈도이다. 높은 틱률은 더 부드럽고 정확한 게임 플레이를 제공하지만 네트워크 및 서버 부하를 증가시킨다. 

3. 지연

네트워크 지연 시간은 플레이어 간의 상호작용을 심각하게 저해할 수 있다. 재연결 시 어떻게 처리될 지에 대한 방법을 정의해야 한다. 

4. 검증

클라이언트 측에서 수행된 작업의 서버 측 검증은 부정 행위 방지에 중요하다. 또한, 입력 검증을 통해 서버가 예상치 못한 동작을 하는 것을 방지할 수 있다. 

 

포톤

이런 점을 모두 고려하면서 멀티 서버를 구현할 수 있는 프레임워크로 포톤(Photon)이 있다. 포톤은 멀티플레이어 게임 개발을 위한 네트워크 엔진이다. 포톤에서도 여러 종류의 멀티 방식을 제공하는데 강의에서는 pun2를 활요하였다. 

 

포톤 pun2 특징

  • Real-time, Multiplayer : 포톤은 실시간 멀티플레이어 게임 개발에 초점을 맞추고 있다.
  • Dead-easy API : 초보자도 할 수 있는 쉬운 API 구성을 가지고 있다.
  • Loadbalanced : 별도의 설정 없이 CCU 증가에 따른 대응 별도 설정 필요 없다. 

 

주요 클래스

1. PhotonNetwork 클래스

포톤 네트워크의 주요 기능에 액세스하는 중심적인 클래스이다.

1.1 ConnectUsingSettings 메서드

PhotonNetwork.ConnectUsingSettings();

 : 앱이 포톤 클라우드에 연결된다. 연결 상태는 PhotonNetwork.IsConnected로 확인 가능하다.

 

1.2 CreateRoom 및 JoinRoom 메서드

PhotoneNetwork.CreateRoom("RoomName");
photonNetwork.JoinRoom("RoomName");
photonNetwork.JoinOrCreateRoom("RoomName");

: createroom 메소드는 새로운 방을 만들고, joinroom 메서드는 이미 존재하는 방에 참가한다.

 

1.3 Instantiate 메서드

photonNetwork.instantiate("PrefabName", position, rotation);

: 포톤 네트워크를 통해 새로운 게임 오브젝트를 생성한다. 이 메서드는 Unity의 Instantiate 메서드와 유사하나, 네트워크를 통해 동기화된다.

 

2. MonoBehaviourPunCallbacks 클래스

MonoBehaviourPunCallbacks 클래스는 포톤의 주요 이벤트에 대한 콜백 메서드를 제공한다. 

2.1 OnConnectedToMaster 메서드

public override void OnConnectedToMaster() {...}

: 게임이 포톤 마스터 서버에 성공적으로 연결되면 호출된다.

 

2.2 OnJoinedRoom 메서드

public override void OnJoinedRoom() {...}

: 로컬 플레이어가 방에 입장하면 호출된다.

 

2.4 OnPlayerEnteredRoom 메서드

public override void OnPlayerEnteredRoom(Player newPlayer) {...}

: 다른 플레이어가 방에 입장하면 호출된다. 

 

 

주요 컴포넌트 및 기능

1. PhotonView

photonView는 포톤 네트워크에서 네트워크 상태를 동기화하는 데 사용된다. 이 컴포넌트를 통해 PhotonNetwork.Instantiate를 사용해 생성된 객체가 네트워크를 통해 동기화된다. 

2. PhotonTransformView

PhotonTransformView는 위치, 회전, 및 크기를 동기화하는 데 사용되는 컴포넌트이다. PhotonView에 추가하여 사용하며, 이 컴포넌트를 통해 게임 오브젝트의 움직임이 네트워크를 통해 동기화된다.

3. PhotonAnimatorView

PhotonAnimatorView는 Animator 컴포넌트를 동기화하는 데 사용된다. 이 컴포넌트는 PhotonView와 함께 사용되며, 애니메이션 상태와 변수를 동기화하는 데 사용된다.

4. PhotonRigidbodyView

PhotonRigidbodyView는 Rigidbody 또는 Rigidbody2D 컴포넌트를 동기화하는 데 사용된다. 이 컴포넌트는 움직임과 회전을 동기화하여 물리적 효과를 네트워크를 통해 동기화할 수 있다.

5. RPC

RPC는 Remote Procedure Call의 약자로, 다른 유저들의 클라이언트에서 메소드를 실행 시킬 수 있도록 한다. 포톤에서 RPC로 실행하기 위해서는 메소드에 [PunRPC] 어트리뷰트를 추가해야 하며, RPC를 실행할 때는 PhonView.RPC("RPC메소드명", RPC타겟, [파라미터]);으로 작성해야 한다.