我目前正在研究多人fps,以学习UNET和Unity。在这个项目中,我正在使用Network Animator Component来同步我的动画。我有一层运行正常状态,如步行和跳跃,另一层仅控制上身进行范围设定。作用域时,此层将被激活。
该参数可以同步,但图层权重不可以。控制图层权重的脚本在远程播放器上被禁用,因为它是负责拍摄的同一脚本的一部分,我们不想从远程播放器进行拍摄。因此,我将该代码放在了另一个脚本上,并使Layerweight成为Syncvar,仍然没有结果。
这是设置权重并将其淡出的片段。
if (isScoped)
{
animator.SetLayerWeight(1, 1);
layerWeight = 1;
}
else
{
layerWeight = Mathf.Lerp(layerWeight, 0, 0.1f);
animator.SetLayerWeight(1, layerWeight);
}
animator.SetBool("Scoped", isScoped);
如何同步在禁用脚本上更新的变量?为了使此功能正常工作,应使用哪些不同的自定义属性,例如[Command]和[ClientRpc]?我已经阅读了UNET的文档和手册,但是由于我很难理解这些调用之间的区别,因此很难完成这个相对容易的任务。
[通常,[SyncVar]
的主要问题是
已同步从服务器到客户端
所以不是反过来!
然后
[SyncVar]
是被任何客户端调用但仅在在服务器上执行
[Command]
与之相反,它是由服务器调用,然后在所有客户端
所以我要做的是为layerweight提供setter方法,如
[Command]
并且这样称呼
[ClientRpc]
尽管请注意,在服务器和客户端之间来回传递会导致一些不可思议的延迟!
您可能最好同步[ClientRpc]
bool并直接在调用客户端上分配值:
private void SetLayerWeight(float value)
{
// only player with authority may do so
if(!isLocalPlayer) return;
// Tell the server to update the value
CmdSetLayerWeight(value);
}
[Command]
private void CmdSetLayerWeight(float value)
{
// Server may now tell it to all clients
RpcSetLayerWeight(value);
}
[ClientRpc]
private void RpcSetLayerWeight(float value)
{
// called on all clients including server
layerweight = value;
animator.SetLayerWeight(1, layerweight);
}