我在Unity3D中构建一个简单的游戏,可以在离线模式和在线模式下玩。游戏非常简单(作为概念验证)。你有一个球体,可以移动它。在线和离线版本基本完全相同,唯一的区别是在线版本中许多玩家可以同时控制球体。
现在我使用消息传递方法将所有动作发送到服务器,然后将消息传递给所有连接的客户端。但是,如果我只在没有服务器的情况下运行游戏,这种方法将不起作用,除非我对所有可能的交互都有某种条件语句,以检查我当前是在本地还是在线模式。
如何设计代码以使这种检查不必要?我觉得这样的设计非常糟糕。
我的自定义网络管理器如下所示:
public class CustomNetworkManager : NetworkManager {
public override void OnStartClient(NetworkClient mClient) {
base.OnStartClient(mClient); // base implementation is currently empty
mClient.RegisterHandler ((short)CustomMessage.TRANSFORM, OnClientTransformMessage);
}
public override void OnStartServer() {
base.OnStartServer();
NetworkServer.RegisterHandler ((short)CustomMessage.TRANSFORM, OnServerTransformMessage);
}
private void OnServerTransformMessage(NetworkMessage netMsg) {
var msg = netMsg.ReadMessage<CustomMessage.TransformationMessage> ();
CustomMessage.TransformationMessage transformation = new CustomMessage.TransformationMessage ();
transformation.translateVector = msg.translateVector;
TranslateGameObject ("Sphere", msg.translateVector);
NetworkServer.SendToAll ((short)CustomMessage.TRANSFORM, msg);
}
private void OnClientTransformMessage(NetworkMessage netMsg) {
var msg = netMsg.ReadMessage<CustomMessage.TransformationMessage> ();
TranslateGameObject ("Sphere", msg.translateVector);
}
private void TranslateGameObject(string objName, Vector3 translateVector) {
GameObject obj = GameObject.FindGameObjectWithTag (objName);
obj.transform.Translate (translateVector);
}
}