1 분 소요

Intro

이번 포스팅에서는 매칭된 플레이어간의 실시간 동기화를 구현해보았다.

PhotonView 컴포넌트

네트워크 상에서 동기화가 필요한 오브젝트에는 반드시 PhotonView 컴포넌트가 있어야한다.

PhotonView는 해당 오브젝트가 네트워크 상에서 어떤 객체인지 식별하고, 어떤 데이터를 동기화할지 관리한다.

image

플레이어간 동기화가 되어야하는 오브젝트는 View ID가 동일해야한다.


Photon View 컴포넌트에는 Observed Components라는 리스트를 가지고있는데

리스트에 할당된 컴포넌트의 변화를 관측하고, 로컬 게임 오브젝트의 변화를 네트워크를 통해 리모트 게임 오브젝트에게 전달한다

또한 리모트 게임 오브젝트에 추가되어있던 Photon View 컴포넌트는 로컬에서 건너온 정보를 자신의 게임오브젝트에 할당하는 역할을 한다.

Photon Transform View 컴포넌트

image

Photon Transform View 컴포넌트는 네트워크상에서 게임오브젝트의 위치, 회전, 스케일을 동기화하기위한 컴포넌트이다.

따라서 이동, 회전, 크기변화등이 동기화되어야하는 오브젝트에는 반드시 Photon Transform View 컴포넌트가 있어야한다.

Photon Animator View 컴포넌트

Photon Animator View 컴토넌트는 Animator 파라미터값을 자동으로 동기화하여

내가 실행한 애니메이션이 다른 클라이언트에서도 동기화되어 재생되게해주는 컴포넌트이다.


image

Photon Animator View 컴포넌트는 아래 몇가지 설정이 필요하다.

  • Synchronize Layer Weights : 애니메이터의 레이어
    • 내 오브젝트 Animator에는 Base Layer만 존재하여 Layer0이 할당됨.
  • Synchronize Parameters : 애니메이터의 파라미터
    • 내 오브젝트의 파라미터들이 자동으로 할당
    • Disable -> 동기화하지 않음
    • Discrete -> 변경이 생겼을 때만 동기화(Bool, Trigger 등)
    • Continuous -> 매 프레임 동기화(Float 등)

또한 Photon View 컴포넌트에서 아래 항목을 Realiable Delta Compressed 로 바꿔주어야한다.

image

오브젝트 생성

네트워크상에 동기화될 오브젝트는 PhotonNetwork.Instantiate() 메서드를 통해 생성해야한다.

Photon이 자동으로 ViewID를 할당하고, 모든 클라이언트에 동일한 오브젝트를 생성한다.

사용방법은 일반 Instantiate() 와 같다.

  • 주의 : 생성할 게임 오브젝트 프리팹은 반드시 Resources 폴더안에 있어야한다.

RPC

RPC는 내가 호출한 메서드를 다른 플레이어에서도 실행되게 만들어달라는 요청이다.

즉, 내가 점수를 획득해서 UpdateScore() 메서드 호출을 통해 UI를 업데이트하려고할때

모든 플레이어도 동일하게 UpdateScore() 메서드를 호출해서 모든 클라이언트에서 동일한 점수상황을 공유할 수 있도록 하는것이다.


스크립트상에서는 어트리뷰트로 메서드를 정의한다.

[PunRPC]
void UpdateScore(int amount)
{
    score += amount;
}

RPC 메서드를 호출할때는 PhotonView를 통해 호출한다.

photonView.RPC("UpdateScore", RpcTarget.All, 3);        // 모든 클라이언트에서 호출

RpcTarget의 종류는 다음과같다.

  • All : 모든 클라이언트(호출자 포함)
  • Others : 나를 제외한 모든 클라이언트
  • AllBuffered : 나중에 룸에 들어오는 사람도 실행됨
  • MasterClient : 마스터 클라이언트만
  • AllViaServer : 서버 전체 실행

마스터클라이언트 구분

호스트(마스터클라이언트)는 기본적으로 Room에 먼저 입장한 플레이어가된다.

만약 호스트가 방을 떠나게되면, 다른 플레이어가 호스트가된다.

게임의 진행 로직(게임 시작, 몬스터 소환 등)은 반드시 호스트가 처리하도록 설계해야한다.

PhotonNetwork.IsMasterClient로 현재 플레이어가 마스터인지 확인할 수 있다.

태그: ,

카테고리:

업데이트:

댓글남기기