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

Posted

技术标签:

【中文标题】实例化的预制比例在客户端上未正确显示【英文标题】:Instantiated prefab scale is not displayed correctly on client 【发布时间】:2019-01-20 15:50:53 【问题描述】:

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

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

关于为什么我不能让客户端正确显示的任何猜测。客户端上似乎可以使用 0.1,0.1,1 的本地比例,因为我可以在文本框中显示它,但预制件显示得更大。

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

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

更新

这是我根据 Lotan 的 cmets 更新的代码。请注意,我首先调用 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);
...

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

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

【问题讨论】:

客户端是01还是0.1? 01 比 0.1 大 10 倍!! as I can show it in a text box, but the prefab is displayed much larger 的含义是什么?它是否大于文本框中指示的值?您的代码似乎存在严重问题 谢谢比扬。它的 0.1。文本框显示主机和客户端的本地比例 0.1,0.1,1。然而,预制件以该比例显示在主机上,而不是客户端上。它在客户端上以原始比例显示,更大。 你的相机在同一个位置吗? 感谢 derHugo。我将摄像机移到了船下,以确保距离相同,并且正在发生相同的事情。爆炸规模没有任何变化。 如果您将本地比例更改为不同的数字.. 比如说 0.5,两个版本的大小都会增加吗?还是客户端版本和现在一样大? 【参考方案1】: NetworkServer.Spawn 应该从 [Command] 函数调用

像这样:

[Command]
private void CmdSpawnStuff()

    GameObject instance = Instantiate(prefab, 
                                      coords, 
                                      Quaternion.identity) as GameObject;
    NetworkServer.Spawn(instance);

NetworkServer.Spawn,生成游戏对象的默认副本,因此如果您在此处更改任何属性,将不会发送到客户端,因此请在生成后进行更改并同步。

希望对你有帮助!

【讨论】:

这是有道理的。我会试一试,让你知道。谢谢。 我在 Lotan 上面的原始问题中添加了更新。【参考方案2】:

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

【讨论】:

注释写在 cmets box 中 它们在外观上具有相同的比例,但我会检查以确保它们确实应用了相同的比例。 是的,实际父级比例必须设置为相同,因为您将其设置为本地比例的 0.1,因此它将是父级比例的 0.1。所以父母双方必须平等才能使 .01 相等。让我知道你发现了什么。另外...如果您完全使用预制件,请确保父母的规模在运行时没有改变。我有几个像这样的规模问题,主要是因为父尺寸错误,但似乎它通常只发生在实例化的预制件上。 在旁注中,我很好奇你说你调整了你的相机位置,但你检查过它们是否设置相同?(Ortho/perspective)这也给我带来了一些维度相关问题。容易忽视但容易修复。

以上是关于实例化的预制比例在客户端上未正确显示的主要内容,如果未能解决你的问题,请参考以下文章

Unity2D:在订单中禁用实例化的预制件

Unity UI 缩放和实例化预制件

当我第二次实例化预制件时,为啥会出现错误?

base_uri 不是基于 guzzle 客户端实例化的

在未实例化的视图控制器上设置徽章值的正确方法?

Unity:使用动画师实例化预制件