在没有大量if语句的情况下提供本地和在线游戏

时间:2016-05-14 08:05:08

标签: c# networking unity3d network-programming

我在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);
    }
}

1 个答案:

答案 0 :(得分:0)

jdweng发表评论之后,我突然想到了这一点。我可以将游戏作为主机运行,它基本上是一个服务器和一个客户端!