.NET Platform SDK

.NET, Unity 와 Windows Phone 의 Photon 클라이언트 라이브러리 문서 및 레퍼런스 입니다.

개요

Photon 은 다양한 플랫폼 상에서 실시간 멀티플레이어 게임과 어플리케이션을 구축하기 위한 개발 프레임워크 입니다. Photon 은 여러 플랫폼에 대한 서버 SDK 와 클라이언트 SDK 로 구성되어 있습니다. Photon 은 UDP 기반(또는 대안의 TCP) 으로 한 낮은-레이턴시 통신-레이어를 제공 합니다. "커맨드"내에 데이터를 신뢰 또는 비신뢰로 전송할 수 있습니다. 이 기반위에 오퍼레이션- 과 이벤트-프레임워크가 게임의 개발을 쉽게 할 수 있습니다.

각 플랫폼에 대한 게임이 다르기 때문에 서버 SDK 에 대한 예제를 코드 기반으로 포함된 여러 개의 "서버 어플리케이션"을 개발하여 기본적인 로직을 제공합니다.

"Lite" 어플리케이션 은 룸 기반 멀티플레이어 게임에서 유용하다고 생각하는 기본 오퍼레이션들을 제공 합니다. 여기에는 클라이언트 API 의 일부로 오퍼레이션과 이벤트가 포함되어 있습니다.

"LoadBalancing" 어플리케이션 으로 게임에 대한 여러 대의 서버를 운영할 수 있도록 합니다. 마스터 서버는 게임의 생성과 참여를 조정 합니다. SDK 에는 이 어플리케이션을 사용할 수 있는 특별한 API 가 있습니다.

"MMO" 어플리케이션.

Photon 클라우드는 Photon 게임들을 호스트 해 주는 서비스 입니다.
Photon 클라우드를 사용하기 위해서는 photonengine.com 에 가입하고 로드밸런싱 API와 데모를 이용하여 개발을 시작 하세요.

Photon 작업흐름

클라이언트에서 어떻게 동작이 되는지 파악 하기 위해서 우리는 서버의 Lite 로직을 이용할 것 입니다.
이 어플리케이션은 생성된 룸을 정의 하며 언제 룸에 사용자들이 참여 하는지에 대해서 정의 합니다. 각 사용자는 룸에서 자신만의 숫자를 가지고 액터가 됩니다.

간단한 작업흐름은 다음과 같습니다:

  • LitePeer 인스턴스를 생성 합니다
  • 지금부터: Service 를 주기적으로 호출하여 이벤트를 수신하고 명령어를 보냅니다 (예, 초당 10회)
  • Connect 를 호출하여 서버에 접속 합니다.
  • 라이브러리가 OnStatusChanged 를 호출 할 때 까지 기다립니다.
  • 리턴된 상태의 정수값은 StatusCode.Connect 와 같아야 합니다.
  • 게임에 들어가기 위해 OpJoin 을 호출 합니다.
  • 라이브러리가 opCode: LiteOpCode.Join 코드를 가진 OnOperationResponse 가 호출 할 때 까지 기다립니다.
  • OpRaiseEvent 호출하여 게임내로 데이터를 전송 합니다.
  • OnEvent 에서 이벤트를 수신 합니다.
  • 일반적인 상황에서 Lite 어플리케이션에는 몇 개의 유용한 이벤트들을 정의 하고 있습니다: 누가 룸에 참여 또는 떠났는지.
  • OpRaiseEvent 를 호출하여 생성된 이벤트들은 이 메소드의 동일한 룸에 있는 다른 플레이어들이 수신 하게 될 것 입니다.
  • 끝이 났을 때: LitePeer.OpLeave 를 호출하여 게임을 종료/떠나면 됩니다.
  • LiteOpCode.Leave 코드를 갖고 있는 OnOperationResponse 이 호출 될 때 까지 대기 합니다.
  • Disconnect 를 통하여 접속 해제 합니다.
  • statusCode:StatusCode.Disconnect 를 가진 OnStatusChanged 에서 "연결해제"를 체크 합니다.
    서버의 Lite 어플리케이션과 조합하여 이 간단한 작업 흐름을 통해 룸을 사용하고 게임의 이벤트를 전송할 수 있습니다.

