2014-01-06 32 views
2

我已阅读了一些关于航位推算的文章,但对我来说还是有点混淆。 我很确定我理解点击移动的概念,但是如何在运动的终点未知时更新客户端和服务器之间的按键移动?航位推测 - 客户端/服务器游戏 - 如何处理键击

如果没有终点,你会如何评估玩家去哪里(服务器端)?

+0

“UDP” 是补充 “TCP”。在TCP确保交付并因此增加了复杂性的情况下,UDP发送消息并希望消息到达那里,以可靠性为代价来节省复杂性。 –

+0

我真的不明白你的问题,你能举个例子吗? –

+0

航位推算是一款由玩家选择的导航术语。它有多重含义。您需要为您读过的引起混淆的项目提供参考。 – Gene

回答

-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

让我们来看看......我明白你知道如何编写代码,但没有什么,对吗?

您可以将击键直接提供给服务器并让它完成所有工作。服务器不需要知道你的目标,它有你的坐标和方向,这就是它所需要的,除非你有服务器处理的AI。在后一种情况下,你可以做类似于团结光线投射的东西,开始检查什么是直行,看看它是否是任何感兴趣的,如果是这样,你知道的潜在目标。

不断发送回客户的所有数据是安全的,因此它始终处于最新状态。如果您认为这会影响您的连接,那么您可以每隔50毫秒或者您认为安全的频率做到这一点,并且为了顺利的功能估计客户端的一切。确保服务器执行所有碰撞检测和所有与UI无关的机制,否则游戏将容易出现客户端故障或恶意篡改。

如果你必须看看玩家可能会去的地方,你可以使用一些方法,你可以在世界上有许多虚拟的立方体来跟踪里面的东西,这将简化查找在资源方面有什么优势,或者你可以检查一切,这在机器上相当沉重,但是这也增加了一些其他的复杂性。在第一种情况下,一旦遇到障碍,不要忘记停止看。

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

有关UDP的问题已经得到解答,加上我确定Wikipedia has a helpful book on UDP and TCP,我没有什么补充。

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

我希望我的帮助,如果您需要任何澄清或任何其他帮助随时与我联系,如果我不够无益,然后随意downvote,我学习计算机工程,并创造我的PC的第二场比赛,所以也许我已经遇到了一些问题,可以分享知识。

+0

我发现你的答案是一个合理的建议清单,以模糊和难以回答的问题。您的列表可能不直接针对提问者的情况,但他们的主题是国际海事组织。 Upvoting。 (但下一次,使用更多的空格';-)'。此外,链接,或从文件exceprts备份你说会避开downvoters什么。) –

+0

感谢您抽出来编辑和增强的时候,我想提高我的帖子的出现,我感谢您的建议,我会牢记它们的! – user3079666

相关问题