This document is about: SERVER 4
SWITCH TO

Lite 어플리케이션

여기에서는 Lite 어플리케이션에 대한 기본 개념을 빠르게 볼 것 입니다.

Photon v4 에서 Lite는 Photon 의 기본 개념을 위한 소개용 데모 프로그램으로 생각해 주세요. 실제 제품 생산을 위한 프로젝트에는 더이상 사용 될 수 없으며 대신에 저희는 "LoadBalancing Application"을 확장하는 것을 추천 합니다. 아무튼 룸 내에서 커스텀 로직을 쉽게 추가 하기 위한 방법인 [Photon 플러그인](~~~/plugins/manual)을 만드는 것을 고려 할 수 도 있습니다.

피어(Peers)

Lite는 Photon의 어플리케이션 프레임워크에 기반한 것으로 연결된 플레이어의 참조로서 "피어"를 사용 합니다. 피어는 LitePeer 클래스를 둘러싸고 상속한 것 입니다.

클라이언트가 Lite 어플리케이션에 접속할 때 LiteApplication.CreatePeer 에서 새로운 LitePeer 가 생성됩니다. 이후에 이 클라이언트의 추가적인 요청(예, 오퍼레이션)들은 이에 상응하는 LitePeer 에 의해서 처리가 될 것 입니다.

Lite 의 모든 LitePeer 는 하나의 상태로서 RoomReference 를 가지고 있습니다. 플레이어들은 단 하나의 방에만 있을 수 있습니다. 이 상태는 Join 오퍼레이션에 의해서 설정 됩니다.

LitePeer 의 OnDisconnect 메소드는 피어가 연결해제될 때 호출 됩니다.
만약 피어가 룸에 여전히 존재 한다면 피어를 제거 하라는 메시지를 받게 됩니다.

Lite에서 피어들은 같이 플레이 하기 위해서 룸에 들어가게 되는데 이것을 게임이라고 부릅니다. 참가(Join)를 제외한 모든 것이 룸에서 이루어 지게 됩니다.

모든 게임은 유일한 이름이 있으며 다른 모든 것들과 완벽하게 분리되는 것으로 취급됩니다. 또한 플레이어로 부터 받은 모든 요청들은 순차적으로 처리되게 됩니다. 수 많은 룸이 동시에 존재하고 각각의 요청은 시분할방식으로 처리되므로이 스케일링의 설정이 중요합니다.

룸에는 플레이어들이 있고 참가, 퇴장 또는 연결해제시에 플레이어의 상태가 갱신됩니다. 이러한 플레이어 사이에서 이벤트가 전송 됩니다.

룸 안의 플레이어는 액터 로도 알려져 있고 각 액터는 액터 번호를 가지고 있습니다. 이 번호는 이벤트가 어디에서 발생했는지 식별하기 위해서 사용 됩니다.

오퍼레이션과 이벤트

Lite는 이러한 오퍼레에션을 정의 합니다.

  • Join: 이름으로 룸에 입장 합니다. 만약 룸이 존재 하지 않으면 룸을 생성합니다.
    Join은 피어의 이전 룸이 있다면 무조건 그 룸을 떠나게 합니다.
    할당된 액터번호(ActorNumber)를 리턴 합니다.
  • Leave: 방을 퇴실 합니다(하지만 연결은 유지 됩니다).
  • RaiseEvent: 룸에게 룸내의 다른 피어들에게 이벤트를 전송하라고 알려 줍니다.
    이벤트는 EventCode를 가지고 클라이언트로부터 제공된 데이터를 전달합니다. Lite 는 이벤트를 저장 하지는 않습니다.
  • GetProperties: Lite 에서는 룸과 플레이어에게 프로퍼티들을 붙일 수 있습니다.
    이 오퍼레이션으로 패치 됩니다.
  • SetProperties: 임의의 key-value 쌍을 룸 또는 플레이어에게 추가 합니다. Lite는 데이터를 사용하지 않으므로 클라이언트는 임의의 데이터를 보낼 수 있습니다. 규칙에 의한 코드입니다.

Lite는 이러한 이벤트를 정의 합니다.

  • Join: 룸에 참여(오퍼레이션에 의해)는 내부의 플러이어들의 목록을 갱신 합니다.
    이것은 이벤트로써 모든 플레이어에게 전송됩니다(신규 플레이어도 포함해서).
  • Leave: 만약 플레이어가 룸을 떠나게 되면 다른 플레이어들이 다시 갱신 됩니다.
  • Properties update: 프로퍼티들이 변경 될 때 변경사항을 브로드캐스트 할지에 대한 옵션이 있습니다.
    이 이벤트는 모든 클라이언트를 최신 상태로 유지하도록 처리 합니다.

