实例化的预制比例尺未在客户端上正确显示

时间:2018-08-13 20:54:06

标签: c# unity3d unity3d-unet

我有一个爆炸的动画预制件。当用户单击UI按钮时,将实例化预制件。当在客户端或主机上单击该按钮时,预制将设置为Vector3(0.1,0.1,1)的本地比例,并在主机上正确显示,但在客户端上为原始比例。

我有一个文本框,显示客户端和主机上的比例,它们匹配,但是预制件的显示在主机(正确显示)和客户端(错误显示)上不同。再次,客户端用户可以单击按钮,或者主机可以单击按钮,在两种情况下,主机上的显示都是正确的,但客户端上的显示是正确的。

有人猜测为什么我无法正确显示客户端。似乎在客户端上可以使用本地比例0.1,0.1,1,因为我可以在文本框中显示它,但是预制件显示得更大。

这是实例化代码。让我知道其他有助于诊断的信息。

go = Instantiate(shockwave, this.transform, false);
NetworkServer.Spawn(go);

更新

这是我根据Lotan的评论更新的代码。请注意,我先调用createshockwave,然后再调用Cmdcreateshockwave,因为我无法从UI按钮调用Command。

public void createshockwave()
{
    if(!isLocalPlayer)
    { return; }

    Cmdcreateshockwave();
}

[Command]
public void Cmdcreateshockwave()
{

    //note that this line parents shockwave. The updated instantiation code below does not parent shockwave.
    //go = Instantiate(shockwave, this.transform, false);

    GameObject go = Instantiate(shockwave, this.transform.position, Quaternion.identity) as GameObject;

    NetworkServer.Spawn(go);

    go.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
...
}

现在,实例化预制件的大小在客户端和主机上都是相同的原始比例。将区域设置比例更改为其他大小没有任何效果。

更新 问题似乎与预制件上的动画师有关。我删除了动画器,该动画器可以缩放预制件,并且缩放器现在与客户端和主机上的父代匹配。看起来我将不得不在更新函数中手动增加局部比例,而不是使用动画器。

2 个答案:

答案 0 :(得分:3)

  • NetworkServer.Spawn应该从[Command]函数
  • 调用

赞:

[Command]
private void CmdSpawnStuff()
{
    GameObject instance = Instantiate(prefab, 
                                      coords, 
                                      Quaternion.identity) as GameObject;
    NetworkServer.Spawn(instance);
}
  • NetworkServer.Spawn,生成游戏对象的默认副本,因此,如果您在此处更改任何属性,将不会发送给客户端,因此请在生成后进行更改并进行同步。

希望有帮助!

答案 1 :(得分:0)

确保两个父对象的比例都匹配,以确保它们具有相同的局部比例