在Unity上通过RPC设置Scale

时间:2014-03-21 16:50:49

标签: networking unity3d client rpc

我很难让我的健康栏使用RPC通过Unity上的服务器进行同步。在我的游戏中,角色的头部有健康栏,应该为整个服务器更新。这样你就可以看看另一个玩家并看到他们的健康吧。问题在于,即使我通过网络发送信息并收到信息,实际的物理条也不会发生规模变化。发送电话的玩家虽然改变了他们的栏。

以下是该问题的屏幕截图:http://i.imgur.com/g2GozZv.png

当我发送RPC时,它会改变其他玩家的健康值,但对比例无效。

我做了以下代码但它没有工作:

void Start()
{
    if(!networkView.isMine)
    {
        enabled = false;
    }
}

void Update ()
{
    if(Input.GetKey(KeyCode.Alpha2))
    {
         Minus_Health();
    }
}

public void Minus_Health()
{
    health -= 10;
    healthBarLength = (float)health / (float)maxHealth / 5.1f;
    healthBar.scale = new Vector2(healthBarLength, healthBar.scale.y);
    Update_HP(health, maxHealth, healthBar.scale);
}

public void Update_HP(int hp, int maxHP, Vector3 bar)
{
    networkView.RPC("Update_Health",RPCMode.All, hp, maxHP, bar);
}


[RPC]
public void Update_Health(int value, int value2, Vector3 bar)
{
    health = value;
    maxHealth = value2;
    healthBar.scale = new Vector2(bar.x, bar.y);
}

我也试过这个,没有运气:

void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
{
    if (stream.isWriting)
    {
        Vector3 networkHealth = healthBar.scale;
        stream.Serialize(ref networkHealth);
    }
    else
    {
        Vector3 networkHealth = Vector3.zero;
        stream.Serialize(ref networkHealth);
        healthBar.scale = networkHealth;
    }
}

2 个答案:

答案 0 :(得分:1)

我发现了问题。代码本身工作得很好(而且你是正确的,那个条形参数只是单调乏味)。

问题实际上是我用于健康栏的ex2D插件。在每个exSprite上都有一个摄像机视图,设置为用户的主摄像头。因为它是在播放器实例化时设置为我的相机,所以它只通过我的相机看到我的酒吧,因此不会通过客户端/服务器端更新其他栏。通过单击纹理并将ex2D exSprite的相机设置为无,我现在可以看到两个条都正在更新/缩放。

希望这可以帮助任何人寻找如何通过网络健康酒吧,这是我使用的最终代码:

using UnityEngine;
using System.Collections;

public class PlayerStats : MonoBehaviour
{
    public int health;
    public int maxHealth;
    public float healthBarLength = 0;
    public exSprite healthBar;

    void Start()
    {
        if(!networkView.isMine)
        {
            enabled = false;
        }
    }

    void Update ()
    {
        if(Input.GetKey(KeyCode.Alpha2))
        {
            Minus_Health();
            Update_HP(health, maxHealth);
        }
    }

    public void Minus_Health()
    {
        health -= 10;
    }

    public void Update_HP(int hp, int maxHP)
    {
        networkView.RPC("Update_Health", RPCMode.AllBuffered, hp, maxHP);
    }


    [RPC]
    public void Update_Health(int value, int value2)
    {
        health = value;
        maxHealth = value2;

        healthBarLength = (float)value / (float)value2 / 5.1f;
        healthBar.scale = new Vector2(healthBarLength, healthBar.scale.y);
    }
}

此外,为将exSprite Camera设置为None时出错的人提供了一个小技巧;您需要更新ex2D插件。

感谢帮助pek,我希望这可以帮助别人! :)

答案 1 :(得分:0)

如果更新运行状况中的所有参数都正确,则可能还有其他因素影响比例。

此外,如果正确发送 value2 ,则不需要 bar 参数:

[RPC]
public void Update_Health(int value, int value2)
{
    health = value;
    maxHealth = value2;

    healthBarLength = (float)health / (float)maxHealth / 5.1f;
    healthBar.scale = new Vector2(healthBarLength, healthBar.scale.y);
}