Dead Reckoning - 客户端/服务器游戏 - 如何处理击键

时间:2014-01-06 04:13:46

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

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

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

2 个答案:

答案 0 :(得分:-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);
}

所以在这个例子中我们将速度设置为常量。因此,当朝着一个方向移动时,我们将以恒定的速率在该Vector中旅行,而不关心 B 所在的位置。

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

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

所以,让我们说客户端的操作是关键按下,你发送一个电话给服务器,让你按方向选择,服务器会让你朝那个方向移动,直到动作键按下或改变为止另一个输入的方向。

我希望这有帮助。

答案 1 :(得分:-1)

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

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

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

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

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

关于UDP的问题已经得到解答,而且我确信Wikipedia has a helpful book on UDP and TCP,我没有任何补充。

对航位推算的解释也相当令人满意,我希望我在这个概念中添加了其他角度。

我希望我有所帮助,如果你需要任何澄清或任何其他帮助随时与我联系,如果我不那么无益然后随便投票,我学习计算机工程,我正在创建我的第二个PC游戏所以也许我已经遇到了一些问题,可以分享知识。