【问题标题】:Dead Reckoning - Client/Server game - How to handle keystrokes航位推算 - 客户端/服务器游戏 - 如何处理击键
【发布时间】:2014-01-06 04:13:46
【问题描述】:

我已经阅读了几篇关于航位推算的文章,但对我来说还是有点困惑。 我很确定我了解点击移动的概念,但是当移动的终点未知时,如何更新客户端和服务器之间的击键移动?

如果没有终点,您将如何估计玩家的去向(服务器端)?

【问题讨论】:

  • “UDP”是“TCP”的补充。 TCP 确保传递并因此增加了复杂性,而 UDP 发送消息并希望它到达那里,以可靠性为代价来节省复杂性。
  • 我不太明白你的问题,你能举个例子吗?
  • 航位推算是游戏玩家选择的导航术语。它有多种含义。你需要为你读过的引起混淆的项目提供参考。

标签: java udp client-server latency dead-reckoning


【解决方案1】:

让我们从航位推算开始。试着在没有左右移动的直线上思考它。

您在 A 点并想要到达 B 点。您知道到点 B 的距离,因此您可以计算到达那里需要多少 加速度速度。航位推算以另一种方式运作。您位于 A 点,将以设定的速度 移动以靠近 B 点。

在电子游戏世界中,他们一直使用这种方法。因此,当您移动到点 B 时不要考虑它,您只是在逐步向点 B 移动,因为就像 FPS 一样,您的点 B 会不断移动。事实上,它实际上只是在B点的方向上逐步移动。

一旦你开始前进,你就可以开始担心左/右和上/下,这将遵循相同的原则,只是在不同的方向上。

至于实现这一点,您有 2 个选项。

一种方法是,您可以在客户端进行此计算,然后将新位置发送到服务器。然后更新其他人在屏幕上看到的内容。

我认为更好的另一种方法是,您可以在服务器端进行所有这些计算,然后在您结束时收到更新。 X-Box live 将其中一个控制台作为主机,以便机器运行所有软件,而外部用户只是触发事件。这就是为什么您会听到人们抱怨拥有不公平的房东优势。

现在让我们看一些代码。此脚本来自 Unity Sdk 标准安装包。

/// This script moves the character controller forward 
/// and sideways based on the arrow keys.
/// It also jumps when pressing space.
/// Make sure to attach a character controller to the same game object.
/// It is recommended that you make only one call to Move or SimpleMove per frame.  

var speed : float = 6.0; 
var jumpSpeed : float = 8.0;
var gravity : float = 20.0;
private var moveDirection : Vector3 = Vector3.zero;
function Update() {
    var controller : CharacterController = GetComponent(CharacterController);
    if (controller.isGrounded) {
        // We are grounded, so recalculate
        // move direction directly from axes
        moveDirection = Vector3(Input.GetAxis("Horizontal"), 0,
                                Input.GetAxis("Vertical"));
        moveDirection = transform.TransformDirection(moveDirection);
        moveDirection *= speed;

        if (Input.GetButton ("Jump")) {
            moveDirection.y = jumpSpeed;
        }
    }
    // Apply gravity
    moveDirection.y -= gravity * Time.deltaTime;

    // Move the controller
    controller.Move(moveDirection * Time.deltaTime);
}

所以在这个例子中,我们将速度设置为一个常数。因此,当向一个方向移动时,我们将以恒定的速度在该向量中移动,而无需关心点 B 的位置。

跳跃速度是我们在 y 轴上沿正方向移动的速度以及在负方向上停止在点 0 处的重力。

那么,你怎么能用这个呢?您可以构建一个执行移动操作的服务器脚本,并拥有一个将方向信息传递给服务器的客户端控制器。

假设在客户端操作是按键按下,您向服务器发送调用以将您移动到方向选择中,服务器将让您继续朝该方向移动,直到操作按键按下或更改来自另一个输入的方向。

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    让我们看看...我知道您知道如何编码,但不是什么,对吗?

    您可以将击键直接提供给服务器并让它完成所有工作。服务器不需要知道你要去哪里,它有你的坐标和方向,这就是它所需要的,除非你有服务器处理的人工智能。在后一种情况下,您可以在 Unity 中执行类似于光线投射的操作,开始检查正前方的内容,看看是否有兴趣,如果有,您就知道潜在的目的地。

    不断将他的所有数据发回给客户是安全的,因此它始终是最新的。如果您认为这会使您的连接紧张,您可以每 50 毫秒执行一次,或者按照您认为安全的频率执行此操作,并且为了实现流畅的功能,也要估计客户端的所有内容。确保服务器完成所有碰撞检测和所有与 UI 无关的机制,否则游戏将容易出现客户端故障或恶意篡改。

    如果您确实必须查看玩家可能要去的地方,您可以使用几种方法,您可以在世界上拥有许多虚拟立方体来跟踪其中的内容,这将简化查找内容在资源方面领先,或者您可以检查所有内容,这在机器上相当繁重,但这也增加了一些其他复杂性。在第一种情况下,一旦遇到障碍物,请不要忘记停止寻找。

    您还可以计算玩家的方向与其他重要项目之间的角度,以检查他的其他想法。

    关于UDP的问题已经回答了,另外我确定Wikipedia has a helpful book on UDP and TCP,我没有什么要补充的。

    航位推算的解释也中规中矩,希望能在概念上增加其他的角度。

    我希望我有所帮助,如果您需要任何澄清或任何其他帮助,请随时与我联系,如果我没有帮助,请随时投反对票,我学习计算机工程并正在为 PC 创建我的第二个游戏,所以也许我已经遇到了一些问题,可以分享知识。

    【讨论】:

    • 我发现您的回答是对一个模糊且难以回答的问题的合理建议列表。您的列表可能没有直接解决提问者的问题,但它们是主题,IMO。赞成。 (但下一次,请使用更多空格 ;-)。此外,支持您所说内容的文档链接或摘录将避免投票者反对。)
    • 感谢您抽出宝贵时间进行编辑和改进,我正在努力改善我的帖子的外观,感谢您的建议,我确实会记住它们!
    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 2012-02-21
    • 2015-03-24
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多