빠른 시작: PlayFab Multiplayer Unity 플러그인
PlayFab Multiplayer Unity 플러그 인을 시작하세요. 아래 단계에 따라 패키지를 설치하고 기본 작업에 대한 예제 코드를 사용해 보세요.
이 빠른 시작은 Unity용 PlayFab Multiplayer SDK를 사용하여 첫 번째 API 호출을 수행하는 데 도움이 됩니다. 계속하기 전에 빠른 시작: Unity에서 C#용 PlayFab 클라이언트 라이브러리를 완료해야 합니다. 그러면 PlayFab 계정이 있고 게임 및 PlayFab 게임 관리자에서 PlayFab에 로그인하는 데 익숙해지도록 할 수 있습니다.
참고 항목
이 플러그 인을 사용하여 Microsoft GDK(게임 개발 키트)를 기반으로 게임을 개발하려면 GDK를 별도로 획득하고 설치해야 합니다. Xbox 콘솔에서 Game Core용 Unity 추가 기능에 대한 세부 정보도 참조하세요.
요구 사항
설치된 Unity 편집기 복사본. Unity Hub를 통해 개인용 Unity를 설치하거나 전문가용 Unity+를 설치하려면 Unity 다운로드를 참조하세요. 필요한 경우 특정 플랫폼의 설명서에서 Unity 지원을 확인합니다. 지원되는 최소 Unity 버전은 Unity 2017 LTS입니다.
Unity 프로젝트 – 다음 중 하나일 수 있습니다.
- 새로운 프로젝트: 자세한 내용은 처음 Unity 시작하기를 참조하세요.
- 안내가 있는 자습용 프로젝트입니다. 자세한 내용은 Unity 시작하기를 참조하세요.
- 기존 프로젝트입니다.
PlayFab "코어" Unity3D SDK(Multiplayer Unity 플러그 인에도 포함됨)입니다. Unity3D SDK 설치에 대한 자세한 내용은 빠른 시작: Unity 내 C#용 PlayFab 클라이언트 라이브러리의 "PlayFab SDK 다운로드 및 설치" 섹션을 참조하세요.
PlayFab Multiplayer Unity 플러그 인 다운로드 및 설치
PlayFab Multiplayer Unity 플러그인을 다운로드하고 설치하는 단계를 따릅니다.
- PlayFab Multiplayer Unity 플러그 인 자산 패키지를 다운로드합니다(플랫폼에 따라 배포 지점 사용).
- 중요! 플러그 인과 함께 게시된 README 파일 내 정보를 참조하세요. 각 특정 버전에 맞게 조정되었으며 해당 플랫폼과 관련된 중요한 지침이 포함될 수 있습니다.
- Unity 프로젝트를 엽니다.
- .unitypackage를 저장한 위치로 이동한 후 두 번 클릭하여 가져온 대화를 엽니다.
- PlayFab Multiplayer Unity 플러그 인을 프로젝트로 가져오려면 가져오기를 선택합니다.
참고: 필요한 경우 최신 버전의 PlayFab "코어" Unity SDK를 설치해야 할 수 있습니다.
장면 설정
가이드 메뉴의 이 부분에서는 Unity에서 PlayFab Multiplayer API를 호출할 수 있도록 장면에 PlayfabMultiplayerEventProcessor
을(를) 추가하는 방법을 보여줍니다.
Multiplayer API를 사용하려면 먼저 PlayFab 플레이어가 로그인되어 있어야 합니다. 플레이어에 로그인하는 방법에 대한 자세한 내용은 빠른 시작: Unity 내 C#용 PlayFab 클라이언트 라이브러리의 첫 API 호출 만들기를 참조하세요.
Unity 편집기의 프로젝트 창에서 자산 > PlayFabMultiplayerSDK > Prefabs로 이동합니다.
Prefabs 폴더에서 PlayfabMultiplayerEventProcessor를 계층 구조 창의 장면으로 끌어서 놓습니다.
장면에 "HelloMultiplayerLogic"이라는 빈 게임 개체를 만듭니다.
HelloMultiplayerLogic 게임 개체를 선택하여 Inspector를 엽니다.
구성 요소 추가를 선택합니다.
"HelloMultiplayerLogic"을 입력하고 Enter 키를 눌러 새 스크립트 메뉴를 표시합니다.
Enter 키를 다시 눌러 새 스크립트인 HelloMultiplayerLogic.cs를 만듭니다.
프로젝트 창에서 스크립트를 찾아서 두 번 클릭하여 스크립트를 편집합니다.
스크립트에 다음 using 문을 추가합니다.
using PlayFab; using PlayFab.Multiplayer; using PlayFab.ClientModels;
시작 메서드에 다음 코드를 추가하여 PlayFab에 로그인합니다.
// Log into playfab var request = new LoginWithCustomIDRequest { CustomId = UnityEngine.Random.value.ToString(), CreateAccount = true }; PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnLoginFailure);
클래스에 다음 메서드를 추가합니다.
private void OnLoginSuccess(LoginResult result) { } private void OnLoginFailure(PlayFabError error) { }
참고 항목
다음과 같은 오류가 발생할 수 있습니다.
Error CS0227 Unsafe code may only appear if compiling with /unsafe
The plugin requires unsafe code because it interops with a native DLL.
Mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "XGamingRuntime", "AMD64".
Microsoft GDK 및 Windows가 x64만 지원합니다.
이러한 문제를 해결하려면 다음을 수행합니다.
- Unity 편집기에서 파일 > 빌드 설정을 선택합니다.
- 플랫폼을 선택합니다. 그런 다음 아키텍처 드롭다운에서 x86\_64 또는 x64를 선택합니다.
- 플레이어 설정을 선택합니다.
- 오른쪽 창에서 기타 설정을 선택합니다.
- 안전하지 않은 코드 허용 설정을 찾아 선택합니다.
- 빌드 설정과 프로젝트 설정 창을 닫습니다.
로비 생성 및 참여
가이드의 이 부분은 로비를 만들고 참여하는 방법을 보여줍니다.
HelloMultiplayerLogic.cs 스크립트를 엽니다.
OnLoginSuccess
메서드에서 다음 코드를 추가하여 로비를 생성하고 참여합니다.string entityId = ...; // PlayFab user's entity Id string entityType = ...; // PlayFab user's entity type PlayFabMultiplayer.OnLobbyCreateAndJoinCompleted += this.PlayFabMultiplayer_OnLobbyCreateAndJoinCompleted; PlayFabMultiplayer.OnLobbyDisconnected += this.PlayFabMultiplayer_OnLobbyDisconnected; var createConfig = new LobbyCreateConfiguration() { MaxMemberCount = 10, OwnerMigrationPolicy = LobbyOwnerMigrationPolicy.Automatic, AccessPolicy = LobbyAccessPolicy.Public }; createConfig.LobbyProperties["Prop1"] = "Value1"; createConfig.LobbyProperties["Prop2"] = "Value2"; var joinConfig = new LobbyJoinConfiguration(); joinConfig.MemberProperties["MemberProp1"] = "MemberValue1"; joinConfig.MemberProperties["MemberProp2"] = "MemberValue2"; PlayFabMultiplayer.CreateAndJoinLobby( new PFEntityKey( entityId, entityType), createConfig, joinConfig);
OnLobbyCreateAndJoinCompleted 이벤트 처리기를 정의하려면 클래스에 다음 코드를 추가합니다.
private void PlayFabMultiplayer_OnLobbyCreateAndJoinCompleted(Lobby lobby, int result) { if (LobbyError.SUCCEEDED(result)) { // Lobby was successfully created Debug.Log(lobby.ConnectionString); } else { // Error creating a lobby Debug.Log("Error creating a lobby"); } }
OnLobbyDisconnected 이벤트 처리기를 정의하려면 클래스에 다음 코드를 추가합니다.
private void PlayFabMultiplayer_OnLobbyDisconnected(Lobby lobby) { // Disconnected from lobby Debug.Log("Disconnected from lobby!"); }
Unity 편집기에서 저장 후 재생을 선택합니다. 콘솔 창에 로비 연결 문자열이 표시됩니다.
로비에 참여
가이드의 이 부분은 다른 고객이 만든 기존 로비에 참여하는 방법을 보여줍니다.
HelloMultiplayerLogic.cs 스크립트를 엽니다. OnLoginSuccess 메서드에서 로비에 참가하기 위해 다음 코드를 추가합니다.
PFEntityKey entityKey = ...; // PlayFab user's entity key string connectionString = "<your lobby connection string>"; PlayFabMultiplayer.JoinLobby( entityKey, connectionString, null);
로컬 클라이언트가 로비에 참여할 때 발생하는 이벤트를 정의하려면
OnLoginSuccess
메서드에 다음 코드를 추가하세요.PlayFabMultiplayer.OnLobbyJoinCompleted += this.PlayFabMultiplayer_OnLobbyJoinCompleted;
OnLobbyJoinCompleted 이벤트 처리기를 정의하려면 다음 코드를 클래스에 추가하세요.
private void PlayFabMultiplayer_OnLobbyJoinCompleted(Lobby lobby, PFEntityKey newMember, int reason) { if (LobbyError.SUCCEEDED(reason)) { // Successfully joined a lobby Debug.Log("Joined a lobby"); } else { // Error joining a lobby Debug.Log("Error joining a lobby"); } }
Unity 편집기에서 저장 후 재생을 선택합니다. 콘솔 창에 "Joined a lobby"라는 문자열이 표시됩니다.
로비 찾기
가이드의 이 부분에서는 다른 고객이 만든 기존 로비를 찾는 방법을 보여줍니다.
HelloMultiplayerLogic.cs 스크립트를 엽니다. OnLoginSuccess 메서드에서 다음 코드를 추가하여 로비를 찾습니다.
PFEntityKey entityKey = ...; // PlayFab user's entity key LobbySearchConfiguration config = new LobbySearchConfiguration(); PlayFabMultiplayer.FindLobbies(entityKey, config);
로컬 클라이언트가 로비를 찾을 때 발생하는 이벤트를 정의하려면
OnLoginSuccess
메서드에 다음 코드를 추가하세요.PlayFabMultiplayer.OnLobbyFindLobbiesCompleted += this.PlayFabMultiplayer_OnLobbyFindLobbiesCompleted;
OnLobbyFindLobbiesCompleted 이벤트 처리기를 정의하려면 클래스에 다음 코드를 추가합니다.
private void PlayFabMultiplayer_OnLobbyFindLobbiesCompleted( IList<LobbySearchResult> searchResults, PFEntityKey newMember, int reason) { if (LobbyError.SUCCEEDED(reason)) { // Successfully found lobbies Debug.Log("Found lobbies"); // Iterate through lobby search results foreach (LobbySearchResult result in searchResults) { // Examine a search result } } else { // Error finding lobbies Debug.Log("Error finding lobbies"); } }
Unity 편집기에서 저장 후 재생을 선택합니다. 콘솔 창에 "Found lobbies"라는 문자열이 표시됩니다.
매치 메이킹 티켓 만들기
가이드 메뉴의 이 부분에서는 매치 메이킹 티켓을 만드는 방법을 보여줍니다. 아래의 다른 클라이언트에서 "매치 메이킹 티켓 참여" 시나리오를 사용하여 실행합니다.
HelloMultiplayerLogic.cs 스크립트를 엽니다.
OnLoginSuccess
메서드에서 다음 코드를 추가하여 매치 메이킹 티켓을 만듭니다.PFEntityKey entityKey = ...; // PlayFab user's entity key PFEntityKey remoteEntityKey = ...; // another PlayFab user's entity key string remoteUserAttributesJson = ...; // JSON string with another PlayFab user's attributes for matchmaking PlayFabMultiplayer.OnMatchmakingTicketStatusChanged += PlayFabMultiplayer_OnMatchmakingTicketStatusChanged; List<MatchUser> localUsers = new List<MatchUser>(); localUsers.Add(new MatchUser(entityKey, remoteUserAttributesJson)); List<PFEntityKey> membersToMatchWith = new List<PFEntityKey>(); membersToMatchWith.Add(remoteEntityKey); PlayFabMultiplayer.CreateMatchmakingTicket( localUsers, "QuickMatchQueueName", membersToMatchWith);
OnMatchmakingTicketStatusChanged 이벤트 처리기를 정의하려면 클래스에 다음 코드를 추가합니다.
private void PlayFabMultiplayer_OnMatchmakingTicketStatusChanged(MatchmakingTicket ticket) { // Store and print matchmaking ticket Debug.Log(ticket.TicketId); // Examine matchmaking ticket status Debub.Log(ticket.Status) // Share matchmaking ticket with other clients taking part in matchmaking // Examine ticket }
Unity 편집기에서 저장 후 재생을 선택합니다.
memberToMatchWith가 지정된 경우 하나의 OnMatchmakingTicketStatusChanged 이벤트 처리기가 트리거되고 상태는 WaitingForPlayers가 됩니다. 이 경우 다른 클라이언트가 JoinMatchmakingTicketFromId를 호출하면 새로운 OnMatchmakingTicketStatusChanged 이벤트 처리기가 트리거되고 이번에는 WaitingForMatch 상태가 됩니다.
또는 하나의 OnMatchmakingTicketStatusChanged 이벤트 처리기가 트리거되고 상태는 WaitingForMatch가 됩니다.
매치 메이킹 티켓에 참여하기
가이드 메뉴의 이 부분에서는 다른 클라이언트가 생성한 기존 매치 메이킹 티켓에 참여하는 방법을 보여줍니다. 위의 다른 클라이언트에서 "매치 메이킹 티켓 만들기" 시나리오를 사용하여 실행합니다.
HelloMultiplayerLogic.cs 스크립트를 엽니다. OnLoginSuccess 메서드에서 다음 코드를 추가하여 매치 메이킹 티켓에 참여합니다.
PFEntityKey entityKey = ...; // PlayFab user's entity key string ticketId = ...; // Matchmaking ticket obtained from the client that created the ticket PlayFabMultiplayer.OnMatchmakingTicketCompleted += PlayFabMultiplayer_OnMatchmakingTicketStatusChanged; // Create JSON string with PlayFab user's attributes for matchmaking. This will need to be shared with other clients taking part in matchmaking string uniqueId = System.Guid.NewGuid().ToString(); string userAttributesJson = "{\"MatchIdentifier\": \"" + uniqueId + "\"}"; PlayFabMultiplayer.JoinMatchmakingTicketFromId( new MatchUser(entityKey, userAttributesJson), ticketId, "QuickMatchQueueName", new List<PFEntityKey>());
OnMatchmakingTicketStatusChanged 이벤트 처리기를 정의하려면 클래스에 다음 코드를 추가합니다.
private void PlayFabMultiplayer_OnMatchmakingTicketStatusChanged(MatchmakingTicket ticket) { // Store and print matchmaking ticket Debug.Log(ticket.TicketId); // Examine matchmaking ticket status Debub.Log(ticket.Status) // Share matchmaking ticket with other clients taking part in matchmaking // Examine ticket }
Unity 편집기에서 저장 후 재생을 선택합니다.
하나의 OnMatchmakingTicketStatusChanged가 WaitingForMatch 상태로 트리거됩니다.
매치 메이킹 티켓 완료
가이드 메뉴의 이 부분에서는 매치 메이킹이 어떻게 완료되는지 보여줍니다. 위의 다른 클라이언트에서 "매치 메이킹 티켓 만들기" 시나리오를 사용하여 실행합니다. 필요에 따라 "매치 메이킹 티켓 가입" 시나리오를 사용하여 실행할 수 있습니다.
동일한 큐에 있는 여러 티켓이 일치할 자격이 있으면 일치 항목이 발견됩니다. 이 경우 OnMatchmakingTicketCompleted 이벤트 처리기가 트리거됩니다.
OnMatchmakignTicketCompleted 처리기 구독
PlayFabMultiplayer.OnMatchmakingTicketCompleted += PlayFabMultiplayer_OnMatchmakingTicketCompleted;
OnMatchmakingTicketCompleted 이벤트 처리기를 정의하려면 클래스에 다음 코드를 추가합니다.
private void PlayFabMultiplayer_OnMatchmakingTicketCompleted(MatchmakingTicket ticket, int result) { if (LobbyError.SUCCEEDED(result)) { // Successfully completed matchmaking ticket Debug.Log("Completed matchmaking ticket"); // Examine matchmaking details MatchmakingMatchDetails details = ticket.GetMatchDetails(); } else { // Error completing a matchmaking ticket Debug.Log("Error completing a matchmaking ticket"); } }