Create match session with the SDK - Create joinable sessions with peer-to-peer - (Unity module)
Browsing P2P sessions is not supported in WebGL builds due to the AccelByte Gaming Services (AGS) SDK for Unity lacking the P2P functionality for WebGL.
Unwrap the wrapper
In this tutorial, you will learn how to create a match session using the AGS Game SDK for Unity. In the Byte Wars project, there is already an SDK wrapper created called MatchSessionWrapper.cs
. This class will call the AGS Game SDK for Unity API to create a match session.
There is also the P2PHelper.cs
class provided that contains several functions for starting as a peer-to-peer (P2P) host and joining a P2P session. You can find the CS file in Assets/Resources/Modules/MatchmakingSessionP2P/Scripts/P2PHelper.cs
.
There are two variables in P2PHelper.cs
: transportManager
, is a custom network transport from the AGS network transport, and networkManager
to hold a reference to the NetworkManager
class.
private static AccelByteNetworkTransportManager transportManager;
private static NetworkManager networkManager;
The Init
function initializes the custom network transport.
private static void Init()
{
if (transportManager != null)
{
return;
}
networkManager = NetworkManager.Singleton;
transportManager = networkManager.gameObject.AddComponent<AccelByteNetworkTransportManager>();
ApiClient apiClient = AccelByteSDK.GetClientRegistry().GetApi();
transportManager.Initialize(apiClient);
}
To set up the network transport, the SetP2PNetworkTransport
function is used. In this function, the AccelByteNetworkTransportManager
initializes and it is used as a network transport to establish a P2P connection. You need the match session ID in the connection data.
private static void SetP2PNetworkTransport(InGameMode gameMode, string matchSessionId)
{
Init();
InitialConnectionData data = new InitialConnectionData() { inGameMode = gameMode, serverSessionId = matchSessionId };
networkManager.NetworkConfig.ConnectionData = GameUtility.ToByteArray(data);
networkManager.NetworkConfig.NetworkTransport = transportManager;
}
To start as a P2P host, the StartAsHost
function is used. This function will start the network manager that has been set up with the in-game mode and match session ID. Then, it starts the network manager as a host.
public static async void StartAsHost(InGameMode gameMode, string matchSessionId)
{
await GameManager.ShowTravelingLoading();
GameManager.Instance.ResetCache();
GameData.ServerType = ServerType.OnlinePeer2Peer;
SetP2PNetworkTransport(gameMode, matchSessionId);
networkManager.StartHost();
BytewarsLogger.Log($"Start P2P Host");
GameManager.StartListenNetworkSceneEvent();
}
To start as a client a P2P network, the StartAsP2PClient
function is used. This function needs the host user ID, which you will get from the game session.
public static async void StartAsP2PClient(string hostUserId, InGameMode gameMode, string matchSessionId)
{
await GameManager.ShowTravelingLoading();
GameManager.Instance.ResetCache();
GameData.ServerType = ServerType.OnlinePeer2Peer;
SetP2PNetworkTransport(gameMode, matchSessionId);
transportManager.SetTargetHostUserId(hostUserId);
networkManager.StartClient();
BytewarsLogger.Log($"Start P2P Client hostUserId: {hostUserId}");
}
There is also a file called MatchSessionWrapper.cs
. This file has the CreateMatchSession
function that will create a match session by performing a set of operations, such as getting the game session configuration, binding the leave session event, and creating a game session by calling CreateSession
. You will use the CreateMatchSession
method from the MatchSessionWrapper.cs
class. MatchSessionWrapper.cs
is located in Assets/Resources/Modules/MatchSession/Scripts/MatchSessionWrapper.cs
.
protected internal void CreateMatchSession(InGameMode inGameMode, GameSessionServerType sessionServerType)
{
GameManager.Instance.OnClientLeaveSession += LeaveCurrentGameSession;
GameManager.OnDisconnectedInMainMenu += DisconnectFromServer;
lobby.SessionV2GameSessionMemberChanged += OnV2GameSessionMemberChanged;
SelectedGameMode = inGameMode;
ConnectionHandler.Initialization();
Dictionary<InGameMode,
Dictionary<GameSessionServerType,
SessionV2GameSessionCreateRequest>> gameSessionConfig = GameSessionConfig.SessionCreateRequest;
if (!gameSessionConfig.TryGetValue(inGameMode, out var matchTypeDict))
{
BytewarsLogger.LogWarning($"GameSession Configuration not found");
return;
}
if (!matchTypeDict.TryGetValue(sessionServerType, out var request))
{
BytewarsLogger.LogWarning($"Matchtype not found");
return;
}
request.attributes = CreateMatchConfig.CreatedMatchSessionAttribute;
if (ConnectionHandler.IsUsingLocalDS())
{
request.serverName = ConnectionHandler.LocalServerName;
}
// Add preferred regions.
string[] preferredRegions = RegionPreferencesHelper.GetEnabledRegions().Select(x => x.RegionCode).ToArray();
if (preferredRegions.Length > 0)
{
request.requestedRegions = preferredRegions;
}
// Playing with Party additional code
if (!string.IsNullOrEmpty(PartyHelper.CurrentPartyId))
{
string[] memberIds = PartyHelper.PartyMembersData.Select(data => data.UserId).ToArray();
request.teams = new SessionV2TeamData[]
{
new SessionV2TeamData()
{
userIds = memberIds
}
};
}
CreateSession(request);
}
What's in the starter pack
A C# script to create match sessions using dedicated servers has been prepared for you. You will add additional code to it so it can connect to the AGS Game SDK for Unity. The script is called MatchSessionP2PWrapper_Starter.cs
and is located in Assets/Resources/Modules/MatchSessionP2P/Scripts/MatchSessionP2PWrapper_Starter.cs
.
Implement create match session
In this section, you will implement the AGS Game SDK for Unity API call to create a match session. This MatchSessionP2PWrapper_Starter
class is a subclass of MatchSessionWrapper
.
First, you need to update
BindMatchSessionP2PEvents
. You haveOnCreateMatchSessionP2P
, which is called fromMatchSessionWrapper
right after a match session is created. You also bindOnJoinMatchSessionP2P
,OnCreateMatchCancelled
andOnLeaveSessionCompleted
in this function.protected internal void BindMatchSessionP2PEvents()
{
OnCreateMatchSessionP2P += StartP2PHost;
OnJoinMatchSessionP2P += StartP2PClient;
OnCreateMatchCancelled += UnbindMatchSessionP2PEvents;
OnLeaveSessionCompleted += UnbindMatchSessionP2PEvents;
}Update
UnbindMatchSessionP2PEvents
function to remove all event listeners that were set up inBindMatchSessionP2PEvents
.protected internal void UnbindMatchSessionP2PEvents()
{
OnCreateMatchSessionP2P -= StartP2PHost;
OnJoinMatchSessionP2P -= StartP2PClient;
OnCreateMatchCancelled -= UnbindMatchSessionP2PEvents;
OnLeaveSessionCompleted -= UnbindMatchSessionP2PEvents;
}In the
StartP2PHost
function, you use theP2PHelper.StartAsHost
function. Update the function with the following code:private void StartP2PHost(InGameMode gameMode, Result<SessionV2GameSession> result)
{
GameData.ServerSessionID = result.Value.id;
P2PHelper.StartAsHost(gameMode, result.Value.id);
}Similar with the step before, you need to use the
P2PHelper.StartP2PClient
function and pass the leader ID from the game session to theStartAsP2PClient
function. Modify the function using this code:private void StartP2PClient(InGameMode gameMode, Result<SessionV2GameSession> result)
{
P2PHelper.StartAsP2PClient(result.Value.leaderId, gameMode, result.Value.id);
}