代码之家  ›  专栏  ›  技术社区  ›  Siddharth

玩家重生逻辑统一多人游戏

  •  0
  • Siddharth  · 技术社区  · 6 年前

    我通过Unity多人游戏系统学习多人游戏的实现。 所以我遇到了为初学者编写的非常好的教程: Introduction to a Simple Multiplayer Example

    从本教程中,我无法理解此页面内容: Death and Respawning

    通过这段代码,在教程中,他们谈论的是我们的玩家将重新出现(玩家将在0位置转换,健康状态将为100),玩家可以重新开始战斗。

    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.Networking;
    using System.Collections;
    
    public class Health : NetworkBehaviour {
    
    public const int maxHealth = 100;
    
    [SyncVar(hook = "OnChangeHealth")]
    public int currentHealth = maxHealth;
    
    public RectTransform healthBar;
    
    public void TakeDamage(int amount)
    {
        if (!isServer)
            return;
    
        currentHealth -= amount;
        if (currentHealth <= 0)
        {
            currentHealth = maxHealth;
    
            // called on the Server, but invoked on the Clients
            RpcRespawn();
        }
    }
    
    void OnChangeHealth (int currentHealth )
    {
        healthBar.sizeDelta = new Vector2(currentHealth , healthBar.sizeDelta.y);
    }
    
    [ClientRpc]
    void RpcRespawn()
    {
        if (isLocalPlayer)
        {
            // move back to zero location
            transform.position = Vector3.zero;
        }
    }
    }
    

    根据我的想法,所有客户端都在执行clientrpc,因此本地玩家的所有设备都将移动到产卵位置,健康状况将得到满足。 根据本教程->只有自己的玩家的繁殖位置和健康得到更新。

    为什么会发生我无法理解的事情? 实际上,在所有客户机上调用rpc,那么所有客户机都应该要求在开始位置移动并获得完整的运行状况。 请给我一些解释。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Lotan    6 年前

    正如您在这张图片上看到的,您需要认为网络系统不是一个“共享”的房间,它们实际上是在您自己的房间中复制其他房间的所有信息。 知道了这一点,现在您可以理解,如果您从播放器1发送RPC,该RPC将在您的播放器1上执行,而播放器1-副本将在播放器的2个房间上执行。

    类以允许从服务器在客户机上调用它们。

    因此,由于玩家1房间是主机(服务器+客户机),玩家2是客户机,它将在2房间执行,但在第一个房间进行评估。

    在你自己的房间里。 enter image description here

    是可以放在networkbehavior方法上的属性

    编辑:这意味着,当玩家1死亡时,它将调用rpc函数,并且(因为它是一个rpc)房间2上的他的副本(player1 copy)也会这样做。