死亡清算-客户端/服务器游戏-如何处理击键



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

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

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

您处于点A,并希望到达点B。你知道到点B的距离,所以你可以计算到那里需要多少加速度速度。死亡清算是另一种方式。您处于点A,并将以设定的速度移动以接近点B

在电子游戏世界里,他们一直使用这种方法。所以,当你移动到点B时,不要去想它,你只是在以增量移动到点B,因为在FPS中,你的点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中做一些类似于光线投射的事情,开始检查正前方的东西,看看是否有什么感兴趣的东西,如果有,你就知道潜在的目的地。

不断地将他的所有数据发送回客户端是安全的,因此它总是最新的。如果你认为这会使你的连接紧张,你可以每50ms或你认为安全的频率进行一次,为了平稳运行,也可以在客户端估计一切。确保服务器完成了所有与UI无关的冲突检测和所有机制,否则游戏将容易出现客户端故障或恶意篡改。

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

你也可以计算球员的方向和其他重要项目之间的角度,以检查他可能在想什么。

关于UDP的问题已经得到了回答,而且我相信维基百科上有一本关于UDP和TCP的有用的书,我没有什么要补充的。

航位推算的解释也很令人满意,我希望我能为这个概念添加其他角度。

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

最新更新