사용된 메소드들은 세가지 레이어로 분리될 수 있습니다:

  • 로우 레벨: Service, Connect, DisconnectOnStatusChanged 는 직접적으로 서버에 연결하는 것을 의미 합니다.
    이 레벨은 전송 명령어(차례로 명령어를 나르는 것)인 UDP/TCP 패킷으로 동작합니다. 이것은 연결을 유지 하고 RPC 호출과 이벤트를 패키지로 구성 합니다.
  • 로직 레벨: Photon 에서는 오퍼레이션, 결과와 이벤트들이 로직 레벨을 구성 하고 있습니다. 모든 오퍼레이션은 서버에서 정의 되고(RPC 호출을 생각 해 보세요) 결과를 가지고 있습니다. 이벤트들은 서버로 부터 수신되고 클라이언트가 데이터를 통해 갱신 합니다.
  • 어플리케이션 레벨: 어플리케이션과 기능들로 구성 되어있습니다. 이 경우에 Lite 어플리케이션의 오퍼레이션과 로직을 사용합니다. 특수한 경우에 있어서 룸들과 액터들 등을 가지고 있습니다.

LitePeer 는 서버측 구현에 맞고 개발을 위하여 Wrap 되어 있습니다. 대부분의 경우에 있어서 로우 레벨 통신을 관리할 필요가 없습니다. 하지만 클라이언트에서 서버로 명령어를 보내는 모든 것을 아는 것이 좋습니다. 내부적으로 명령어들은 클라이언트와 서버간의 연결이 유지되도록 사용 되기도 합니다(추가적인 데이터의 운반 없이)
오퍼레이션인 모든 메소드들(RPC 호출)은 "Op" 라는 프리픽스를 가지고 있어 구분 될 수 있습니다.
다른 서버측 어플리케이션(MMO 또는 나만의 어플리케이션과 같이)은 다른 오퍼레이션들을 정의하게 될 것 입니다. 이러한 오퍼레이션들은 다른 파라미터들과 리턴 값을 가지고 있습니다.
이러한 오퍼레이션들은 클라이언트 라이브러리가 아니지만 OpCustom 을 호출하여 구현 될 수 있습니다.
IPhotonPeerListener 인터페이스는 콜백으로 반드시 구현되어야 합니다. 이것들은:

  • OnStatusChanged 는 피어 상태 변경을 위한 것 입니다(연결, 연결해제, 오류, StatusCode enum 과 비교 함)
  • OnOperationResponse 는 오퍼레이션들의 콜백 입니다. (참가, 나가기 등)
  • OnEvent 는 수신되는 이벤트의 콜백 입니다
  • DebugReturn 디버그 출력의 콜백 입니다 (릴리즈 빌드에서는 거의 사용되지 않습니다)
    다음의 PhotonPeer 내의 프로퍼티들은 특별한 목적이 있습니다:
  • TimePingInterval 은 ping-오퍼레이션 간의 시간을 설정 합니다
  • RoundTripTime 은 신뢰 오퍼레이션의 서버와 콜백에 대한 것 입니다
  • RoundTripTimeVariance 은 라운드 트립 시간 변동을 보여 줍니다
  • ServerTimeInMilliSeconds 은 서버의 시간을 지속적으로 근사치를 계산 합니다

오퍼레이션

오퍼레이션은 Photon 의 원격 프로시져 호출(RPC) 에 대하여 우리가 사용하는 용어 입니다. 오퍼레이션은 서버측에서 구현되고 클라이언트에서 호출되는 메소드로 설명 될 수 있습니다.
모든 메소드에 대해서 메소드들은 파라미터와 리턴 값을 가지고 있습니다. Photon 개발 프레임워크는 클라이언트에서 서버로의 RPC 호출과 결과값을 주는 것에 관여 하고 있습니다.
서버측, 오퍼레이션들은 Photon 의 상위에서 수행되는 어플리케이션의 일부분 입니다. Exit Games 에서 제공되는 디폴트 어플리케이션을 "Lite 어플리케이션" 또는 간단히 Lite 라고 부릅니다.
각 Lite 오퍼레이션의 메소드에 의해 LitePeer 클래스는 PhotonPeer 를 확장합니다.

