This document is about: QUANTUM 2
SWITCH TO

게임 서비스

개요

게임 서비스는 게임 내 주요 문제/특징 요구 사항을 해결하는 것을 목표로 하는 글로벌 독립 시스템입니다. 모든 게임 서비스는 IGameService를 구현하며 서비스당 정확히 하나의 인스턴스가 항상 사용 중입니다. 모든 서비스는 애플리케이션 수명 동안 지속되며 일부는 다른 서비스에 의존합니다.

네트워크

Network 서비스는 특정 영역에서 Quantum 애플리케이션과의 연결을 유지하고 Photon Realtime의 LoadBalancingClient 위에 추가 레이어를 제공합니다.

네트워크 클라이언트의 연결이 끊기는 즉시 서비스가 다시 연결을 시도하기 때문에 최선의 방법으로 연결을 유지합니다. 명시적 요청을 수신하면 Network 서비스만 시작중지 합니다.

API

  • Connect(): 특정 AppID, 버전, 지역, UserID를 통해 Photon Realtime에 연결
  • Disconnect(): Photon Realtime에서 연결 해제
  • Pause(): 서비스를 일시 중단하고 백그라운드 쓰레드를 이용하여 ACK 전송을 통한 연결을 유지합니다. 이 메소드는 씬을 로드하기 전에 호출되어야 합니다.
  • Unpause(): Network 서비스로부터 송신 및 수신을 재개합니다. 로딩이 완료된 이후 호출되어야 합니다.

메시지

메시지 서비스는 특정 지역의 Photon Chat 애플리케이션에 대한 연결을 유지하고 입력된 메시지를 주고받기 위한 추가 API를 제공합니다. 네트워크 클라이언트의 연결이 끊기는 즉시 서비스가 다시 연결을 시도하기 때문에 최선의 방법으로 연결을 유지합니다. 명시적 요청을 수신하면 메시지 서비스만 시작중단 됩니다.

이 서비스는 새로운 유형을 파생할 수 있는 두 가지 타입의 메시지를 지원합니다.

  • PrivateMessage, 이 메시지는 특정 Photon 사용자에게 직접 전송되도록 만들어졌습니다.
  • ChannelMessage, 이 메시지는 전체 Photon Chat 채널과 전송/공유를 것입니다.

API

  • Connect(): 특정 AppID, 버전, 지역, UserID를 통해 Photon Chat에 연결합니다
  • Disconnect(): Photon Chat에서 연결 해제합니다
  • Subscribe(): 특정 Photon Chat 채널을 구독합니다
  • Unsubscribe(): 특정 Photon Chat 채널을 구독 해제합니다
  • SetProperties(): 특정 Photon Chat 채널의 속성을 설정합니다
  • AddFriends(): 플레이어들의 상태 업데이트를 수신합니다
  • RemoveFriends(): 플레이어들의 상태 업데이트를 수신 중단합니다
  • CanChatInChannel(): 특정 Photon Chat 채널에서 채팅을 할 수 있는 경우 true를 반환합니다
  • TryGetChannel(): Photon Chat 채널을 반환합니다
  • SendMessage(): 수신자에게 개인 또는 채널 메시지를 전송합니다
  • Flush(): 즉시 모든 외부 발송되는 명령어를 전송합니다
  • Pause(): 서비스를 일시 중지하고 백그라운드 스레드에서 ack 패킷을 전송하여 연결을 활성 상태로 유지합니다. 씬을 로드하기 전에 호출해야 합니다.
  • Unpause(): Network 서비스로부터 송신 및 수신을 재개합니다. 로딩이 완료된 이후 호출되어야 합니다.

예제

이 섹션에서는 메시지 서비스 사용에 대한 몇 가지 예를 제공합니다.

개인 메시지

C#

IMessage message = new PrivateMessages.Text("This is a private message");
Game.Services.Messages.SendMessage(message, "targetUserID");

채널 메시지

C#

IMessage message = new ChannelMessages.Text("This is a channel message");
Game.Services.Messages.SendMessage(message, "targetChannelName");

사용자 지정 메시지 정의

사용자 지정 메시지 정의는 다음의 기본 클래스 중에서 파생할 수 있습니다(PrivateMessage 또는 ChannelMessage). 다음 코드는 ChannelMessage에서 파생된 새로운 타입을 생성하는 방법을 보여줍니다.

