server | v4 switch to v3  

オペレーションの追加

多くの場合、イベントの送信だけではゲームに不十分です。 承認機能、持続性、またはゲーム固有のオペレーションを使用する場合は、ロードバランシングへの拡張が必要です。

このページでは、新しいオペレーションを実装する2つの方法とその使用方法を示しています。 サンプルオペレーションでは、クライアントからのメッセージを受信して確認し、戻り値を提供します。

サーバー側、簡潔な変数

ロードバランシングアプリケーションのサーバー側から始めましょう。この変数はあまり洗練されていませんが、簡潔です。


        //Server SDK
        public void OnOperationRequest(OperationRequest request, SendParameters sendParameters)
        {
            // handle operation here (check request.OperationCode)
            switch (request.OperationCode)
            {
                case 1:
                    {
                        var message = (string)request.Parameters[100];
                        if (message == "Hello World")
                        {
                            // received hello world, send an answer!
                            var response = new OperationResponse
                            {
                                OperationCode = request.OperationCode,
                                ReturnCode = 0,
                                DebugMessage = "OK",
                                Parameters = new Dictionary<byte, object> { { 100, "Hello yourself!" } }
                            };

                            this.SendOperationResponse(response, sendParameters);
                        }
                        else
                        {
                            // received something else, send an error
                            var response = new OperationResponse
                                {
                                    OperationCode = request.OperationCode,
                                    ReturnCode = 1,
                                    DebugMessage = "Don't understand, what are you saying?"
                                };

                            this.SendOperationResponse(response, sendParameters);
                        }

                        return;
                    }
            }
        }

まず、上記のコードは呼び出されたOperationCodeを確認します。この場合は1です。 Photonでは、OperationCodeはオペレーションの名前/型のショートカットです。 以下では、クライアントがこれをどのように呼び出すかを説明します。

オペレーション1が呼び出されたら、リクエストパラメータを確認してください。 ここではパラメータ100を文字列にする必要があります。Photonでは転送時の負荷を軽くするため、 バイト型パラメータのみを使用します。

次に、コー​​ドはメッセージの内容を確認してレスポンスを準備します。 どちらのレスポンスにもreturnCodeとデバッグメッセージがあります。returnCode 0は正常のレスポンスで、他の数値(ここでは1)はエラーを意味する可能性があり、 クライアントが処理する必要があります。

正常なレスポンスには戻り値が含まれます。 複数のキーおよび値のセットを追加できますが、 ここでは文字列である100を使用します。

これはオペレーションの完全な実装です。これが新しいオペレーションの慣習で、クライアントでも引き継いで使用する必要があります。

Back To Top

クライアント側

上記のオペレーションの定義を把握したうえで、クライアント側からオペレーションを呼び出します。 このクライアントコードは、接続時にオペレーションを呼びます。


        public void OnStatusChanged(StatusCode status)
        {
            // handle peer status callback
            switch (status)
            {
            case StatusCode.Connect:
                // send hello world when connected         
                var parameter = new Dictionary<byte, object>();
                parameter.Add((byte)100, "Hello World");

                peer.OpCustom(1, parameter, true);
                break;
                //[...]

上記で定義したように、メッセージは常にパラメータ100となります。これはパラメータDictornaryとして提供されます。 パラメータキーがバイトである点が確認され、それ以外の場合は送信されません。「Hello World」と入力しました。

PhotonPeerメソッドのOpCustomは最初のパラメータとしてOperationCodeを予期します。これは1です。 パラメータが続き、オペレーションが到達することを確認します(オペレーションは、最終的に不可欠であるため)。

これとは別に、クライアントは通常の作業を行う必要があります。 つまり、間隔をおいてPhotonPeer.Serviceを呼び出す必要があります。

結果が利用可能になったら、次のように処理します:


        public void OperationResponse(OperationResponse operationResponse)
        {
            // handle response by code (action we called)
            switch (operationResponse.OperationCode)
            {
                // out custom "hello world" operation's code is 1
                case 1:
                    // OK
                    if (operationResponse.ReturnCode == 0)
                    {
                        // show the complete content of the response
                        Console.WriteLine(operationResponse.ToStringFull());
                    }
                    else
                    {
                        // show the error message
                        Console.WriteLine(operationResponse.DebugMessage);
                    }
                    break;
            }
        }

Back To Top

サーバー側、高度なバージョン

オペレーションを処理するための好ましい方法は、クラスの作成です。 これによって、強く型付けされた状態になり、 パラメータの不足が原因で発生する問題は、フレームワークによって処理されます。

オペレーション、そのパラメータ、型、戻り値の定義は以下の通りです:


//new Operation Class
namespace MyPhotonServer
{
    using Photon.SocketServer;
    using Photon.SocketServer.Rpc;

    public class MyCustomOperation : Operation
    {
        public MyCustomOperation(IRpcProtocol protocol, OperationRequest request)
            : base(protocol, request)
        {
        }

        [DataMember(Code = 100, IsOptional = false)]
        public string Message { get; set; }

        // GetOperationResponse could be implemented by this class, too
    }
}

上記で定義されたオペレーションクラスによって、リクエストをオペレーションクラスにマップし、 強く型付けされた方法でレスポンスを提供することができます。


     public void OnOperationRequest(OperationRequest request, SendParameters sendParameters)
        {
            switch (request.OperationCode)
            {
                case 1:
                    {
                        var operation = new MyCustomOperation(this.Protocol, request);
                        if (operation.IsValid == false)
                        {
                            // received garbage, send an error
                            var response = new OperationResponse
                            {
                                OperationCode = request.OperationCode,
                                ReturnCode = 1,
                                DebugMessage = "That's garbage!"
                            };

                            this.SendOperationResponse(response, sendParameters);
                            return;
                        }

                        if (operation.Message == "Hello World")
                        {
                            // received hello world, send an answer!
                            operation.Message = "Hello yourself!";
                            OperationResponse response = new OperationResponse(request.OperationCode, operation);
                            this.SendOperationResponse(response, sendParameters);
                        }
                        else
                        {
                            // received something else, send an error
                            var response = new OperationResponse
                            {
                                OperationCode = request.OperationCode,
                                ReturnCode = 1,
                                DebugMessage = "Don't understand, what are you saying?"
                            };

                            this.SendOperationResponse(response, sendParameters);
                        }
                        break;
                    }
            }
        }

ドキュメントのトップへ戻る