【问题标题】:Unity Networking: Flipping sprites in Multiplayer doesn't flip hostUnity Networking:在多人游戏中翻转精灵不会翻转主机
【发布时间】:2016-01-05 00:27:03
【问题描述】:

我正在开发一款小型多人 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;
}

【问题讨论】:

  • 不要使用 GetComponent。初始化对象时(例如在 Start() 或 Awake() 中,在此处使用 getcomponent,并将其保留为局部变量。每次都获取变换是没有意义的。另外,您可以使用 this.transform 。
  • Player_SyncPosition是第二个代码块吗?
  • 完成了,但这是优化,对吧?仍然没有解决我的问题。 @user3071284 是的

标签: c# unity3d unity-networking


【解决方案1】:

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

玩家:

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

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

Player_SyncPosition:

 [SyncVar(hook = "FacingCallback")]
     public bool netFacingRight = true;

 [Command]
     public void CmdFlipSprite(bool facing)
     {
         netFacingRight = facing;
         if (netFacingRight)
         {
             Vector3 SpriteScale = transform.localScale;
             SpriteScale.x = 1;
             transform.localScale = SpriteScale;
         }
         else
         {
             Vector3 SpriteScale = transform.localScale;
             SpriteScale.x = -1;
             transform.localScale = SpriteScale;
         }
     }

     void FacingCallback(bool facing)
     {
         netFacingRight = facing;
         if (netFacingRight)
         {
             Vector3 SpriteScale = transform.localScale;
             SpriteScale.x = 1;
             transform.localScale = SpriteScale;
         }
         else
         {
             Vector3 SpriteScale = transform.localScale;
             SpriteScale.x = -1;
             transform.localScale = SpriteScale;
         }
     }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    相关资源
    最近更新 更多