C#

public static partial class CustomMessages
{
    public sealed class Emote : ChannelMessage
    {
        public string EmoteID { get; private set; }

        public Emote(string emoteID) {
            EmoteID = emoteID;
        }

        private Emote() {}

        protected override object Serialize() {
            return EmoteID;
        }

        protected override void Deserialize(object data) {
            EmoteID = (string)data;
        }
    }
}

로비

로비 서비스는 메시지 서비스에 의존하며 Photon Chat 채널을 통해 지원됩니다. 이 서비스는 string으로 식별되는 단일 로비에 대한 연결을 제공합니다. 플레이어들은 로비 메시지를 보내고 같은 로비에 있는 다른 모든 플레이어들이 사용할 수 있는 LobbyPlayerData 구조체로 자신만의 사용자 지정 속성을 설정할 수 있습니다.

노트: 단일 로비는 1000까지의 플레이어까지 제한되어 있습니다.

API

  • Join(): 특정 로비에 참여합니다. 로비가 지정되지 않은 경우 기본 로비에 참여하거나, 없는 경우 로비를 만듭니다
  • Leave(): 현재 로비를 떠납니다
  • SetSynchronizationInterval(): 플레이어가 로비의 데이터와 상태를 동기화하는 간격을 설정합니다.
  • GetPlayerData(): 특정 플레이어의 LobbyPlayerData를 반환합니다
  • GetLocalPlayer(): 로컬 LobbyPlayer를 반환합니다
  • SendMessage(): 로비 메시지를 전송합니다 (ChannelMessage에서 파생된 타입이어야 합니다)

파티

파티 서비스는 메시지 서비스에 의존하며 Photon Chat 채널을 통해 지원됩니다. 이 서비스는 기본적인 파티 시스템을 제공합니다. 그 파티는 string으로 식별됩니다. 파티 메시지를 보내고 PartyPlayerData 구조체로 사용자 지정 플레이어 속성을 설정할 수 있으며, 이 구조체는 같은 파티의 다른 모든 플레이어가 사용할 수 있습니다. 파티를 만든 플레이어는 파티의 최대 크기를 설정할 수도 있습니다.

파티에는 항상 한 명의 파티 리더가 있습니다(기본적으로 파티를 만드는 플레이어). 그것을 유지하는 것은 파티 대표입니다. 리더는 언제든지 다른 플레이어를 리더로 만들고 자신을 강등시킬 수 있습니다. 리더의 연결이 끊어지면 다른 플레이어들이 즉시 리더쉽을 차지하려고 할 것입니다.

노트: 파티 시스템은 완전히 클라이언트 중심이며 코드는 보안 검사에 부담을 주지 않습니다. 이 점이 솔루션을 치팅할 수 있게 만든 다는 것을 명심하세요.

API

  • AutoAcceptJoinRequest: 참여 메시지로 받은 파티에 자동으로 가입합니다. 기본값은 True 입니다.
  • AllowRemotePlayerDataChange: 다른 플레이어 데이터 변경을 허용합니다. 기본값은 False 입니다.
  • PlayerInviteTimeout: 지연 초대 요청의 타임아웃 시간입니다. 기본값은 15초 입니다.
  • PlayerKickTimeout: 연결이 끊긴 플레이어가 파티에서 쫓겨날 때까지의 시간입니다. 기본값은 30초 입니다.
  • Create(): 특정 파티ID로 파티를 생성합니다
  • Join(): 특정 파티ID로 파티에 참여합니다
  • Leave(): 현재 파티를 떠납니다
  • Invite(): 파티에 다른 플레이어를 초대합니다. 대상 플레이어는 초대를 받기 위해서는 Messages 서비스를 통해 연결되어 있어야합니다.
  • Kick(): 파티에서 특정 플레이어를 쫒아냅니다
  • SetLeader(): 다른 플레이어를 리더로 승신시켜줍니다
  • SetPlayerSlot(): 특정 플레이어의 파리 슬롯을 설정합니다
  • ExchangePlayerSlots(): 특정 플레이어 2명의 파티 슬롯을 원자적으로 교환합니다.
  • GetPlayerData(): 특정 플레이어의 PartyPlayerData를 반환합니다
  • GetLocalPlayer(): 로컬 PartyPlayer를 반환합니다
  • SendMessage(): 파티 메시지를 전송합니다 (ChannelMessage로부터 타입이 파생되어야 합니다)

