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 无法正常访问它们。
我有一个多人游戏项目,使用 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 无法正常访问它们。