マルチプレイヤーで SmartFoxServer を使用するプロジェクトがあります。サーバー エクステンションを作成していますが、何がベスト プラクティスなのかわかりません。奇妙な動作が見られますが、これがクラスのセットアップ方法によるものかどうかはわかりません。私の拡張機能では、次のようなメイン クラスがあります。
public class MyExtension extends SFSExtension
{
private int numberOfPlayersReady = 0;
@Override
public void init()
{
addRequestHandler("dealingHand",MoveHandler.class );
}
//...some code
public int getNumberOfPlayersReady(){
return numberOfPlayersReady;
}
void setNumberOfPlayersReady(){
numberOfPlayersReady++;
}
}
MoveHandler.java:
@Instantiation(InstantiationMode.SINGLE_INSTANCE)
public class MoveHandler extends BaseClientRequestHandler{
@Override
public void handleClientRequest(User user, ISFSObject params)
{
MyExtension gameExt = (MyExtension) getParentExtension();
int currentNumber = gameExt.getNumberOfPlayersReady();
trace("another player is ready " + currentNumber);
if(currentNumber == 3){
//do something
}else{
int newCurrentNumber = (int)currentNumber + 1;
gameExt.setNumberOfPlayersReady();
}
}
}
次に、私のサーバー エクステンション コードは、次のように Unity C# コードで呼び出されます。
SFSObject obj = new SFSObject();
obj.PutInt("playerCheckingInID", sfs.MySelf.Id);
sfs.Send(new ExtensionRequest("dealingHand", obj, sfs.LastJoinedRoom));
しかし、トレースを表示するために SmartFoxServer スタンドアロン コマンド ラインを見ると、次のように表示されます。
"another player is ready 0"
"another player is ready 0"
"another player is ready 0"
"another player is ready 3"
私は次のように見えると思います:
"another player is ready 0"
"another player is ready 1"
"another player is ready 2"
"another player is ready 3"
ここで何が起こっているのか誰か教えてもらえますか? これは、Single_Instance クラスの使用と関係がありますか?
編集:または、これはスレッドの同期と関係がありますか? もしそうなら、それを管理する最善の方法は何ですか?これはマルチプレイヤーのターン制ゲームです。プレーヤーは常に 4 人です。サーバー エクステンションに送信された要求は、受信した順序で管理する必要があります。