Unity Mirror学习(一) SyncVars特性使用

官网中所说的网络对象,指的是挂了 NetworkIdentity组件的对象
官网中所说的玩家对象,指的是NetworkManager脚本上的PlayerPrefab预制体
这个概念对阅读官网文档很重要,我刚开始并不理解,走了歪路

SyncVars(同步变量)特性

1,顾名思义,只是同步变量
2,SyncVars 是从NetworkBehaviour继承的类的属性
3,从服务端同步到客户端我的理解:服务端广播消息,消息=自定义的变量
4,类继承

示例:实现服务端点击按钮,客户端做出相应事件(图片颜色变红)

Unity Mirror学习(一) SyncVars特性使用_第1张图片
代码部分

using Mirror;
using UnityEngine;
using UnityEngine.UI;

public class SyncVarChangeColor : NetworkBehaviour
{
    public Image image;
    public Toggle toggle;
    
    [SyncVar]
    bool _isOn;
    void Start()
    {
        if (isServer)//如果是服务端
        {
            image.gameObject.SetActive(false);
            toggle.gameObject.SetActive(true);
        }
        else
        {
            image.gameObject.SetActive(true);
            toggle.gameObject.SetActive(false);
        }

        toggle.onValueChanged.AddListener((isOn) =>
        {
            _isOn = isOn;
        });
    }

    private void Update()
    {
        if (_isOn)
        {
            image.color = Color.red;
        }
        else
        {
            image.color = Color.white;
        }
    }
}

思考:在写下这段代码时,颜色改变我放在了点击事件里,客户端没反应。我在客户端打印了同步变量_isOn的值,值是发生改变的。

SyncVar hook 钩子特性

1,钩子(hook)可以指定当同步变量(SyncVar)在客户端上更改时,要调用的函数
2,钩子(hook)方法必须具有 两个 与 自定义的同步变量(SyncVar) 相同类型的参数
3,钩子(hook)可以是虚拟方法,并在派生类中重写
4,钩子(hook)调用顺序与脚本中定义SyncVar的顺序相同

对上述代码进行修改

using Mirror;
using UnityEngine;
using UnityEngine.UI;

public class SyncVarChangeColor : NetworkBehaviour
{
    public Image image;
    public Toggle toggle;

    [SyncVar(hook = nameof(ChangeColor))]
    bool _isOn;
    void Start()
    {
        if (isServer)
        {
            image.gameObject.SetActive(false);
            toggle.gameObject.SetActive(true);
        }
        else
        {
            image.gameObject.SetActive(true);
            toggle.gameObject.SetActive(false);
        }

        toggle.onValueChanged.AddListener((isOn) =>
        {
            _isOn = isOn;
        });
    }

    void ChangeColor(bool oldOn, bool newOn)//钩子(hook)方法 必须 要有两个参数
    {
        if (_isOn)
            image.color = Color.red;
        else
            image.color = Color.white;
    }
}

你可能感兴趣的:(Unity相关技术学习,unity,游戏引擎,网络,游戏)