Lite 오퍼레이션의 예제들은 "참가" 와 "이벤트 발생" 들이 있습니다. 클라이언트 측에서는 이 오퍼레이션들이 LitePeer 클래스에서 OpJoinOpRaiseEvent 로 구현 되어 있습니다.
이 오퍼레이션들은 Photon 과 Lite 어플리케이션 디폴트 구현에서 즉시 사용할 수 있습니다.

커스텀 오퍼레이션

Photon 의 게임에 필요한 특정한 기능들은 확장 가능 합니다.
월드의 상태를 지속 할 수 있거나 클라이언트로 부터 오는 정보를 더블 체크할 수 있습니다.
Lite 또는 MMO 어플리케이션 로직에 있지 않은 모든 어플리케이션은 커스텀 오퍼레이션이라고 합니다.
물론 이러한 커스텀 오퍼레이션을 생성하는 것은 일차적으로 서버측 작업입니다. 하지만 클라이언트는 서버의 새로운 함수/오퍼레이션을 사용해야 합니다.
클라이언트 측으로 부터 호출될 수 있는 오퍼레이션은 메소드 입니다. 이러한 오퍼레이션은 어떤 개수의 파라미터와 아무 이름이나 가질 수 있습니다.
대역폭은 보존하기 위해서 모든 오퍼레이션과 파라미터들에 대해서 바이트-코드를 지정 합니다. 정의는 서버측에서 수행됩니다.
각 오퍼레이션은 식별을 위해 자신만의 유일한 숫자를 가지고 있으며 이것은 오퍼레이션 코드 (opCode)로 알려져 있습니다.
오퍼레이션 클래스는 예상되는 파라미터들과 각각의 파라미터들에 대해 파라미터 코드를 지정 합니다.
이 정의를 통해 클라이언트 측은 값을 채워 서버에게 오퍼레이션의 opCode 가 알 수 있도록 해야 합니다.
Photon 은 오퍼레이션 요청, 응답과 이벤트들의 파라미터를 통합하기 위해서 Dictionary 를 사용 합니다.
오퍼레이션 호출을 위해서는 OpCustom 사용하고 Dictionary 안에 파라미터들을 제공 합니다.
클라이언트측 opCode 와 파라미터-코드들은 현재 바이트 타입 입니다(오버헤드 최소화를 위해).
이것들은 오퍼레이션을 성공적으로 호출 하기 위해서 서버측에 있는 정의와 일치 해야 합니다.

아래 문서를 더 읽어 보시는 것을 권장해 드립니다:

이벤트

오퍼레이션들과는 다르게 이벤트들은 "메시지"로 메시지들을 수신 받는 클라이언트들에 의해 드물게 트리거 됩니다.
이벤트들은 외부로 부터 오게 됩니다:서버 또는 다른 클라이언트들.
이벤트들은 오퍼레이션의 사이트 이펙트로 부터 생성되거나 (예: 룸에 참여 했을 때) 오퍼레이션 이벤트 발생의 주요 목적으로 발생 됩니다.
대부분의 이벤트들은 데이터의 형태로 전달되지만 이벤트 타입의 드문 경우에서는 자체가 메시지입니다.
이벤트들은 (하나 이상)임의 컨텐츠를 가지고 있는 딕셔너리 입니다. 이벤트의 "최상위-레벨"에서는 바이트들이 값의 키로서 사용 됩니다.
값들은 모든 직렬화 될 수 있는 타입이 될 수 있습니다. Lite 어플리케이션, 예를 들어 RaiseEvent 의 모든 커스텀 이벤트 컨텐츠의 HashTable을 사용 합니다.

아래 문서를 더 읽어 보시는 것을 권장해 드립니다:

프래그멘테이션과 채널

프래그멘테이션

더욱 큰 데이터는 하나의 패키지에 들어가지 못 할 것이기 때문에 이러한 데이터는 나누어져서 자동적으로 재조립됩니다.
데이터 크기에 따라서 하나의 오퍼레이션 또는 이벤트는 여러개의 패키지로 구성 될 수 있습니다.

