成功コールバックと失敗コールバック

Strix Unity SDKのほとんどの機能はネットワークを利用するため、通常、結果はすぐには利用できません。このため、関数の実行は非同期になります。結果やエラーは戻り値として返るのではなく、代わりにコールバックを利用します。

通常、2つのコールバックがあります。1つは正常に完了したとき、もう1つは失敗したときに呼び出されます。2番目のものを使用して、処理が正常に完了できなかったことを検出できます。

例を見てみましょう:

void JoinRoom(RoomJoinArgs args, RoomJoinEventHandler handler, FailureEventHandler failureHandler, RequestConfig config = null)

これの3番目の引数が失敗ハンドラーです。これらの失敗コールバックの多くはFailureEventHandler型のデリゲートです。これは次のように定義されています。

delegate void FailureEventHandler(FailureEventArgs args);

使用例は次の通りです。

StrixNetwork.instance.JoinRoom(roomJoinArgs, handler: null, failureHandler: failureArgs => {

});

コールバックに渡される引数には、次の定義があります。

public class FailureEventArgs {
    public AbstractSession session { get; set; }
    public Exception cause { get; set; }
}

ご覧の通り、sessioncauseという2つのプロパティがあります。1つ目は、エラーが発生したセッションへの参照です。通常は、現在のルームセッションになります。

ここでは2番目のプロパティが有用です。失敗が発生した理由を知ることができるためです。これを単にコンソールに出力すれば、詳細情報が得られます。または、これをErrorCodeExceptionにダウンキャストしてみることもできます。これが最も一般的な例外の型であり、この型からはエラーコードが取得できます。

ErrorCodeExceptionは次のように定義されています。

public class ErrorCodeException : Exception {
    public int errorCode { get; set; }
    public override string Message { get; }
}

エラーコードがintのプロパティとして定義されていることがわかります。エラーコードの値については、こちらを参照してください。また、Messageプロパティを使用して、エラーの短い説明を文字列として取得することもできます。

これを処理する方法の例を次に示します。

StrixNetwork.instance.JoinRoom(roomJoinArgs, handler: null, failureHandler: failureArgs => {
    var errorCodeException = failureArgs.cause as ErrorCodeException;

    // 失敗の原因となった例外がErrorCodeExceptionの場合、エラーコードを分析できます
    if (errorCodeException != null) {
        // 特定のエラーが分かっていてそれを探している場合は、エラーコードの表を参照した上で直接比較し、専用のエラー処理ロジックを実行できます
        if (errorCodeException.errorCode == SoftGear.Strix.Client.Room.Error.RoomErrorCode.RoomNotFound)
        {
            ...
        // それ以外の場合は、エラーの説明をコンソールに出力できます
        } else {
            Debug.Log("Room search failed. Error: " + errorCodeException.Message
        }
    }
});