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

3
我已经阅读了几篇关于死推算的文章,但对我来说仍然有点困惑。 我相信我理解了点并单击移动的概念,但是当移动的终点不知道时,我该如何更新客户端和服务器之间的按键移动?
如果没有终点,你将如何估计玩家(服务器端)的行动方向?

"UDP" 是 "TCP" 的补充。其中,TCP 确保传递,因此增加了复杂性;而 UDP 发送消息并希望其到达,以可靠性为代价节省了复杂性。 - Samuel Åslund
我不太明白你的问题,能否给一个例子? - Carlos Verdes
Dead reckoning是游戏玩家借用的导航术语,具有多重含义。您需要为阅读引起困惑的项目提供参考资料。 - Gene
2个回答

1
让我们从死推算开始。试着在一条没有左右移动的直线上考虑它。
你在点A处,想要到达点B。你知道到点B的距离,因此可以计算出需要多少加速度和速度才能到达那里。死推算法则相反。你在点A处,并以设定的速度移动以接近点B。
在视频游戏世界中,他们经常使用这种方法。因此,不要认为你正在移动到点B,而只是向点B移动一小段距离,因为在像FPS这样的游戏中,你的点B将不断移动。实际上,它只是沿着指向点B的方向逐步移动。
一旦你开始向前移动,就可以开始考虑左/右和上/下,其原理相同,只是方向不同。
至于实现这一点,你有两个选择。

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

我认为更好的另一种方法是在服务器端进行所有这些计算,只需接收更新您所在位置的信息即可。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。
那么,如何使用它?您可以构建一个执行移动操作的服务器脚本,并拥有一个客户端控制器,将方向信息传递给服务器。
因此,假设在客户端侧按下键,您发送一个调用到服务器以在选择方向上移动,服务器将使您沿着该方向移动,直到按键弹起或来自其他输入的方向改变。
希望这有所帮助。

-1

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

您可以直接将按键输入发送到服务器,让它完成所有工作。服务器不需要知道您要去哪里,它有您的坐标和方向就足够了,除非您有由服务器处理的人工智能。在后一种情况下,您可以类似于Unity中的射线投射,开始检查前方是否有任何感兴趣的东西,如果有,那么您就知道了潜在的目的地。

将所有数据不断发送回客户端是安全的,因此始终保持最新状态。如果您认为这会影响连接,则可以每50毫秒或您认为安全的频率执行此操作,并在客户端上估计所有平滑功能。确保服务器执行所有与UI无关的碰撞检测和机制,否则游戏将容易出现客户端故障或恶意篡改。

如果你需要查看玩家可能去哪里,可以使用一些方法。你可以在世界中设置虚拟立方体的数量,以跟踪其中的内容,这将简化查找资源前方的内容;或者你可以检查所有的物品,但对机器负荷较重,也增加了其他复杂性。在第一种情况下,请不要忘记在遇到障碍时停止查找。

你还可以计算玩家朝向与其他重要物品之间的角度,以检查他是否注意到其他事物。

关于UDP的问题已经有了答案,此外我相信维基百科有一本有关UDP和TCP的有用书籍,我没有什么可补充的。

关于死推算法的解释也相当令人满意,我希望能为此概念增加一些其他角度。

希望我的回答能有所帮助。如果您需要澄清或其他任何帮助,请随时联系我。如果我的回答不够有用,请自由地进行负投票。我学习计算机工程,正在为PC创建我的第二个游戏,所以也许我已经遇到过某些问题,并且可以分享知识。


我认为你的回答是对一个模糊且难以回答的问题提出合理建议的清单。你的清单可能并没有直接解决提问者的问题,但它们是相关的,在我看来值得点赞。(但下次请使用更多的空格 ;-)。此外,提供支持你观点的文档链接或摘录可以避免被踩。) - Patrick M
感谢您抽出时间进行编辑和改进,我正在努力改善我的帖子外观,感谢您的建议,我一定会记在心里! - user3079666

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接