이 사항은 다른 명령들을 멎게 할 수도 있다는 것을 알아 두세요. 필요 이상으로 더 자주 Service 또는 SendOutgoingCommands 를 호출 해 주세요. PhotonPeer.QueuedOutgoingCommands 가 0 이 되는 것을 주기적으로 체크하여 모든 것이 전송되는지 확인 해 주셔야 합니다. 또한 디버그 아웃풋에 "UDP package is full" 이 있는지 확인하여 영원히 타임아웃이 발생하지 않도록 해야 합니다.

최대 전송 단위

UDP 패키지의 최대 크기는 PhotonPeer.MaximumTransferUnit 프로퍼티를 통해 설정할 수 있습니다. 디폴트는 1200 바이트 입니다.
일부 라우터들은 이 UDP 패킷 크기에도 불구하고 단편화 할 것 입니다.
큰 크기가 필요 없으면 패키지별로 512 바이트를 사용하세요. 명령어당 더 많은 오버헤드가 있으나 잠재적으로는 더 안전합니다.
이 설정은 내부적으로 MTU 와 협상하는 TCP 연결에서는 무시됩니다.

시퀀싱

프로토콜의 시퀀싱은 모든 수신 클라이언트가 전송한 순서대로 액션을 처리한다는 것을 보장 하게 됩니다. 비신뢰 데이터는 교체될 수 있고 손실될 수 있다는 것으로 간주 됩니다. 신뢰 이벤트들과 오퍼레이션은 필요시 몇 번 반복되어질 수 있지만 갭 없이 순서대로 처리될 것 입니다. 비신뢰 액션들은 또한 가장 최근의 신뢰 액션과 관련이 있고 먼저 온 신뢰 데이터가 처리되기전 까지는 처리되지 않을 것 입니다. 이벤트들이 서로 관계가 있다면 위 사항은 매우 유용합니다.

예제: FPS가 움직임에 대한 변경사항을 비신뢰로, 채팅 메시지를 신뢰로 전송 합니다.
움직임 변경에 대한 손실된 패키지는 다음 움직임 갱신이 곧 바로 오기 때문에 그대로 있을 것 입니다.
수신측에서는 이 사항이 점프로 보여질 수 있습니다. 만약 채팅 메시지가 있는 패키지가 손실 되었다면 전송이 반복되어 lag 를 유발 할 수 있습니다.
이러한 경우에는 움직임과 채팅 메시지를 분리하여 다른 채널로 보내야 합니다.

채널

.NET 클라이언트들과 서버는 이제 "채널"을 지원하고 있습니다. 이를 통해 정보를 분리하여 독립적, 순차적으로 전송할 수 있는 다수의 채널로 전송할 수 있습니다.
이 의미는 한 채널의 이벤트들은 다른 채널을 사용할 수 없을 지라도 멈추지 않는다는 것 입니다. 디폴트로 PhotonPeer 는 두개의 채널을 가지고 있으며 채널 0 은 오퍼레이션 전송을 위한 디폴트 채널 입니다.
참여와 떠나는 오퍼레이션은 항상 채널 0 번으로 전송 됩니다(단순함을 위해서). 255 번은 백그라운드 채널로 연결과 연결해제 메시지를 위해 내부적으로 사용 합니다.
이 백그라운드 채널은 채널 수에서 제외 됩니다.
채널은 우선순위가 있습니다:낮은 번호를 가진 채널은 먼저 UDP 패키지를 넣습니다. 높은 채널에 있는 데이터는 UDP 패키지가 이미 꽉 차 있을 때 나중에 전송 될 수 있습니다.
예제: 움직임이 채널 0 에 전송 되어졌을 때 채팅 메시지가 채널 1번으로 전송 할 수 있습니다.
이 채널들은 연관이 없으며 채팅 메시지가 지연되었을 때 채널 0 번에 있는 움직임 변경사항에 대한 것에 더 이상 영향을 주지 않을 것 입니다. 또한 채널 0 번은 높은 우선순위를 가지고 있고 더 빠르게 전송됩니다(패키지들이 꽉 차있는 경우에).

TCP 사용

