我很难让我的健康栏使用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;
}
}
答案 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);
}