【发布时间】:2016-05-14 08:05:08
【问题描述】:
我正在 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);
}
}
【问题讨论】:
-
未连接网络时创建本地服务器。本地服务器将模仿网络服务器。
-
@jdweng 我没有想到,但是是的,完全有道理!
标签: c# networking unity3d network-programming