PartyPlayer 속성

  • UserID: 플레이어마다 유일한 값
  • Status: 연결됨 / 연결 해제됨
  • Slot: 파티 내의 유일한 위치 값
  • Data: 사용자 지정 속성을 가진 PartyPlayerData의 인스턴스

매치메이킹

매치메이킹 서비스는 네트워크메시지 서비스에 의존하며 주어진 매개변수에 따라 특정/랜덤 매치 찾기를 담당하며 최선의 노력으로 플레이어를 매치 연결 상태로 유지합니다. 서비스는 Match, MatchRequest, MatchConfig 데이터 구조체로 작동합니다.

API

MatchRequest

  • Mode: 일치 요청 모드, 현재 지원되는 모드는 Join, Create, JoinOrCreate, JoinRandom, CreateRandom, JoinOrCreateRandom 입니다
  • Room: 룸의 이름, Join, Create and JoinOrCreate 에서 필수입니다
  • Plugin: Photon Realtime 서버 플러그인의 이름, 기본값은 “QuantumPlugin” 입니다
  • IsOpen: 룸의 초기 오픈 상태, 기본값은 true 입니다
  • IsVisible: 룸의 초기 가시성 상태, 기본값은 true 입니다
  • IsSpectator: 가입 플레이어가 관중(게임에 참여하지 않음)일 경우 설정, 기본값은 false 입니다.
  • AutoStart: true이면 룸이 가득차있을 때, 최소 [MinStartPlayers]의 비관전 플레이어 또는 [Timeout] 이후인 경우 매치가 자동적으로 시작됩니다. 기본값은 true 입니다
  • MinStartPlayers: [AutoStart]가 true인 경우에만 자동으로 시작되며 기본값은 0(모든 플레이어 필요)입니다
  • ExpectedPlayers: 게임 플레이어에서 참여가 예상되는 플레이어의 수, Create, JoinOrCreate, CreateRandom 그리고 JoinOrCreateRandom 모드에서는 필수
  • ExtraSlots: 플레이어에 참여하지 않는 플레이어의 추가 슬롯 수로 기본값은 0입니다.
  • MatchTTL: 룸이 제거되기 전에 빈 룸이 활성 상태로 유지되는 기간이며 기본값은 0입니다.
  • PlayerTTL: 연결이 끊어지기 전에 플레이어가 룸에서 비활성 상태를 유지하는 시간으로 기본값은 0 입니다.
  • FillTimeout: 모든 룸 스폿을 채우기 위한 시간 제한, 도달 시 일치 항목이 자동으로 시작됩니다([AutoStart]가 true인 경우에만 해당), 기본값은 0(무제한 시간)입니다.
  • Config: 사용자 지정 데이터의 MatchConfig 인스턴스=
  • PlayerProperties: 룸에 가입할 때 설정되는 사용자 지정 플레이어 속성입니다
  • ExpectedRoomProperties: 이러한 특성을 가진 룸만 선택되며, JoinRandom 및 JoinOrCreateRandom 모드에 유효합니다.
  • RoomProperties: 룸 생성에서 사용되는 사용자 지정 속성, Create, JoinOrCreate, CreateRandom 그리고 JoinOrCreateRandom 모드에서 유효
  • RoomPropertiesForLobby: 속성 키 목록입니다. 이 키가 포함된 속성은 실시간 로비의 모든 사용자에게 노출됩니다.
  • ExpectedUserIDs: 동일한 룸에 가입할 것으로 예상되는 사용자 목록입니다. 이 목록은 모든 플레이어의 자리를 예약하고 일반적으로 파티원으로 채워진 충분한 빈 공간을 가진 룸만 찾습니다. 로컬 플레이어는 항상 예상 사용자로 설정됩니다.
  • MatchmakingMode: 매치메이킹 규칙을 정의하며, 기본값은 FillRoom 입니다
  • TypedLobby: 로비 타입, 기본값은 TypedLobby.Default 입니다
  • SQLLobbyFilter : LobbyType.SqlLobby와 결합되는데 사용되는 SQL 필터

