This document is about: SERVER 4
SWITCH TO

オペレーションの追加

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

このページでは、新しいオペレーションを実装する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;
               }
       }
   }
Back to top