2017-02-19 90 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:

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

    } 

然後我的服務器擴展代碼被稱爲在我的統一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類有關?

編輯: 或者,這是否與同步線程?如果是這樣,那麼最好的管理方法是什麼?這是多人,回合制遊戲。總會有四名球員。發送到服務器分機的請求應按收到的順序進行管理。

+0

如果您打算投票,您能解釋原因嗎? – jason

+0

您在一臺設備或多臺設備上使用客戶端代碼? – Pirisok

+0

我的意思是,您從統一呼叫的請求來自一臺設備或多臺設備? – 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 
     } 

當您使用空間的用戶,那麼你不需要跟蹤他們胎面,只得到房間,並得到裏面的球員,然後做你想做的永遠。 強烈建議不要在服務器上使用腳踏板,因爲如果每個用戶都創建一個腳本,那麼您的服務器cpu無法正常訪問它們。