PhotonPeer 는 필요시에 내장 프로토콜로써 TCP 를 통해 인스턴스화 될 수 있습니다. 모범 사례는 아니지만, 일부 플랫폼에서는 UDP 소켓을 지원하고 있지 않습니다. Silverlight 가 모든 경우에 TCP 를 사용하는 이유 입니다.
Photon 클라이언트 API는 두 프로토콜에 대해서 동일 하지만 내부적으로 처리하는 방식에는 차이점이 있습니다.
TCP 를 통해 전송하는 것은 비신뢰 오퍼레이션을 호출 한다 하더라도 항상 신뢰 입니다!
모든 오퍼레이션을 비신뢰로 간단히 전송하기 위해서 TCP 클라이언트만을 사용 할 수 있습니다. 내장 프로토콜내의 작업(그리고 대역폭)을 줄여 줍니다.
TCP 와 UDP 클라이언트가 있다면 TCP 클라이언트로 전송하는 모든 것들은 항상 신뢰로 전송 되어질 것 입니다. 하지만 UDP 를 사용하는 클라이언트와 통신의 이벤트는 신뢰 또는 비신뢰로 받게 될 것 입니다.

예제:
Silverlight 클라이언트는 움짐임에 대한 변경사항을 채널 #1 로 비신뢰로 보낼 수 있습니다. 이것은 TCP 로 전송될 것이고 신뢰로 되게 됩니다.
아무튼 Photon 은 UDP 클라이언트와의 연결도 가지고 있습니다(3D 다운로드 가능한 게임 클라이언트 처럼). 움직임에 대한 변경사항을 신뢰/비신뢰로 설정에 따라서 사용할 것 입니다.

네트워크 시뮬레이션

개발 기간동안 대부분의 시험은 로컬네트워크에서 수행 될 것 입니다. 릴리즈 되면 클라이언트들은 인터넷을 통하여 통신하게 될 것으로 메시지별로 큰 지연이 발생할 수 있고 상황에 따라 메시지 전체가 사라질 수 도 있습니다.
실 환경에 대하여 대비하기 위해서 Photon 클라이언트 라이브러리에는 인터넷-커뮤니케이션에 대한 효과를 시뮬레이션 할 수 있습니다:lag,jitter 와 패킷 손실

  • Lag / 레이턴시: 클라이언트와 서버간의 고정된 시간의 메시지 지연. 각 방향은 다른 방식으로 영향을 줄 수 있으나 일반적으로 값들은 서로 근접합니다. 라운드 트립 시간에 영향을 줍니다.
  • Jitter: 시뮬레이션에서 Lag 를 무작위로 만듭니다. 이 효과는 라운드 트립 시간에 변동을 줍니다. UDP 패키지는 이 방식으로 버릴 수 있으며 시뮬레이션 될 수 있습니다. 신규 lag 는 : Lag + [-JitterValue..+JitterValue] 입니다. 이것을 통해 설정과 일부 패키지들이 Lag 값보다 실제 빠른 평균 lag 를 유지 합니다.
  • 패킷 손실: UDP 패키지들은 손실 될 수 있습니다. Photon 프로토콜에서 신뢰로 플래그된 명령어들은 다른 명령어들이 손실될 수 있는 반면 반복되어질 것 입니다.

lag 시뮬레이션은 자체의 스레드에서 동작하고 있으며 설정에서 정의된 지연을 맞추려고 합니다. 대부분의 경우에 있어서 설정값을 맞추겠지만 실제 지연의 변동 값은 +/- 20ms 일 수 있습니다.

네트워크 시뮬레이션 사용하기

디폴트로 네트워크 시뮬레이션은 꺼져 있습니다. PhotonPeer.IsSimulationEnabled 를 설정하여 켤 수 있으며 설정은 NetworkSimulationSet 으로 통합되며 Peer 클래스에서 접근 할 수 있습니다(예, LitePeer).

코드 샘플:

C#


//Activate / Deactivate:
this.peer.IsSimulationEnabled = true;
//Raise Incoming Lag:
this.peer.NetworkSimulationSettings.IncomingLag = 300; //default is 100ms
//add 10% of outgoing loss:
this.peer.NetworkSimulationSettings.OutgoingLossPercentage = 10; //default is 1
//this property counts the actual simulated loss:
this.peer.NetworkSimulationSettings.LostPackagesOut;

직렬화 할 수 있는 데이터타입

