Unet 不同步客户端-服务器、服务器-客户端之间的浮点值

Posted

技术标签:

【中文标题】Unet 不同步客户端-服务器、服务器-客户端之间的浮点值【英文标题】:Unet not sync a float value between client-server , server-client 【发布时间】:2019-09-03 14:01:14 【问题描述】:

我尝试在服务器-客户端之间同步浮点值。

在服务器屏幕上有老板 HpBar 脚本在场景中设置了 MAXHP 值。

玩家预制件拥有自己的boss HP UI和localhp脚本,它们将从服务器中的HpBar脚本获取当前boss HP值。

当用户按下攻击按钮时,它会将伤害值发送到 HpBar 脚本,然后它应该更新到播放器预制件。但它不会同步在一起。谢谢

图片在这里 https://imgur.com/a/KrYtC3T

localPlayerHPBAR 脚本:

public class localHpBar : NetworkBehaviour


    public HpBar serverHp;
    public float localhpPoint;
    public Image localhpBar;

    // Start is called before the first frame update
    void Start()
    
        serverHp = GameObject.FindObjectOfType<HpBar>();
        //Get OBJ of serverHP
    

    public void sendDamage(float dmg)
    
        serverHp.TakeDamage(dmg); //SendDamageToserver
    

    // Update is called once per frame
    void Update()
     
        //get HP point from server
        localhpPoint = serverHp.sum;
        localhpBar.fillAmount = localhpPoint;
    

服务器 HpBar

public class HpBar : NetworkBehaviour

    public Image HP;
    public float MaxHP;
    float currentHP;
    public float localhp;
    [SyncVar] public float sum;

    void Start()
     
        //set CURRENT HP
        currentHP = MaxHP;
    

    [ClientRpc]
    void rpcDamage(float dmg)
           
        sum = currentHP / MaxHP;
        HP.fillAmount = sum;
    

    public void TakeDamage(float dmg)
    

        //recieve DamageFrom client
        currentHP = currentHP - dmg;
        rpcDamage(currentHP);
    

【问题讨论】:

【参考方案1】:

注意[SyncVar] 只是同步服务器 &rightarrow;客户。

从不在另一个方向。在客户端更改此值不会影响服务器或其他客户端。

您正在使用[ClientRpc] 更改sum[ClientRpc]服务器 调用,但在所有客户端上执行。你甚至不能作为客户调用它。


您应该做的是将TakeDamage 方法设置为[Command],以便客户端调用它,但只在 服务器 上执行,然后您可以在其中更改同步值,例如

// This is called by clients but executed on the server
[Command]
public void CmdTakeDamage(float dmg)

    currentHP -= dmg;

    sum = currentHP / MaxHP;

    // actually pass on the new sum
    rpcDamage(sum);


// This is called ONLY by the server but executed on all clients
[ClientRpc]
// also make sure the prefix is capital Rpc otherwise it might not work
void RpcDamage(float newSum)

    // if you set sum here then you should simply remove the 
    // [SyncVar] since you already sync it "manually"
    // I would actually do this since it is not guaranteed that the syncvar
    // transfers its new value before this method is executed
    // on the other hand syncvar is additionally synchronized when connecting a new client
    // so you might have to do it "manually"
    sum = newSum;
    HP.fillAmount = sum;

【讨论】:

谢谢。当我在主机上按下攻击 btn 时,代码工作和值同步。但在客户端它不会更新值。谢谢

以上是关于Unet 不同步客户端-服务器、服务器-客户端之间的浮点值的主要内容,如果未能解决你的问题,请参考以下文章

Unity 5 - UNET - 将拖动的游戏对象同步为客户端(HL2 重力枪风格)

unity的PUN如何同步自定义脚本

Next.js 和 Styled Components 在刷新时服务器和客户端之间不同步

在服务器和客户端之间同步计时器 - 节点js / android / socket io

Unity UNET - 在播放器对象之外调用 [Command]

在服务器和多个客户端之间同步数据库更改