EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

[Unity]Mirror联网插件Error: Void SyncVarDemo::SetColor(UnityEngine.Color32) should have signature

旧代码:

using Mirror;
using System.Collections;
using UnityEngine;


public class SyncVarDemo : NetworkBehaviour
{
    [SyncVar(hook =nameof(SetColor))]
    private Color32 _color = Color.red;

    public override void OnStartServer()
    {
        base.OnStartServer();
        StartCoroutine(__RandomizeColor());
    }

    private void SetColor(Color32 color)
    {
        Debug.Log("Setting color locally.");
        SpriteRenderer renderer = GetComponent<SpriteRenderer>();
        renderer.color = color;
    }


    private IEnumerator __RandomizeColor()
    {
        WaitForSeconds wait = new WaitForSeconds(2f);

        while (true)
        {
            yield return wait;

            Debug.Log("Changing color on Serever.");

            _color = Random.ColorHSV(0f,1f,1f,1f,0f,1f,1f,1f);
        }
    }
}

报错信息:

Mirror.Weaver error: System.Void SyncVarDemo::SetColor(UnityEngine.Color32) should have signature:
public void SetColor(UnityEngine.Color32 oldValue, UnityEngine.Color32 newValue) { }

 

原因很简单,Mirror Team 更新了。

 

基础的SetColor用于同步是不允许的:

private void SetColor(Color32 color)
 {
        Debug.Log("Setting color locally.");
        SpriteRenderer renderer = GetComponent<SpriteRenderer>();
        renderer.color = color;

}

按照错误解释,方法签名应当为:

private void SetColor(Color32 oldValue,Color32 newValue)

 

为什么要这样?请参考 https://www.v2know.com/MainPage/PreView/203  中的  

OnPriceChanged(new PriceChangedEventArgs(oldPrice, price));

在股票变动值的时候,有一个旧值和一个新值。

通过比对旧值和新值,检查值是否变动,变动了则触发某个方法。

 

出于安全和性能的考虑,这样的做法是必要的。

 

有一个最直接的解决方案:

    private void SetColor(Color32 oldColor,Color32 newColor)
    {
        Debug.Log("Setting color locally.");
        SpriteRenderer renderer = GetComponent<SpriteRenderer>();
        renderer.color = oldColor;
    }

Or:

    private void SetColor(Color32 oldColor,Color32 newColor)
    {
        Debug.Log("Setting color locally.");
        SpriteRenderer renderer = GetComponent<SpriteRenderer>();
        renderer.color = newColor;
    }

这两个方法几乎是一样的,区别在于renderer.color到底等于oldColor还是newColor。

 

先说结果:

用newColor,当Client连接Server的时候,Client的第一个颜色一定是白色,第二个颜色不是红色而是随机色。

用oldColor,当Client连接Server的时候,Client的第一个颜色一定是白色,第二个颜色一定是红色,从第三个颜色开始随机。

两者作为Host(Server+Client)的时候,与上面的结果是一样的。

 

至于为什么会这个样子?

之前还是单值可行的时候,First Gear Games已经说过了,

当作为Host的时候,并没有立即触发Hook(就是没有立即变红色),是个bug,并且会在后期版本修复。

所以才变成了今天这个样子。

 

参考文档:

[1] https://mirror-networking.com/docs/Guides/Sync/SyncVarHook.html

This article was last edited at 2020-04-13 20:10:51

BLUCE LEE

这个错误我没有遇到哎,难道被修复了?53.0.0版本。。。

reply

2021-11-02 21:08:26

* *