본문 바로가기
개발/Unity 내일배움캠프 TIL

Unity 포톤 (Photon)

by 석시 2023. 10. 11.



포톤 (Photon) 은 멀티플레이를 구현하는 솔루션 중 가장 유명한 네트워크 엔진 중 하나이다.

여러 엔진에 적용 가능하고, 크로스플랫폼 간 통신도 지원하는 등 매우 강력한 기능들을 지원한다.


포톤 기본 기능

포톤의 가장 기본적인 기능은 포톤 클라우드와 연결을 설정하는 메서드와 연결된 클라우드와 클라이언트 간 동기화 기능들이 있겠다.

PhotonNetwork

PhotonNetwork 클래스는 포톤의 주요 기능을 담은 클래스로, 주로 연결을 설정하는 기능들을 담고 있다.

1) ConnectUsingSettings()

PhotonNetwork.ConnectUsingSettings();

클라이언트와 포톤 클라우드를 연결하는 메서드이다.

연결되었는지 아닌지는 PhotonNetwork.IsConnected로 확인할 수 있다.

2) CreateRoom() & JoinRoom()

PhotonNetwork.CreateRoom("RoomName");
PhotonNetwork.JoinRoom("RoomName");

CreateRoom 메서드로 새로운 방을 만들고 JoinRoom으로 만들어진 방에 참가하는 기능이다.

3) Instatiate()

PhotonNetwork.Instantiate("PrefabName", position, rotation);

기능은 Unity의 Instantiate와 완전히 똑같다.

차이라면 Unity의 Instantiate는 클라이언트에서 오브젝트를 생성하고, Photon의 Instantiate는 서버에서 오브젝트를 생성한다.

서버에서 오브젝트가 생성되면 각 클라이언트들을 서버의 정보를 가지고 동기화를 시켜주는데, 클라이언트에서 오브젝트를 생성하게 되면 자동으로 동기화를 해주지 않기 때문에 내 클라이언트에서 생성한 오브젝트는 다른 클라이언트에서 보이지 않게 된다.

물론 뒤에 소개할 포톤뷰 컴포넌트들을 사용한다면 클라이언트에서 생성된 오브젝트더라도 서버와 동기화가 가능해진다.

MonoBehaviourPunCallbacks

포톤의 주요 이벤트들에 대한 콜백 메서드를 담고 있는 클래스이다.

1) OnConnectedToMaster()

public override void OnConnectedToMaster() { ... }

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

포톤 마스터 서버는 포톤 서비스를 제공하기 위한 가장 기본 네트워크이다.

2) OnJoinedRoom() & OnPlayerEnteredRoom()

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

OnJoinedRoom은 내가 방에 입장했을 때, OnPlayerEnteredRoom은 다른 플레이어가 방에 입장했을 때 호출되는 콜백 메서드이다.


포톤뷰 (PhotonView) 컴포넌트

포톤에서 가장 중요한 동기화를 위해 사용되는 컴포넌트들이다.

해당 컴포넌트들을 게임 오브젝트에 달아줘야 그 컴포넌트에서 지원하는 동기화가 가능해진다.

PhotonView

포톤뷰 컴포넌트를 달아주면 포톤뷰에서 해당 오브젝트에 변화가 없는지를 계속 관찰하게 되고, 값을 변경하면 Syncronization 과정을 거쳐 동기화를 해주게 된다.

Ownership이라는 것은, 포톤의 소유권을 의미하는 것이다.

기본적으로 소유권은 게임오브젝트를 생성한 곳 (서버 or 각 클라이언트) 에서 갖게 된다.

Fixed면 소유권이 항상 고정되어 있는 상태, Takeover는 다른 클라이언트가 소유권을 가져올 수 있는 상태, Request는 현재 소유권을 가지고 있는 곳에다가 소유권을 달라고 요청할 수 있는 상태(거절가능)이다.

Syncronizatiton에서는 동기화를 어떤 방식으로 해줄 것인지를 결정한다.

Off는 받은 데이터를 비교해서 변화가 없을 경우 동기화 신호를 보내지 않고, Unreliable은 일정 주기마다 계속 신호를 보낸다. Unreliable On Change는 데이터 변화가 있을 때마다 신호를 계속 보내는 것이다.

UnreliableUnreliable On Change는 모두 Observed Component에 동기화할 컴포넌트를 등록시켜줘야 변화를 관찰하고, 신호를 보내주게 된다.

Observed Component 추가 PhotonView

기본적인 동기화는 PhotonView를 통해 이루어지고, Observed Component에 추가하여 동기화할 컴포넌트들을 추가시켜줄 수 있다.

1) PhotonTransformView

PhotonTransformView는 말그대로 Transform의 동기화를 위해 사용된다.

게임 오브젝트의 위치, 회전, 크기 등의 동기화를 수행한다.

2) PhotonAnimatorView

PhotonAnimatorView는 Animator 동기화를 위해 사용된다.

애니메이션 상태 및 변수 등이 동기화된다.

3) PhotonRigidbodyView

PhotonRigidbodyView는 Rigidbody나 Rigidbody2D를 동기화하는데 사용된다.

물리적 효과를 네트워크를 통해 동기화하는 것이다.


Uploaded by N2T