Photon 서버 SDK 1.8.0 과 .NET SDK 5.60 부터 직렬화 가능한 데이터 타입이 변경 되었습니다.
ArrayList 는 제거 되었지만 배열을 별도로 하면 모든 직렬화 할 수 있는 타입의 해시테이블들은 배열로써 전송 될 수 있습니다(예, String[], Floag[]).
현재는 1차원 배열만을 지원하고 있습니다.

Photon 1.8.0 이상

  • String / string
  • Boolean / bool
  • Byte / byte (unsigned! Java 의 바이트와 동일한 SByte / sbyte로 캐스팅 할 수 있습니다)
  • Int16 / short (signed)
  • Int32 / int (signed)
  • Int64 / long
  • Single / float
  • Double / double
  • Array (위에서 언급한 타입의 배열, 최대 Short.MaxValue 항목을 가질 수 있습니다 ).
  • Hashtable (배열로 사용은 불가)

Photon 서버

Photon 서버는 모든 클라이언트들을 위한 통신의 중심 허브 입니다. 모든 윈도우즈 머신에서 수행 될 수 있는 서비스로 클라이언트의 UDP와 TCP 연결을 처리하고 어플리케이션이라고 불리는 나만의 비즈니스 로직을 가지고 있는 .NET 런타임 레이어를 호스팅 합니다.
Photon 서버 SDK 는 소스가 있고 사전 빌드된 몇 개의 어플리케이션이 포함되어 있습니다. 바로 실행하여 이용 할 수 있으며 나만의 서버 로직을 개발 할 수 도 있습니다.

여기에서Photon 서버 SDK 얻기

Lite 어플리케이션

Lite 어플리케이션은 Photon 의 룸기반 게임에 대한 예제 어플리케이션으로 나만의 게임들에 대한 기본이 됩니다.
Lite 어플리케이션은 룸을 제공하며 룸에 참가하고 나가는 것과 룸에서 다른 플레이어들에게 이벤트를 전송하고 프로퍼티를 관리 합니다.
Lite 어플리케이션은 클라이언트 라이브러리들과 매우 밀접하게 통합되었으며 대부분의 문서를 통한 예제로 사용됩니다.

Photon의 프로퍼티

Lite 어플리케이션은 서버 측(메모리내)에서 키/값 쌍을 설정하고 가져오기 위한 일반적인 목적의 메카니즘을 구현 하고 있습니다.
룸/게임 또는 룸안의 플레이어와 관련되어 있으며 게임에 있는 모든 사람에 의해서 가져오거나 갱신 될 수 있습니다.
해시테이블의 프로퍼티에 있는 각 항목은 분리된 프로퍼티로 간주되며 독립적으로 덮어 쓰여질 수 있습니다.
프로퍼티의 값은 모든 직렬화 할 수 있는 데이터 타입이 될 수 있습니다. 키들은 문자열 또는 바이트 타입이어야 합니다. 오버헤드를 줄이기 위해 바이트가 선호 됩니다.
혼선을 방지를 위해서 키 타입으로 문자열과 바이트를 섞어서 사용하지 마세요. 키를 섞어서 사용하면 이를 가져오기 위하여 요청을 분리하는 것이 필요 합니다.
게임 내에서 프로퍼티 브로드캐스팅과 이벤트 프로퍼티 변경은 "브로드캐스트" 될 수 있으며 이것은 다른 플레이어들이 프로퍼티들을 업데이트 하는 이벤트를 트리거 시킵니다.
프로퍼티를 변경한 플레이어는 업데이트(다시)를 받지 않습니다.
브로드캐스트를 사용하는 모든 변경은 프로퍼티 업데이트 이벤트를 트리거 할 것 입니다.
이 이벤트는 어떤 프로퍼티가 변경되었으며 누가 그 프로퍼티를 가졌는지에 대한 변경된 프로퍼티들(만)을 가지고 갑니다.
클라이언트들은 변경사항들을 "머지"해야 합니다(만약 프로퍼티들이 캐시 되었으면).
프로퍼티들은 아래의 메소드를 통하여 설정 될 수 있습니다:

  • LitePeer.OpSetPropertiesOfActor 메소드는 플레이어의 프로퍼티들을 설정 합니다.
  • LitePeer.OpSetPropertiesOfGame 메소드는 게임의 프로퍼티들을 설정 합니다.
  • LitePeer.OpJoin 메소드는 아직 존재하지 않는 게임이더라도 프로퍼티를 설정 할 수 있습니다.

