接続エラー時の利用規約同意処理方法
Last updated on February 4, 2026
注釈:本資料はAI技術を用いて翻訳されています。
定期メンテナンスや予期しない接続問題などのネットワーク障害中に、プレイヤーが同意した利用規約がリーガルサービスで適切に更新されない可能性があります。この問題が正しく処理されない場合、プレイヤーは自分の同意ステータスが更新されていないことに気づかず、混乱やアクセス問題の可能性につながります。
これを防ぐために、プレイヤーの利用規約ステータスが正常に更新されるまでリクエストを再試行するエラー処理を実装することが重要です。一般的なアプローチは、ゲームレベルでタイマーベースの再試行システムを使用することです。以下は、最大5回の再試行と10秒の再試行遅延でこの再試行システムを実装する例です。
- Unreal Engine OSS
- Unreal Engine SDK
- Unity
...
int MaxRetryAttempts{5};
int NRetryAttempt{0};
int RetryDelay{10};
FTimerHandle RetryTimerHandle;
FDelegateHandle AccelByteAcceptAgreementPoliciesHandle;
int32 LocalUserNum = 0;
...
void AcceptLegal()
{
...
auto ABSubsystem = IOnlineSubsystem::Get(ACCELBYTE_SUBSYSTEM);
auto AgreementInterface = ABSubsystem->GetAgreementInterface();
auto ABAgreementInterface = StaticCastSharedPtr<FOnlineAgreementAccelBytePtr>(AgreementInterface);
TArray<FABAcceptAgreementPoliciesRequest> DocumentToAccept;
FABAcceptAgreementPoliciesRequest PoliciesRequest;
PoliciesRequest.BasePolicyId = TEXT("<PolicyVersionId>");
PoliciesRequest.LocaleCode = TEXT("en");
DocumentToAccept.Add(PoliciesRequest);
AccelByteAcceptAgreementPoliciesHandle = AgreementInterface->AddAccelByteOnAcceptAgreementPoliciesCompletedDelegate_Handle(LocalUserNum
, FAccelByteOnAcceptAgreementPoliciesCompletedDelegate::CreateLambda([this](int32 AcceptAgreementLocalUserNum, bool bWasSuccessful, const FOnlineErrorAccelByte& ResultState)
{
if (bWasSuccessful)
{
// Do something when the accept the agreement is successful.
NRetryAttempt = 0;
}
else
{
// Implement a solution to handle failed request.
if(NRetryAttempt < MaxRetryAttempts)
{
GetWorld()->GetTimerManager().SetTimer(RetryTimerHandle, [this]()
{
UpdatePlayerMMR();
}, RetryDelay, false);
NRetryAttempt++;
}
else
{
// Show an error message pop up!
}
}
AgreementInterface->ClearAccelByteOnAcceptAgreementPoliciesCompletedDelegate_Handle(LocalUserNum, AccelByteAcceptAgreementPoliciesHandle);
})
);
AgreementInterface->AcceptAgreementPolicies(LocalUserNum, DocumentToAccept);
...
}
...
int MaxRetryAttempts{5};
int NRetryAttempt{0};
int RetryDelay{10};
FTimerHandle RetryTimerHandle;
...
void AcceptLegal()
{
...
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
TArray<FAccelByteModelsAcceptAgreementRequest> AcceptAgreementRequests;
FAccelByteModelsAcceptAgreementRequest AcceptRequest;
AcceptRequest.IsAccepted = true;
AcceptRequest.PolicyId = TEXT("<PolicyId>");
AcceptRequest.PolicyVersionId = TEXT("<PolicyVersionId>");
AcceptRequest.LocalizedPolicyVersionId = TEXT("<LocalizedPolicyVersionId>");
AcceptAgreementRequests.Add(AcceptRequest);
ApiClient->Agreement.BulkAcceptPolicyVersions(AcceptAgreementRequests,
THandler<FAccelByteModelsAcceptAgreementResponse>::CreateLambda([this](const FAccelByteModelsAcceptAgreementResponse& Result)
{
// Do something when the accept the agreement is successful.
NRetryAttempt = 0;
}), FErrorHandler::CreateLambda([this](int32 Code, const FString& Message)
{
UE_LOG(LogTemp, Warning, TEXT("Error accept the agreement. Code: %d, Message: %s"), ErrorCode, *ErrorMessage);
if(ErrorCode == static_cast<int32>(ErrorCodes::NetworkError))
{
// Implement a solution to handle HTTP retry timeout.
if(NRetryAttempt < MaxRetryAttempts)
{
GetWorld()->GetTimerManager().SetTimer(RetryTimerHandle, [this]()
{
AcceptLegal();
}, RetryDelay, false);
NRetryAttempt++;
}
else
{
// Show an error message pop up!
}
}
})
);
...
}
...
int maxRetryAttempts = 5;
int nRetryAttempt = 0;
int retryDelay = 10;
...
public void AcceptLegal()
{
...
List<AcceptAgreementRequest> acceptAgreementRequests = new List<AcceptAgreementRequest>();
AcceptAgreementRequest acceptAgreementRequest = new AcceptAgreementRequest
{
isAccepted = true,
policyId = "<policyId>",
policyVersionId = "<policyVersionId>",
localizedPolicyVersionId = "<LocalizedPolicyVersionId>"
};
acceptAgreementRequests.Add(acceptAgreementRequest);
AccelByteSDK.GetClientRegistry().GetApi().GetAgreement().BulkAcceptPolicyVersions(acceptAgreementRequests.ToArray(), result =>
{
if (!result.IsError)
{
// Do something when the accept the agreement is successful.
nRetryAttempt = 0;
}
else
{
// Implement a solution to handle failed request.
Debug.LogWarning($"Unable to login. Code: {result.Error.Code}, Message: {result.Error.Message}");
if(result.Error.Code.Equals(ErrorCode.NetworkError))
{
// Implement a solution to handle HTTP retry timeout.
StartCoroutine(RetryAcceptLegal);
}
}
});
...
}
private IEnumerator RetryAcceptLegal()
{
if(nRetryAttempt < maxRetryAttempts)
{
yield return new WaitForSeconds(retryDelay);
nRetryAttempt++;
AcceptLegal();
}
else
{
// Show an error message pop up!
}
}
リクエストがこちらにリストされているエラーコードのいずれかに遭遇した場合、システムがリクエストの再試行を開始するときにエラーデリゲートはトリガーされません。エラーデリゲートは、再試行プロセスが終了した後にのみトリガーされます—再試行制限に達した(タイムアウト)場合、または最終的な応答コードがリストされたエラーコードのいずれでもない場合です。