Unity Networking:在Multiplayer中翻转精灵并不会让人失望

时间:2015-12-18 12:37:33

标签: c# unity3d unity-networking

我正在开发一款小型多人2d平台游戏。我已经成功地通过网络复制动画,移动和翻转精灵,但我有一个我无法理解的错误。翻转精灵的代码完全适用于主机 - 他可以看到其他玩家在向左或向右转时切换侧面,但其他人都看不到主机翻转。另外第三个玩家看不到第二个玩家转弯等等。有些东西不对,如果有人可以查看我的代码那就太棒了。

播放器脚本中的代码:

if (input.x > 0 && !facingRight)
     {
         FlipSprite();
         GetComponent<Player_SyncPosition>().FlipSprite();
     }
     else if (input.x < 0 && facingRight)
     {
         FlipSprite();
         GetComponent<Player_SyncPosition>().FlipSprite();
     }

播放器上的其他 Player_SyncPosition 脚本中的代码:

 [ClientCallback]
 public void FlipSprite()
 {  
     if (isLocalPlayer)
     {
         CmdFlip();
     }
 }
 [Command]
 void CmdFlip()
 {
     if (!isLocalPlayer)
     {
         print("Switching sides");
         facingRight = !facingRight;
         Vector3 SpriteScale = GetComponent<Transform>().localScale;
         SpriteScale.x *= -1;
         GetComponent<Transform>().localScale = SpriteScale;
     }
 }

修改

播放器

Player_SyncPosition pSync;
void Awake()
{
    pSync = GetComponent<Player_SyncPosition>();
}

void Update () 
{
if ((input.x > 0 && !pSync.facingRight) || (input.x < 0 && pSync.facingRight))
    {
        pSync.FlipSprite();
    }
}

Player_SyncPosition

[SyncVar(hook = "FaceDirCallback")]
public bool facingRight = true;

[ClientCallback]
public void FlipSprite()
{
    if (isLocalPlayer)
    {
        CmdFlip();
    }
}
[Command]
void CmdFlip()
{
    print("Switching sides");
    facingRight = !facingRight;
    Vector3 SpriteScale = transform.localScale;
    SpriteScale.x *= -1;
    transform.localScale = SpriteScale;
}

void FaceDirCallback(bool newValue)
{
    print(facingRight);
    print(newValue);
    facingRight = newValue;
}

1 个答案:

答案 0 :(得分:2)

我遇到了各种不同的问题(向后移动等),这很有效:

<强>播放器:

re.findall

<强> Player_SyncPosition:

void Awake()
     {
         syncPos = GetComponent<Player_SyncPosition>();
     }

void Update()
 {
  if ((input.x > 0 && !facingRight) || (input.x < 0 && facingRight))
         {
             facingRight = !facingRight;
             syncPos.CmdFlipSprite(facingRight);
         }
 }