簡體   English   中英

Unity 中的多人游戲

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM