Unet同步动画师图层权重Unity 3D

问题描述 投票:1回答:1

我目前正在研究多人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的文档和手册,但是由于我很难理解这些调用之间的区别,因此很难完成这个相对容易的任务。

unity3d synchronization unity3d-unet
1个回答
0
投票

[通常,[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);
}
© www.soinside.com 2019 - 2024. All rights reserved.