我们发现一个新的问题:
Server发生的事情并没有正确的反映在客户端上。
很正常,因为我们还没做同步。
操作步骤:
1.Create Empty,命名为CommandSprite。
2.Add Component,增加Sprite Renderer组件。
3.将Sprite的填充内容设置为InputFieldBackground。(这里不是硬性要求)
4.Add Component,增加Network Identity组件。
5.给CommandSprite增加脚本CommandDemo.cs。
关于脚本:
1.using Mirror
2.类继承NetworkBehaviour
3.清除基本的Start和Update方法
Coding部分:
1.第一个方法OnStartLocalPlayer(),重写它,它将自动补全。
2.这是一个非常重要的方法,它只有在Client有权限的情况下才会运行。
3.接着我们写一个基本的修改SpriteRenderer颜色的方法。(写这个是为了便于观察信息同步)
4.然后我们自定义一个枚举器,并且设定它1s变化一次。
5.注意[Command],凡是在前面写了[Command]的方法,都将会在Server执行。
6.好了,到这里为止,应该明白这个是在Client执行的,向Server发出指令的脚本。
7.最后,我们方法传给StartCoroutine(),这是OnStartLocalPlayer()里面的第二行代码。
完整代码示例:
using System.Collections;
using UnityEngine;
using Mirror;public class CommandDemo : NetworkBehaviour
{
public override void OnStartLocalPlayer()
{
base.OnStartLocalPlayer();
StartCoroutine(__RandomizeColor());
}private void SetColor(Color32 color)
{
SpriteRenderer renderer = GetComponent<SpriteRenderer>();
renderer.color = color;
}private IEnumerator __RandomizeColor()
{
WaitForSeconds wait = new WaitForSeconds(1f);while (true)
{
CmdChangeColor();
yield return wait;
}
}[Command]
private void CmdChangeColor()
{
Debug.Log("CmdChangeColor called");Color color = Random.ColorHSV(0f,1f,1f,1f,0f,1f,1f,1f);
SetColor(color);
}
}
注意:以[Command]特性为首的方法,最好以Cmd开头,之后方法名称随便怎么写。
好的,搞完这些之后,我们把CommandSprite存为Prefab,
然后再放进Network Manager的Player Prefab里面。
让Build的出来的文件Run as Server Only,
在引擎中Play,使用Client,
最终结果:
这个时候,可以发现,只有Server的颜色在变。
这就是一个由Client发起的对Server的同步。(单向)