RaiseEvent / 커스텀 이벤트

Lite 에서는 플레이어들이 임의의 내용을 룸에 있는 다른 플레이어들에게 이벤트를 전송 할 수 있습니다. RaiseEvent 오퍼레이션은 이것을 처리하고 이벤트 내용을 그에 맞게 포워드 합니다.

한 예로 .NET 리얼타임 데모의 클라이언트 코드는 플레이어의 위치를 전송 합니다:

C#

    
        // Raises an event with the position data of this player.
        internal void SendEvMove(LitePeer peer)
        {
            if (peer == null)
            {
                return;
            }

            Hashtable evInfo = new Hashtable();

            evInfo.Add((byte)STATUS_PLAYER_POS_X, (byte)this.posX);
            evInfo.Add((byte)STATUS_PLAYER_POS_Y, (byte)this.posY);
            //OpRaiseEvent(byte eventCode, Hashtable evData, bool sendReliable, byte channelId, bool encrypt)
            peer.OpRaiseEvent(EV_MOVE, evInfo, isSendReliable, (byte)0, Game.RaiseEncrypted);
        }
    

Lite 어플리케이션은 서버측에서 이벤트들을 해석하지 않기 때문에 원하는 모든 것을 전송 할 수 있습니다.
위의 EV_MOVE 에 대한 것은 Lite 는 전혀 모르는 사항이며 클라이언트 측에서만 정의되고 사용 됩니다.

위의 예제에서 발생한 이동 이벤트는 수신 받는 클라이언트에서 EventAction 호출이 발생되게 합니다. 클라이언트는 아래와 같이 이벤트와 데이터를 처리 합니다.

C#

    
        //in Game.cs:
        public void EventAction(byte eventCode, Hashtable photonEvent)
        {
            int actorNr = 0;
            if (photonEvent.ContainsKey((byte)LiteEventKey.ActorNr))
            {
                actorNr = (int) photonEvent[(byte) LiteEventKey.ActorNr];
            }

            // get the player that raised this event
            Player p;
            this.Players.TryGetValue(actorNr, out p);

            switch (eventCode)
            {
                case Player.EV_MOVE:
                    p.SetPosition((Hashtable)photonEvent[(byte)LiteEventKey.Data]);
                    break;
                //[...]
            }
        }

        //in Player.cs:
        internal void SetPosition(Hashtable evData)
        {
            this.posX = (byte)evData[(byte)STATUS_PLAYER_POS_X];
            this.posY = (byte)evData[(byte)STATUS_PLAYER_POS_Y];
        }
    

클라이언트 이외도 서버는 필요에 따라 이벤트를 보낼 수 있습니다.
HandleRaiseEvent에서 사용되는 방법을 확인하여 용도에 맞게 사용하세요.

프로퍼티

Lite에서 프로퍼티들은 플레이어들이 설정하고 값을 가져 올 수 있는 해쉬테이블입니다. 프로퍼티들은 항상 액터 또는 룸에 붙여집니다. 프로퍼티는 룸의 설정, 플레이어의 이름 등 클라이언트에서 사용할 수 있는 모든 것을 저장하는데 사용 됩니다.

SetPropertiesGetProperties 오퍼레이션을 사용할 수 있고 모든 클라이언트는 어떤 값이라도 설정할 수 있습니다. 빠르게 말하면 Join 은 룸에 입장할 때 프로퍼티들을 설정하기 위한 선택적 파라미터를 가지고 있습니다. 이것은 즉시 사용 할 수 있습니다.

매번 참여할 때마다 룸의 프로퍼티들이 리셋되는 것을 방지하기 위해서 Join 은 룸이 새로 생성되었을 때만 프로퍼티를 설정 할 것입니다. 따라서 모든 플레이어가 룸 프로퍼티를 참여할 때 설정하더라도 첫번째 참여시에만 룸 프로퍼티가 설정되게 됩니다.

프로퍼티를 설정할 때 Lite는 이벤트로써 프로퍼티들을 브로드캐스트 하는 옵션을 선택할 수 있습니다. 이렇게 하면 룸의 다른 플레이어들에게 새로운 프로퍼티 값을 제공 해주게 됩니다.

Back to top