2017-02-19 5 views
0

私は、マルチプレイヤーでSmartFoxServerを使用するプロジェクトを持っています。私はサーバーエクステンションを書いていますが、ベストプラクティスが何であるか分かりません。私はいくつかの奇妙な行動を見ています。これが私のクラスをどのようにセットアップしたのかが原因であるかどうかはわかりません。Unity3d Single_Instanceクラスを使用する場合

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:

SFSObject obj = new SFSObject(); 
obj.PutInt("playerCheckingInID", sfs.MySelf.Id); 
sfs.Send(new ExtensionRequest("dealingHand", obj, sfs.LastJoinedRoom)); 
:その後、私のサーバ拡張コードは次のように私のユニティC#コードで呼ばれている

@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(); 
      } 
    } 

    } 

私の拡張機能では、私はこのようなメインクラスを持っています

しかし、私の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人の選手がいます。 Server Extensionに送信される要求は、受信した順に管理する必要があります。

+0

票を落とす場合は、理由を説明できますか? – jason

+0

クライアントコードは、1つのデバイスまたは複数のデバイスで使用しますか? – Pirisok

+0

私は、あなたが団結して呼び出す要求は、1つのデバイスまたは複数のデバイスからのものであることを意味しますか? – Pirisok

答えて

0

マルチプレイヤーゲームを作成する場合は、sfsに接続している各プレーヤーを部屋に参加させてから、部屋に参加したプレーヤーの合計数が4に達したときにそれを確認してから、別の部屋を作り、その部屋に入れてください。 マッチメイキングのための静的ルームをクレタにし、各マッチのダイナミックルームを作成します。 たとえば部屋名MatchFindingRoomを作成し、接続している各プレーヤーに参加します。あなたはユーザーのための部屋を使用する場合

 Room matchFindRoom= getParentExtension().getParentZone() 
       .getRoomByName("MatchFindingRoom"); 
     getApi().joinRoom(user, getParentExtension().getParentZone().getRoomByName("MatchFindingRoom")); 
     List<User> waiterUsers = matchFindRoom.getUserList(); 
     if(waiterUsers.size() >= 4) 
     { 
      CreateRoomSettings crs = new CreateRoomSettings(); 
      crs.setName("testRoom"); 
      crs.setMaxUsers(4); 
      crs.setMaxVariablesAllowed(50); 
      crs.setAutoRemoveMode(SFSRoomRemoveMode.WHEN_EMPTY); 
      getApi().createRoom(getParentExtension().getParentZone(), crs, 
        null, false, null, false, false); 
      Room matchRoom = getParentExtension().getParentZone().getRoomByName("testRoom"); 
      getApi().joinRoom(waiterUsers.get(0), matchRoom); 
      getApi().joinRoom(waiterUsers.get(1), matchRoom); 
      getApi().joinRoom(waiterUsers.get(2), matchRoom); 
      getApi().joinRoom(waiterUsers.get(3), matchRoom); 
      // do other stuff 
     } 

、そしてUはちょうど部屋を取得し、その中のプレーヤーを取得し、それらを追跡するためのトレッドを必要とし、その後、あなたが欲しい、これまで何をしていません。 サーバ上でトレッドを使用しないことを強く推奨します。なぜなら、すべてのユーザがそれを作成すると、サーバのCPUが正しく到達できないからです。

関連する問題