オペレーションの追加
多くの場合、イベントの送信だけではゲームに不十分です。
承認機能、持続性、またはゲーム固有のオペレーションを使用する場合は、ロードバランシングへの拡張が必要です。
このページでは、新しいオペレーションを実装する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