매치

  • UpdateConfig: 매치가 시작되기 전에 실행되는 콜백, MatchConfig의 최종 변경사항을 작성하려는 의도입니다
  • Connected: 플레이어가 룸에 연결되었을 때 실행되는 콜백
  • Reconnected: 예상하지 못한 연결 해제가 된 플레이어가 재접속했을 때 실행되는 콜백
  • Disconnected: 예상하지 못한 연결 해제가되었을 때 실행되는 콜백
  • Updated: 매치가 시작되기 전까지 매 프레임에서 실행되는 콜백
  • Started: 매치가 시작될 때 실행되는 콜백
  • Start(): 매치를 시작하는 명시적 명령입니다. 매치가 이미 시작된 경우 무시됩니다.

매치메이킹

  • Run(): 주어진 Match / MatchRequest에 대한 매치메이킹 프로세스 시작
  • Leave(): 현재 Match를 나갑니다

매치 프로세스 흐름

다음 다이어그램은 매치 요청에서 매치 시작까지의 간소화된 프로세스를 보여줍니다.

fps template match request flow diagram
FPS Template 매치 요청 흐름 다이어그램.

Matchmaking 서비스는 견고함을 염두에 두고 설계한 것으로, 모든 플레이어가 연결이 끊기고 룸을 없어지지 않는 한 언제든지 모든 플레이어가 끊긴 상태에서 살아남아야 합니다. 여기에는 파티 구성원 처리가 포함됩니다. 마스터 클라이언트는 항상 시작 조건 및 경기 시작 시 결정을 평가합니다. 또한 정기적으로 누락된 예상 사용자를 확인하고 개인 메시지를 통해 초대합니다.

원격 설정

RemoteSettings 서비스는 원격 서버의 설정을 가져올 수 있도록 해 줍니다. 유니티 원격 구성에 의해 베이크됩니다.

API

  • IsLoaded: 구성 제거 서버에서 구성을 이미 가져왔는지를 나타냅니다.
  • Loaded: 구성을 가져왔을 때 실행되는 콜백
  • Load(): 주어진 사용자 ID와 환경 ID에 대하여 구성을 가져옵니다
  • GetBool(): 원격 구성의 bool 값을 반환합니다
  • GetInt(): 원격 구성의 int 값을 반환합니다
  • GetFloat(): 원격 구성의 float 값을 반환합니다
  • GetString(): 원격 구성의 string 값을 반환합니다

씬 로더

SceneLoader 서비스는 유니티 씬 초기화, 초기화 취소 및 스위칭을 담당합니다. FPS 템플릿은 메인 씬이 백그라운드에서 로드되는 동안 전면에 로드 씬을 추가로 로드하여 백그라운드에서 씬 전환을 지원합니다.

다음 다이어그램은 프로세스를 나타내고 있습니다:

fps template scene loading
씬 로딩.
  1. SceneManager.LoadSceneAsync(LoadingScene): 씬( LoadingScene )이 추가로 로드됩니다. 시각적 결함을 방지하기 위해 기본적으로 아무것도 표시되지 않아야 합니다.
  2. SceneLoadingDirector.Initialize(): 이것은 모든 중요 개체를 DontDestroyOnLoad로 표시하여 나중에 메인 씬이 로드되는 잘못된 상태를 방지하는 데 사용됩니다.
  3. SceneLoadingDirector.Activate(): 이 루틴에서 메인 씬은 UI 또는 유사한 효과에 의해 숨겨지며, 루틴이 완료된 후 로드 프로세스가 계속됩니다.
  4. SceneDirector.Deinitialize(): 현재 씬( MenuScene )이 초기화 취소됩니다.
  5. SceneManager.LoadSceneAsync(GameScene): GameScene 이 로드되고 MenuScene 으로 교체됩니다.
  6. Resources.UnloadUnusedAssets(): MenuScene 에서 사용된 리소스를 정리합니다.
  7. SceneDirector.Initialize(): 현재 씬 ( GameScene ) 이 초기화됩니다. 노트: 이 메소드는 코루틴이므로 로드 프로세스를 필요한 만큼 지연할 수 있습니다.
  8. SceneLoadingDirector.Deactivate(): 이 루틴에서는 로드 UI가 숨겨지고 메인 씬이 표시됩니다.
  9. SceneLoadingDirector.Deinitialize(): DontDestroyOnLoad로 표시된 LoadingScene 객체를 정리합니다.
Back to top