그리고 다음의 메소드들로 가져 옵니다:

  • OpGetPropertiesOfActor
  • OpGetPropertiesOfGame

브로드캐스트 이벤트

브로드캐스트 옵션을 사용하는 모든 변경은 프로퍼티 업데이트 이벤트 LiteEventCode.PropertiesChanged 를 트리거 할 것 입니다. 이 이벤트는 LiteEventKey.Properties 키의 값으로 프로퍼티들을 운반 합니다. 추가적으로 LiteEventKey.ActorNr 키에 누가 프로퍼티를 변경 하였는지에 대한 정보가 있습니다.
LiteEventKey.TargetActorNr 키는 프로퍼티-집합이 특정 플레이어에 속한 경우에만 사용 할 수 있습니다. 만약 존재하지 않는다면 프로퍼티는 게임 프로퍼티인 것 입니다.

노트

현재 Lite 어플리케이션은 프로퍼티 삭제를 할 수 없으며 프로퍼티 값을 가져올 때 문자열 키에서 와일드카드 문자를 사용할 수 없습니다.
키들의 다른 타입들이 사용 될 수 있으나 단순함을 위해서 추가하지 않기로 결정 했습니다. 만약 필요하다면 구현코드를 통해 도움을 드리도록 하겠습니다.
프로퍼티 처리는 앞으로 변경 및 확장될 수 있습니다.

다음 사항을 읽어보시는 것을 권장해 드립니다:

.NET 플랫폼

Photon for Unity3D

이 장에서는 .NET SDK 와 Unity 3D SDK 간의 차이점에 대해서 언급 합니다.
Unity3D 를 사용하고 있지 않으면 이 장을 건너띄시기 바랍니다.

  1. Unity 지원버전:
    a) 현재는 Standalone과 Web(윈도우즈와 MacOS 모두)과 iOS 를 지원 및 테스트 했습니다.
    PS3 , Wii 와 안드로이드의 Export는 현재로써 테스트 되지는 않았지만 잘 동작 할 것 입니다.
    b) Photon 은 Unity Standard,Unity Pro 에서 잘 동작 합니다. 모바일 단말로의 Export 는 .NET 소켓을 이용하기 위해서 각각의 모바일 "Pro" 라이선스가 필요 합니다.
  2. Unity3 와 정책 파일 요청
    Unity 3.0 부터, 웹 플레이어는 원시서버와 다른 URL 에 접속하기 위해서 정책 파일이 필요 할 것 입니다. Photon 은 이 기능을 바로 사용할 수 있도록 지원 하고 있습니다.
    디폴트로 서버는 정책 파일 요청을 위한 포트(TCP 포트 843)를 오픈하고 "Policy Application" 에 매핑 합니다.
    이를 위해 소스코드를 포함해 놓았지만 일반적으로 바이너리를 디플로이 하여 사용해도 좋습니다.
  3. Unity 프로젝트에 Photon 을 추가 하는 방법:
    a) Unity 프로젝트에 Phootn 을 추가 하기 위해서 SDK 의 .dll 을 프로젝트의 assets-폴더내 어딘가에 복사하고 중복된 것이 없는지 확인 하면 됩니다. (이전 버전은 다른 파일명을 가지고 있으니 주의 하세요)
    b) 게임이 수행될 때 백그라운드에서 동작 하기 위해 스크립트 어딘가에 다음의 코드가 있는지 확인 합니다.
    Application.runInBackground = true; //without this Photon will loose connection if not focussed
    c) iOS 빌드에 대해서는 "iPhone Stripping Level" 을 "Strip Bytecode" (Edit->Project Settings->Player)로 설정 해야 합니다.
    또한 ".NET 2.0 subset" 을 사용하세요. 프로젝트가 IDE 에서 수행 되고 단말을 위해 빌드 했을 때 에러메시지가 발생하면 이 옵션을 체크 해 주시기 바랍니다.
    d) 클라이언트에서 사용하고 있는 서버 주소를 변경 했는지 확인 해 주세요. "localhost:5055" 는 단말에서 동작하지 않을 것 입니다.
Back to top