オペレーションの追加
多くの場合、イベントの送信だけではゲームに不十分です。
承認機能、持続性、またはゲーム固有のオペレーションを使用する場合は、ロードバランシングへの拡張が必要です。
このページでは、新しいオペレーションを実装する2つの方法とその使用方法を示しています。
サンプルオペレーションでは、クライアントからのメッセージを受信して確認し、戻り値を提供します。
サーバー側、簡潔な変数
ロードバランシングアプリケーションのサーバー側から始めましょう。この変数はあまり洗練されていませんが、簡潔です。
C#
        //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を使用します。
これはオペレーションの完全な実装です。これが新しいオペレーションの慣習で、クライアントでも引き継いで使用する必要があります。
クライアント側
上記のオペレーションの定義を把握したうえで、クライアント側からオペレーションを呼び出します。
このクライアントコードは、接続時にオペレーションを呼びます。
C#
        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を呼び出す必要があります。
結果が利用可能になったら、次のように処理します:
C#
        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;
            }
        }
サーバー側、高度なバージョン
オペレーションを処理するための好ましい方法は、クラスの作成です。
これによって、強く型付けされた状態になり、 パラメータの不足が原因で発生する問題は、フレームワークによって処理されます。
オペレーション、そのパラメータ、型、戻り値の定義は以下の通りです:
C#
//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
    }
}
上記で定義されたオペレーションクラスによって、リクエストをオペレーションクラスにマップし、
強く型付けされた方法でレスポンスを提供することができます。
C#
     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;
                    }
            }
        }