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函数。