旧代码:
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
Today's comments have reached the limit. If you want to comment, please wait until tomorrow (UTC-Time).
There is 18h40m48s left until you can comment.