すべてをまとめる - 専用サーバーで参加可能なセッションを作成する - (Unity モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
UI を接続してマッチセッションを作成・参加する
-
CreateMatchSessionDSMenu_Starterクラスを開き、作成したラッパーを格納する変数を定義します。private MatchSessionDSWrapper_Starter matchSessionDSWrapper; -
ゲームセッションイベントを処理するコールバック関数を登録する新しい関数を作成します。これらのコールバック関数は次のステップで作成します。
private void RegisterMatchSessionEvents()
{
if (!matchSessionDSWrapper) return;
MatchSessionEssentialsWrapper.OnDSStatusChanged += OnDSStatusChanged;
} -
ゲームセッションイベントのリスニングを停止するため、コールバック関数の登録をクリアする新しい関数を作成します。
private void ClearMatchSessionEvents()
{
if (!matchSessionDSWrapper) return;
MatchSessionEssentialsWrapper.OnDSStatusChanged -= OnDSStatusChanged;
} -
CreateMatchSession()関数を以下のコードに置き換えます。この関数は、選択されたゲームモードに基づいてセッションテンプレートを使用し、新しいゲームセッションを作成するリクエストを送信します。セッションテンプレートはAccelByteWarsOnlineSessionModelsクラスのGetGameSessionRequestModel()を使用して取得されます。private void CreateMatchSession()
{
// Get the session template name from the game config.
SessionV2GameSessionCreateRequest request =
AccelByteWarsOnlineSessionModels.GetGameSessionRequestModel(CreateMatchSessionMenu.SelectedGameMode, GameSessionServerType.DedicatedServerAMS);
if (request == null)
{
BytewarsLogger.LogWarning("Failed to create match session. Session type is not supported.");
stateSwitcher.ErrorMessage = InvalidSessionTypeMessage;
stateSwitcher.SetState(MatchSessionMenuState.Error);
return;
}
// Reregister match session events.
ClearMatchSessionEvents();
RegisterMatchSessionEvents();
// Create a new match session.
stateSwitcher.SetState(MatchSessionMenuState.CreateMatch);
matchSessionDSWrapper.CreateGameSession(request, OnJoinSessionComplete);
} -
JoinMatchSession()関数を以下のコードに置き換えます。この関数は、セッション ID でゲームセッションに参加するリクエストを送信します。private void JoinMatchSession(string sessionId)
{
// Reregister match session events.
ClearMatchSessionEvents();
RegisterMatchSessionEvents();
stateSwitcher.SetState(MatchSessionMenuState.JoinMatch);
matchSessionDSWrapper.JoinGameSession(sessionId, OnJoinSessionComplete);
} -
ゲームセッションが作成または参加されたときに処理するコールバック関数を作成します。成功した場合、メニューを参加状態に切り替え、サーバーを待機します。
private async void OnJoinSessionComplete(Result<SessionV2GameSession> result)
{
// Abort if already attempt to cancel join the match.
if (stateSwitcher.CurrentState is
not (MatchSessionMenuState.CreateMatch or MatchSessionMenuState.JoinMatch))
{
return;
}
if (result.IsError)
{
ClearMatchSessionEvents();
stateSwitcher.ErrorMessage = result.Error.Message;
stateSwitcher.SetState(MatchSessionMenuState.Error);
return;
}
stateSwitcher.SetState(MatchSessionMenuState.JoinedMatch);
await UniTask.Delay(StateChangeDelay * 1000); // Delay a bit before changing menu state.
stateSwitcher.SetState(MatchSessionMenuState.RequestingServer);
} -
LeaveMatchSession()関数を以下のコードに置き換えます。この関数は、退出する有効なセッションがあるかどうかを確認します。ない場合は、単にメニューを閉じて前のメニューに戻ります。private void LeaveMatchSession(string sessionId)
{
ClearMatchSessionEvents();
// Simply return from the menu if the session is empty.
if (string.IsNullOrEmpty(sessionId))
{
MenuManager.Instance.OnBackPressed();
return;
}
stateSwitcher.SetState(MatchSessionMenuState.LeaveMatch);
matchSessionDSWrapper.LeaveGameSession(sessionId, OnLeaveMatchSessionComplete);
} -
セッション退出が完了したときに処理するコールバック関数を作成します。リクエストが失敗した場合はエラー状態に切り替えます。それ以外の場合は、メニューを閉じて前のメニューに戻ります。
private void OnLeaveMatchSessionComplete(Result result)
{
if (result.IsError && result.Error.Code != ErrorCode.SessionIdNotFound)
{
stateSwitcher.ErrorMessage = result.Error.Message;
stateSwitcher.SetState(MatchSessionMenuState.Error);
return;
}
MenuManager.Instance.OnBackPressed();
} -
専用サーバー情報を受信したときに処理するコールバック関数を作成します。専用サーバーのステータスに基づいて、対応するメニュー状態を表示します。
private void OnDSStatusChanged(Result<SessionV2DsStatusUpdatedNotification> result)
{
if (result.IsError)
{
ClearMatchSessionEvents();
stateSwitcher.ErrorMessage = result.Error.Message;
stateSwitcher.SetState(MatchSessionMenuState.Error);
return;
}
SessionV2DsInformation dsInfo = result.Value.session.dsInformation;
switch (dsInfo.StatusV2)
{
case SessionV2DsStatus.AVAILABLE:
ClearMatchSessionEvents();
break;
case SessionV2DsStatus.FAILED_TO_REQUEST:
case SessionV2DsStatus.ENDED:
case SessionV2DsStatus.UNKNOWN:
ClearMatchSessionEvents();
stateSwitcher.ErrorMessage = FailedToFindServerMessage;
stateSwitcher.SetState(MatchSessionMenuState.Error);
break;
default:
stateSwitcher.SetState(MatchSessionMenuState.RequestingServer);
break;
}
} -
次に、事前定義された
OnEnable()関数を以下のコードに置き換えます。このコードは、最初にラッパーを初期化し、メニューが表示されたときにゲームセッションを作成するか参加するかを決定します。また、リトライボタンとキャンセルボタンを適切に再バインドします。private void OnEnable()
{
matchSessionDSWrapper ??= TutorialModuleManager.Instance.GetModuleClass<MatchSessionDSWrapper_Starter>();
if (!matchSessionDSWrapper)
{
return;
}
if (sessionToJoin == null)
{
stateSwitcher.OnRetryButtonClicked = CreateMatchSession;
stateSwitcher.OnCancelButtonClicked = () => LeaveMatchSession(AccelByteWarsOnlineSession.CachedSession.id);
CreateMatchSession();
}
else
{
stateSwitcher.OnRetryButtonClicked = () => JoinMatchSession(sessionToJoin.Session.id);
stateSwitcher.OnCancelButtonClicked = () => LeaveMatchSession(sessionToJoin.Session.id);
JoinMatchSession(sessionToJoin.Session.id);
}
} -
最後に、事前定義された
OnDisable()関数を以下のコードに置き換えて、メニューが閉じられたときにゲームセッションイベントのリスニングを停止します。private void OnDisable()
{
sessionToJoin = null;
ClearMatchSessionEvents();
}
リソース
-
このチュートリアルで使用されるファイルは、Unity Byte Wars GitHub リポジトリで入手できます。