【问题标题】:Provide local and online game-play without a lot of if-statements提供本地和在线游戏,无需大量 if 语句
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 这就是解决方案。只要确保代码独立于部署即可。在客户端中,这应该仅意味着配置文件中 IP 地址的更改。您不应该有任何代码行来区分在线和离线。唯一的例外是您必须区分网络条件或网络接口。
  • @rodolk 通常我会同意,但就我而言,它有点不同。我确实想区分在线和离线,因为如果您在线,您可以选择服务器上的特定房间加入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 2013-07-12
  • 2020-06-16
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 2014-02-01
相关资源
最近更新 更多