让我们从航位推算开始。试着在没有左右移动的直线上思考它。
您在 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);
}
所以在这个例子中,我们将速度设置为一个常数。因此,当向一个方向移动时,我们将以恒定的速度在该向量中移动,而无需关心点 B 的位置。
跳跃速度是我们在 y 轴上沿正方向移动的速度以及在负方向上停止在点 0 处的重力。
那么,你怎么能用这个呢?您可以构建一个执行移动操作的服务器脚本,并拥有一个将方向信息传递给服务器的客户端控制器。
假设在客户端操作是按键按下,您向服务器发送调用以将您移动到方向选择中,服务器将让您继续朝该方向移动,直到操作按键按下或更改来自另一个输入的方向。
我希望这会有所帮助。