Unity3d什么时候用Single_Instanceclass

Unity3d When to use Single_Instance class

我有一个多人游戏项目,使用 SmartFoxServer。我正在编写服务器扩展,但不确定最佳做法是什么。我看到了一些奇怪的行为,我不确定这是否是我设置 classes 的原因。在我的扩展中,我有一个像这样的主要 class:

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 class 有关系吗?

编辑: 或者,这是否与同步线程有关?如果是这样,管理它的最佳方法是什么?这是一款多人回合制游戏。永远会有四个玩家。发送到服务器扩展的请求应该按照接收到的顺序进行管理。

如果您要制作多人游戏,请将每个连接到 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 无法正常访问它们。