[Unity Mirror] SyncVars

英文原文:

https://mirror-networking.gitbook.io/docs/guides/synchronization/syncvars

  SyncVars 是从 NetworkBehaviour 继承的类的属性,它们从服务器同步到客户端。当生成游戏对象或新玩家加入正在进行的游戏时,将向他们发送对他们可见的联网对象上所有 SyncVar 的最新状态。使用 SyncVar 自定义属性指定要同步脚本中的哪些变量。

  SyncVars 的状态在调用 OnStartClient() 之前应用于客户端上的游戏对象,因此对象的状态在 OnStartClient() 中始终是最新的。

  SyncVars 可以使用 Mirror 支持的任何类型。在单个 NetworkBehaviour 脚本中最多可以有 64 个 SyncVar,包括 SyncList(请参阅下面的下一节)。

  当 SyncVar 的值发生更改时,服务器会自动发送 SyncVar 更新,因此您无需跟踪它们何时更改或自己发送有关更改的信息。在 inspector 中更改值不会触发更新。

SyncVar 挂钩属性可用于指定当客户端上的 SyncVar 更改值时要调用的方法。


SyncVar 示例

  假设我们有一个带有名为 Enemy 的脚本的网络对象:

public class Enemy : NetworkBehaviour
{
    [SyncVar]
    public int health = 100;

    void OnMouseUp()
    {
        NetworkIdentity ni = NetworkClient.connection.identity;
        PlayerController pc = ni.GetComponent<PlayerController>();
        pc.currentTarget = gameObject;
    }
}

PlayerController 可能如下所示:

public class PlayerController : NetworkBehaviour
{
    public GameObject currentTarget;

    void Update()
    {
        if (isLocalPlayer)
            if (currentTarget != null &&currentTarget.tag == "Enemy")
                if (Input.GetKeyDown(KeyCode.X))
                    CmdShoot(currentTarget);
    }

    [Command]
    public void CmdShoot(GameObject enemy)
    {
        // Do your own shot validation here because this runs on the server
        enemy.GetComponent<Enemy>().health -= 5;
    }
}

  在这个例子中,当玩家点击一个敌人时,联网的敌人游戏对象被分配给 PlayerController.currentTarget。当玩家按下 X 并选择正确的目标时,该目标将通过在服务器上运行的命令传递,以减少生命值 SyncVar。所有客户端都将使用该新值进行更新。然后,您可以在敌人上使用 UI 来显示当前值。


类继承

SyncVars 使用类继承。考虑这个例子:

class Pet : NetworkBehaviour
{
    [SyncVar] 
    string name;
}

class Cat : Pet
{
    [SyncVar]
    public Color32 color;
}

  您可以将 Cat 组件附加到您的 cat 预制件上,它会同步它的名称和颜色。

警告 Cat 和 Pet 应该在同一个组件中。如果它们在单独的程序集中,请确保不要直接从 Cat 内部更改名称,而是向 Pet 添加一个方法。

你可能感兴趣的:(Mirror,Unity,unity,Mirror,网络)