Unity 中的多人游戏
Multiplayer in Unity
下面是玩家对象移动的代码,它工作得很好。但是在 TellClientsToMoveClientRpc
中,我们为什么要做 transform.position
因为它指的是当前 游戏对象 但不是每个对象都移动,只有调用上述 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
脚本的游戏对象存在于每个客户端上。
当您从客户端调用 TellServerToMoveClientServerRpc
时,它将在客户端从 调用函数的 相同游戏对象上执行该函数,但在服务器上。这是因为你添加了一个[ServerRPC]
.
现在服务器可以控制接下来要发生的事情,它调用 TellClientsToMoveClientRpc
。现在这一次,由于您添加了一个 [ClientRpc]
,该函数将在 相同的游戏对象上调用,原始客户端从 调用该函数,但现在在连接的每个客户端上到您的服务器。
因为调用函数的总是同一个游戏对象(只是在不同的游戏实例上,运行 在不同的计算机上),并不是所有的游戏对象都会移动:只有最初调用 TellServerToMoveClientServerRpc
函数。
下面是玩家对象移动的代码,它工作得很好。但是在 TellClientsToMoveClientRpc
中,我们为什么要做 transform.position
因为它指的是当前 游戏对象 但不是每个对象都移动,只有调用上述 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
脚本的游戏对象存在于每个客户端上。
当您从客户端调用 TellServerToMoveClientServerRpc
时,它将在客户端从 调用函数的 相同游戏对象上执行该函数,但在服务器上。这是因为你添加了一个[ServerRPC]
.
现在服务器可以控制接下来要发生的事情,它调用 TellClientsToMoveClientRpc
。现在这一次,由于您添加了一个 [ClientRpc]
,该函数将在 相同的游戏对象上调用,原始客户端从 调用该函数,但现在在连接的每个客户端上到您的服务器。
因为调用函数的总是同一个游戏对象(只是在不同的游戏实例上,运行 在不同的计算机上),并不是所有的游戏对象都会移动:只有最初调用 TellServerToMoveClientServerRpc
函数。