我读过一些关于航位推算的文章,但对我来说仍然有点困惑。我很确定我理解点击移动的概念,但是当移动的终点未知时,我将如何更新客户端和服务器之间的击键移动?
如果没有终点,您将如何估计玩家的去向(服务器端)?
我读过一些关于航位推算的文章,但对我来说仍然有点困惑。我很确定我理解点击移动的概念,但是当移动的终点未知时,我将如何更新客户端和服务器之间的击键移动?
如果没有终点,您将如何估计玩家的去向(服务器端)?
让我们从航位推算开始。试着在没有左右移动的直线上思考它。
您在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 处的重力。
那么,你怎么能用这个呢?您可以构建一个执行移动操作的服务器脚本,并拥有一个将方向信息传递给服务器的客户端控制器。
因此,假设在客户端操作是按键按下,您向服务器发送呼叫以将您移动到方向选择中,服务器将让您继续朝该方向移动,直到操作按键按下或从另一个方向改变输入。
我希望这会有所帮助。
让我们看看...我知道您知道如何编码,但不是什么,对吗?
您可以将击键直接提供给服务器并让它完成所有工作。服务器不需要知道你要去哪里,它有你的坐标和方向,这就是它所需要的,除非你有服务器处理的人工智能。在后一种情况下,您可以在 Unity 中执行类似于 raycasting 的操作,开始检查正前方的内容,看看是否有任何感兴趣的内容,如果有,您就知道潜在的目的地。
不断将他的所有数据发回给客户是安全的,因此它始终是最新的。如果您认为这会使您的连接紧张,您可以每 50 毫秒执行一次,或者按照您认为安全的频率执行一次,并且为了平滑的功能,也要估计客户端的所有内容。确保服务器完成所有碰撞检测和所有与 UI 无关的机制,否则游戏将容易出现客户端故障或恶意篡改。
如果您确实必须查看玩家可能要去的地方,您可以使用几种方法,您可以在世界上拥有许多虚拟立方体来跟踪其中的内容,这将简化查找前方的内容资源,或者您可以检查所有内容,这在机器上相当繁重,但这也增加了一些其他复杂性。在第一种情况下,一旦遇到障碍物,不要忘记停止寻找。
您还可以计算玩家的方向与其他重要项目之间的角度,以检查他的想法。
关于 UDP 的问题已经得到解答,而且我确信Wikipedia 上有一本关于 UDP 和 TCP 的有用书籍,我没有什么要补充的。
航位推算的解释也中规中矩,我希望我在概念上增加了其他角度。
我希望我有所帮助,如果您需要任何澄清或任何其他帮助,请随时与我联系,如果我没有帮助,请随时投反对票,我学习计算机工程并正在为 PC 创建我的第二个游戏,所以也许我遇到了已经有一些问题,可以分享知识。