c# - 实例化的预制比例在客户端上显示不正确

标签 c# unity3d unity3d-unet

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

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

关于为什么我不能让客户端正确显示的任何猜测。看起来 localscale 0.1,0.1,1 在客户端可用,因为我可以在文本框中显示它,但预制件显示得更大。

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

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

更新

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

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);
...
}

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

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

最佳答案

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

像这样:

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

希望对您有所帮助!

关于c# - 实例化的预制比例在客户端上显示不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51830401/

相关文章:

c# - 如何使用 OracleDataReader 检索给定记录的所有字段?

c# - 将字符串解析为 Unity3D 中的代码 (C#)

c# - "this"这个词是什么意思, "static"是什么意思?

python-3.x - 属性错误 : dataset object has no attribute 'c' FastAI

c# - Docusign 指定的集成商 key 未找到或已禁用

c# - aspx 页面的内容敏感标题

android - 如何让 google play 将 unity 游戏标记为专为平板电脑设计?

c# - 通过网络实例化游戏对象

c# - 限制可以使用打开文件对话框选择的文件