如果没有终点,你将如何估计玩家(服务器端)的行动方向?
一种方法是在客户端进行此计算,然后将新位置发送到服务器。然后更新所有其他人在屏幕上看到的内容。
我认为更好的另一种方法是在服务器端进行所有这些计算,只需接收更新您所在位置的信息即可。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);
}
让我们看看...我明白你知道如何编码,但不知道是什么,对吗?
您可以直接将按键输入发送到服务器,让它完成所有工作。服务器不需要知道您要去哪里,它有您的坐标和方向就足够了,除非您有由服务器处理的人工智能。在后一种情况下,您可以类似于Unity中的射线投射,开始检查前方是否有任何感兴趣的东西,如果有,那么您就知道了潜在的目的地。
将所有数据不断发送回客户端是安全的,因此始终保持最新状态。如果您认为这会影响连接,则可以每50毫秒或您认为安全的频率执行此操作,并在客户端上估计所有平滑功能。确保服务器执行所有与UI无关的碰撞检测和机制,否则游戏将容易出现客户端故障或恶意篡改。
如果你需要查看玩家可能去哪里,可以使用一些方法。你可以在世界中设置虚拟立方体的数量,以跟踪其中的内容,这将简化查找资源前方的内容;或者你可以检查所有的物品,但对机器负荷较重,也增加了其他复杂性。在第一种情况下,请不要忘记在遇到障碍时停止查找。
你还可以计算玩家朝向与其他重要物品之间的角度,以检查他是否注意到其他事物。
关于UDP的问题已经有了答案,此外我相信维基百科有一本有关UDP和TCP的有用书籍,我没有什么可补充的。
关于死推算法的解释也相当令人满意,我希望能为此概念增加一些其他角度。
希望我的回答能有所帮助。如果您需要澄清或其他任何帮助,请随时联系我。如果我的回答不够有用,请自由地进行负投票。我学习计算机工程,正在为PC创建我的第二个游戏,所以也许我已经遇到过某些问题,并且可以分享知识。
;-)
。此外,提供支持你观点的文档链接或摘录可以避免被踩。) - Patrick M