본문 바로가기
Unity 공부

[Unity] Photon Serialization - RPC 동기화 가능한 데이터 타입

by 개발하는 디토 2022. 11. 8.

Photon에서 RPC를 통해 동기화할 때나 PhotonSerializeView를 통해 동기화할 때나 동기화할 수 있는 데이터 타입에 제한이 있다. 특히 Photon을 사용할 때 게임 오브젝트 자체를 동기화하려고 하면 안 되는 경험을 많이 해보았을 것이다. Photon에서 동기화할 수 있는 데이터 타입에 제한이 있어서 그렇다. 동기화하고자 하는 변수가 지원하는 데이터 타입에 포함되어 있지 않으면 동기화할 수 없고, 따로 사용자 정의를 통해 동기화해주어야 한다.

 

아래 사이트에 들어가면 친절하게 설명되어 있다.

Photon에서 동기화할 수 있는 데이터 타입

 

Photon의 직렬화(Serialization) | Photon Engine

 

doc.photonengine.com

 

 

정리하자면, 기본적인 C# 데이터 타입은 지원하나, 그 외의 데이터 타입은 직접 사용자 정의하여 Photon에게 알려주어야 한다는 말이 된다.

 

기본 숫자, 문자열

웬만한 숫자와 문자열 타입은 다 되는 것을 알 수 있다. char는 안 되는 것 같으니 string으로 넘기자.

타입 (C#) 크기 [bytes] 설명
byte 2  bit unsigned
boolean 2 true or false
short 3 16 bit
int 5 32 bit
long 9 64 bit
float 5 32 bit
double 9 64 bit
string 3 + size( UTF8.GetBytes(string) ) < short.MaxValue length

 

Array, Hashtable, Dictionary

int[], float[] 등 배열도 넘길 수 있다.

타입 (C#) 크기 [bytes] 설명
byte-array 5 + 1 * length < int.MaxValue length
int-array 5 + 4 * length < int.MaxValue length
<type>배열 4 + size(entries) - count(entries) < short.MaxValue length
hashtable 3 + size(keys) + size(values) < short.MaxValue pairs
dictionary 3 + size(keys) + size(values) < short.MaxValue pairs
K- 또는 V-타입이 객체인 경우 추가적인 크기

 

 

추가 지원

Transform, Image 같은 component는 곧바로 동기화할 수 없고, 그 안에 든 데이터 중 동기화하고 싶은 부분을 수치로 넘겨 동기화해주어야 한다. Vector3를 지원하므로 Transform의 Position, Scale 등을 넘길 수 있겠고 Rotation은 Quaternion을 사용하면 될 것이다.

또한 Photon View는 Player의 Actor Number 값으로 참조 가능하므로 view id(actor number 값)를 보내면 Photon View를 찾아 동기화될 수 있는 것 같다.

타입 (C#) 크기 [bytes] 설명
Vector2 12 2 floats
Vector3 16 3 floats
Quaternion 20 4 floats
PhotonPlayer 8 integer PhotonPlayer.ID

 

추가로 문서에서 아래와 같이 언급하고 있으므로 Photon Player는 Photon.Realtime.Player로 이해하고, PhotonPlayer.ID는 Player.ActorNumber로 이해하면 되겠다. 아마도 Serialization 문서가 업데이트가 안 되고 방치된 것 같다.

  • PhotonPlayer class is now Photon.Realtime.Player (constructor is no longer public)
  • PhotonPlayer.ID is now Photon.Realtime.Player.ActorNumber

 

사용자 정의 방식은 아직까지 해보지 않았다. 위 사이트에 예제 코드가 첨부되어 있으니 그쪽을 참고하길!

하지만 초보 수준에서는 기본으로 지원하는 데이터 타입에 맞춰 핵심적인 변수만 동기화하고, 그 변수를 받아서 함수를 실행시키는 쪽이 빠르고 쾌적한 것 같다.

댓글