Skip to main content

Create match session with the SDK - Create joinable sessions with dedicated servers - (Unity module)

Last updated on November 25, 2024

Unwrap the wrapper

In this tutorial, you will learn how to create a match session using the AccelByte Gaming Services (AGS) Game SDK for Unity. In the Byte Wars project, there is already an SDK wrapper created called MatchSessionDSWrapper_Starter.cs. This class is a subclass of MatchSessionWrapper.cs, which will call the AGS Game SDK for Unity API to create a match session.

  • MatchSessionWrapper.cs: A C# script that contains most of the match session implementation.
    • CS file: Assets/Resources/Modules/MatchSession/Scripts/MatchSessionWrapper.cs

As mentioned above, MatchSessionDSWrapper_Starter.cs is a subclass of the MatchSessionWrapper.cs class that already implements several functions for creating and leaving match sessions.

MatchSessionWrapper.cs 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.

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 session 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.

  • MatchSessionDSWrapper_Starter.cs: A C# script that contains most of the match session implementation.
    • CS file: Assets/Resources/Modules/MatchSessionDS/Scripts/MatchSessionDSWrapper_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 MatchSessionDSWrapper_Starter class is a subclass of MatchSessionWrapper.

  1. Update BindMatchSessionDSEvents with the code below. OnCreateMatchSessionDS is called from MatchSessionWrapper right after a match session is created. OnJoinMatchSessionDS, OnCreateMatchCancelled and OnLeaveSessionCompleted are bound in this function.

    protected internal void BindMatchSessionDSEvents()
    {
    OnCreateMatchSessionDS += StartMatchSessionDS;
    OnJoinMatchSessionDS += JoinMatchSessionDS;
    OnCreateMatchCancelled += UnbindDSStatusChanged;
    OnLeaveSessionCompleted += UnbindDSStatusChanged;
    }
  2. Update the UnbindMatchSessionDSEvents function to remove all event listeners that were set up in BindMatchSessionDSEvents.

    protected internal void UnbindMatchSessionDSEvents()
    {
    OnCreateMatchSessionDS -= StartMatchSessionDS;
    OnJoinMatchSessionDS -= JoinMatchSessionDS;
    OnCreateMatchCancelled -= UnbindDSStatusChanged;
    OnLeaveSessionCompleted -= UnbindDSStatusChanged;
    }
  3. In the StartMatchSessionDS function, you need to get the dedicated server (DS) status change notifications from the lobby. Update the function with the following code:

    private void StartMatchSessionDS()
    {
    lobby.SessionV2DsStatusChanged += OnDSStatusChanged;
    }
  4. You need to handle the scenario where the player cancels creating a match session while the lobby notification event is still bound. You will address this in the UnbindDSStatusChanged function. Modify the function using this code:

    private void UnbindDSStatusChanged()
    {
    lobby.SessionV2DsStatusChanged -= OnDSStatusChanged;
    }
  5. In the JoinMatchSessionDS function, you can expect the DS has already been spawned and there is a leader in that session, so you do not need to listen to lobby notifications. After receiving the API result, you need to check if the DS status is available and then call TravelToDS. Implement the following code within the function:

    private void JoinMatchSessionDS(InGameMode gameMode, Result<SessionV2GameSession> result)
    {
    if (!result.IsError)
    {
    BytewarsLogger.Log($"Session Configuration Template Type : {result.Value.configuration.type}");
    if (result.Value.dsInformation.status == SessionV2DsStatus.AVAILABLE)
    {
    TravelToDS(result.Value, gameMode);
    }
    }
    else
    {
    BytewarsLogger.LogWarning($"Error: {result.Error.Message}");
    }
    }
  6. This function is a callback function that you attach to lobby.SessionV2DsStatusChanged. Whenever the DS status becomes available, this function calls the TravelToDS function. Replace the existing function code with this:

    private void OnDSStatusChanged(Result<SessionV2DsStatusUpdatedNotification> result)
    {
    if (!result.IsError)
    {
    SessionV2DsStatus dsStatus = result.Value.session.dsInformation.status;
    BytewarsLogger.Log($"DS Status: {dsStatus}");
    if (dsStatus == SessionV2DsStatus.AVAILABLE)
    {
    BytewarsLogger.Log($"Selected Game Mode :{SelectedGameMode}");
    lobby.SessionV2DsStatusChanged -= OnDSStatusChanged;
    TravelToDS(result.Value.session, SelectedGameMode);
    UnbindMatchSessionDSEvents();
    }
    }
    else
    {
    BytewarsLogger.LogWarning($"Error: {result.Error.Message}");
    }
    }

Resources