[英]Multiplayer in Unity
下面是播放器 object 的移动代码,它运行良好。 但是在TellClientsToMoveClientRpc
中我们为什么要进行transform.position
因为它指的是当前的游戏对象,而不是每个object移动,只有调用上述 Rpc 移动的那个才是可取的。 但是为什么所有其他游戏对象都不动呢?
using UnityEngine;
namespace HelloWorld
{
public class HelloWorldPlayer : NetworkBehaviour
{
private const float speed = 20f;
private void Update()
{
if (!IsOwner)
return;
PlayerMove();
}
void PlayerMove()
{
Vector3 velocity = new(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical"));
if(velocity.sqrMagnitude >= 1)
{
TellServerToMoveClientServerRpc(velocity, NetworkManager.Singleton.LocalClientId);
}
}
[ServerRpc]
void TellServerToMoveClientServerRpc(Vector3 velocity, ulong clientId)
{
TellClientsToMoveClientRpc(velocity, clientId);
}
[ClientRpc]
void TellClientsToMoveClientRpc(Vector3 velocity, ulong clientId)
{
transform.position += speed * Time.deltaTime * velocity;
}
}
}```
像这样的多人游戏意味着有多个客户端运行相同的程序(游戏),这意味着每个客户端的游戏实例上都有所有相同游戏对象的副本。
这意味着您附加HelloWorldPlayer
脚本的游戏 object 存在于每个客户端上。
当您从客户端调用TellServerToMoveClientServerRpc
时,它将在同一个游戏 object 上执行 function 客户端从服务器调用 function ,但这是因为您添加了[ServerRPC]
。
现在服务器已经控制了接下来会发生什么,它调用TellClientsToMoveClientRpc
。 现在这一次,由于您添加了[ClientRpc]
,因此 function 将在同一个游戏 object 上调用,原来的客户端称为 function 从您的服务器连接到的每个客户端,但是现在。
由于它始终是同一个游戏 object 调用 function (只是在不同的游戏实例上,在不同的计算机上运行),并非所有游戏对象都会移动:只有最初调用TellServerToMoveClientServerRpc
ZC1C42542068E6AB5394D11 的游戏对象会移动
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.