Azure PlayFab의 매우 편리한 매치 메이킹 (매칭) 기능을 사용해 보았습니다.
머리
매치 메이킹의 처리는 온라인 게임에는 걸리지 않습니다.
하지만 매치 메이킹을 구현하려고 하면, 하고 싶은 것은 플레이어에게 적절한 룸이나 배틀의 ID를 건네주고 싶습니다만, 다양한 룰(플레이어의 레벨이나 레이트의 고려, 1vs1 or 팀 배틀 or 배틀 로얄)이나 배타 제어를 생각할 필요가 있어 대단합니다.
그런 매치 메이킹을 PlayFab을 사용하면 간단하게 구현할 수 있다고 들었으므로 시험해 보았습니다.
※이번은 복잡한 룰은 다루지 않습니다.
※매치 메이킹은 Public Preview의 기능입니다.
만들어 본 것
PlayFab을 사용한 매칭 흐름
사용할 PlayFab API
1. 사전 준비(GameManager에서 매칭 처리용 큐를 만들어 둔다)
GameManager에 로그인하고 멀티플레이어 > 매치메이킹 > 새 큐를 클릭합니다.
대기열의 구성을 변경하여 대기열을 만듭니다.
필수 항목은
キュー名
및 対戦人数
입니다.이번에는 1vs1의 매칭을 만들므로, 그런 큐명을 지정하고, 대전 인원수는 반드시 2명이므로 2to2로 설정해 둡니다.
대기열이 생겼습니다.
GameManager에서의 사전 준비는 여기까지입니다.
2. 최소한의 코드로 심플한 매칭을 움직여 보자
Unity에서 이런 코드를 작성해 보았습니다.
이것을 움직이면 앞서 붙인 샘플처럼 간단한 1vs1의 매칭을 할 수 있습니다.
using PlayFab;
using PlayFab.ClientModels;
using PlayFab.MultiplayerModels;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
public class SampleSceneController : MonoBehaviour
{
// 処理中のメッセージは雑に全部これに表示します。
[SerializeField] Text textBox;
public void Start()
{
textBox.text = "ログイン中...\n";
// PlayFabにいつも通りログインします。
var request = new LoginWithCustomIDRequest { CustomId = "MyCustomId", CreateAccount = true };
PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnFailure);
void OnLoginSuccess(LoginResult result)
{
textBox.text += "ログインしました!\n\n";
// ログインできたので続けてマッチングの処理を呼びます。
Matchmaking();
}
}
private void Matchmaking()
{
textBox.text += "マッチメイキングチケットをキューに積みます...\n";
// プレイヤーの情報を作ります。
var matchmakingPlayer = new MatchmakingPlayer
{
// Entityは下記のコードで決め打ちで大丈夫です。
Entity = new PlayFab.MultiplayerModels.EntityKey
{
Id = PlayFabSettings.staticPlayer.EntityId,
Type = PlayFabSettings.staticPlayer.EntityType
}
};
var request = new CreateMatchmakingTicketRequest
{
// 先程作っておいたプレイヤー情報です。
Creator = matchmakingPlayer,
// マッチングできるまで待機する秒数を指定します。最大600秒です。
GiveUpAfterSeconds = 30,
// GameManagerで作ったキューの名前を指定します。
QueueName = "1vs1Battle"
};
PlayFabMultiplayerAPI.CreateMatchmakingTicket(request, OnCreateMatchmakingTicketSuccess, OnFailure);
void OnCreateMatchmakingTicketSuccess(CreateMatchmakingTicketResult result)
{
textBox.text += "マッチメイキングチケットをキューに積みました!\n\n";
// キューに積んだチケットの状態をマッチングするかタイムアウトするまでポーリングします。
var getMatchmakingTicketRequest = new GetMatchmakingTicketRequest
{
TicketId = result.TicketId,
QueueName = request.QueueName
};
StartCoroutine(Polling(getMatchmakingTicketRequest));
}
}
IEnumerator Polling(GetMatchmakingTicketRequest request)
{
// ポーリングは1分間に10回まで許可されているので、6秒間隔で実行するのがおすすめです。
var seconds = 6f;
var MatchedOrCanceled = false;
while (true)
{
if (MatchedOrCanceled)
{
yield break;
}
PlayFabMultiplayerAPI.GetMatchmakingTicket(request, OnGetMatchmakingTicketSuccess, OnFailure);
yield return new WaitForSeconds(seconds);
}
void OnGetMatchmakingTicketSuccess(GetMatchmakingTicketResult result)
{
switch (result.Status)
{
case "Matched":
MatchedOrCanceled = true;
textBox.text += $"対戦相手が見つかりました!\n\nMatchIDは {result.MatchId} です!";
return;
case "Canceled":
MatchedOrCanceled = true;
textBox.text += "対戦相手が見つからないのでキャンセルしました...";
return;
default:
textBox.text += "対戦相手が見つかるまで待機します...\n";
return;
}
}
}
void OnFailure(PlayFabError error)
{
Debug.Log($"{error.ErrorMessage}");
}
}
3. 플레이어의 레이트와 레벨 차이를 고려한 매칭을 움직여 본다
실제 게임에서는 레이트와 레벨 차이에 따라 초보자와 상급자의 매칭을 나누기도 하는군요.
PlayFab에서는 어떻게 제어해야 하는지 시험해 보았습니다.
3.1. 대기열에 규칙 추가
방금 큐를 만들었을 때는 최소한의 내용만 정의했습니다.
이번에는 다음과 같은 규칙을 추가해 보겠습니다.
이 규칙을 추가하면 Rate 차이가 101 이상인 플레이어가 일치하지 않습니다.
3.2. 플레이어의 Rate 정보를 티켓에 포함
이전 코드에서 티켓의 MatchmakingPlayer에는 Entity 정보만 포함되어 있었습니다.
이번에는 Rate에 대한 정보를 제공하기 위해 Attributes를 사용합니다.
// マッチングさせるプレイヤーの情報を作ります。
var matchmakingPlayer = new MatchmakingPlayer
{
// Entityは下記のコードで決め打ちで大丈夫です。
Entity = new PlayFab.MultiplayerModels.EntityKey
{
Id = PlayFabSettings.staticPlayer.EntityId,
Type = PlayFabSettings.staticPlayer.EntityType
},
// これ以下を追記
Attributes = new MatchmakingPlayerAttributes
{
// このプレイヤーは Rate 900~1100 のプレイヤーとしかマッチングしない
DataObject = new { Rate = 1000 }
}
};
이것만으로 속도와 레벨 차이를 고려한 매칭을 구현할 수있었습니다.
이것은 편하고 좋다.
후기
이번에는 매치 메이킹의 기본 부분을 만져 보았습니다.
아직 공식 문서을 읽지 않았지만 PlayFab의 매치 메이킹 기능은 더 복잡한 매칭 규칙과 팀 배틀에도 대응하고 있다는 것이므로 계속 접해 보려고 생각합니다.
Reference
이 문제에 관하여(Azure PlayFab의 매우 편리한 매치 메이킹 (매칭) 기능을 사용해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/_y_minami/items/6a686a88cca7da08db2f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)