首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >统一网络:在多人游戏中翻转精灵不会翻转主机

统一网络:在多人游戏中翻转精灵不会翻转主机
EN

Stack Overflow用户
提问于 2015-12-18 12:37:33
回答 2查看 1.6K关注 0票数 2

我在做一个小型的多人2d平台游戏。我设法让它在网络上复制动画,移动和翻转精灵,但我有一个错误,我不能让我的头。翻转精灵的代码非常适合主播--他可以看到其他玩家在左转或右转时换位,但其他人都看不到主机翻转。另外,第三位玩家看不到第二位玩家的转弯等等。有些地方不对劲,如果有人能看一下我的代码,那就太好了。

播放器脚本中的代码:

代码语言:javascript
复制
if (input.x > 0 && !facingRight)
     {
         FlipSprite();
         GetComponent<Player_SyncPosition>().FlipSprite();
     }
     else if (input.x < 0 && facingRight)
     {
         FlipSprite();
         GetComponent<Player_SyncPosition>().FlipSprite();
     }

在播放机上的另一个Player_SyncPosition脚本中编写代码:

代码语言:javascript
复制
 [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;
     }
 }

编辑:

播放器

代码语言:javascript
复制
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

代码语言:javascript
复制
[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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-04 16:27:03

我经历了各种各样的问题(向后移动等等)。这是可行的:

播放器:

代码语言:javascript
复制
void Awake()
     {
         syncPos = GetComponent<Player_SyncPosition>();
     }

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

Player_SyncPosition:

代码语言:javascript
复制
 [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;
         }
     }
票数 2
EN

Stack Overflow用户

发布于 2022-05-23 17:08:19

上面的代码很有魅力,但我认为它可以更简洁。

代码语言:javascript
复制
[SyncVar(hook = "FacingCallback")]
public bool m_FacingRight = true;
[Command]
public void CmdFlipSprite(bool facing)
{
    m_FacingRight = !m_FacingRight;
}

void FacingCallback(bool _Old, bool _New)
{
    Vector3 SpriteScale = transform.localScale;
    SpriteScale.x = m_FacingRight ? 1 : -1;
    transform.localScale = SpriteScale;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34355894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档