【问题标题】:GameObject Rotation does not happen on Client SideGameObject Rotation 不会在客户端发生
【发布时间】:2016-04-11 17:26:30
【问题描述】:

翻转一个 2d 游戏对象并将其放置在完全相同的位置上,这对双方都很好。 旋转 2d 游戏对象在两边都很好用

但是,如果我通过执行 Cmd_DoTheSpawn 翻转游戏对象,则旋转不会反映在“其他”客户端上。

我需要帮助才能完成这项工作。

这是我使用的代码:

[Command]
void Cmd_DoTheSpawn(GameObject myGameObject) {

    // Check if front or back?
    char lastChar = myGameObject.tag[myGameObject.tag.Length - 1];

    if (lastChar == 'B') {
        convertedObjectTag = unet_Back2Front [myGameObject.tag];
    } else {
        convertedObjectTag = unet_Front2Back [myGameObject.tag];
    }

    GameObject my1 = Resources.Load (convertedObjectTag) as GameObject;

    float z = myGameObject.transform.localEulerAngles.z;

    //var go = (GameObject)Instantiate (my1, myGameObject.transform.position, myGameObject.transform.localRotation);
    var go = (GameObject)Instantiate(my1, myGameObject.transform.position, Quaternion.Euler(0f, 0f, z));
    go.name = go.name.Remove(go.name.Length - 7); // Remove the '(Clone)' in name

    NetworkServer.SpawnWithClientAuthority(go, base.connectionToClient);

    print ("myGameObject: " + myGameObject.transform.position);

    if (myGameObject == null)
        print ("myGameObject NULL" + myGameObject.transform.position);

    Rpc_DoTheRot (go, myGameObject);

    myNetID = myGameObject.GetComponent<NetworkIdentity> ();
    Cmd_DestroyGameObject (myNetID.netId);
}

感谢@LumbusterTick,我确实让它工作了,这意味着轮换没问题。但是,我确实遇到了另一个我不完全理解的问题。

我添加了以下代码:

[ClientRpc]
public void Rpc_DoTheRot(GameObject newGO, GameObject oldGO) {
    print ("Rpc_DoTheRot");

    if (newGO == null)
        print ("newGO NULL");
    if (oldGO == null)
        print ("oldGO NULL");

    newGO.transform.rotation = oldGO.transform.rotation;
}

...我在 spawn 之后但在销毁之前调用,请参阅上面的更新代码。

它确实将翻转的预制件正确旋转,但我确实收到以下消息:

oldGO NULL

还有:

NullReferenceException:对象引用未设置为对象的实例

我非常清楚这意味着什么,但不知道为什么会发生这种情况,因为当我发送 myGameObject 的所有值时它们都为空。 ...我在销毁之前就这样做了。

我不明白为什么它是 null 但仍然影响新对象的旋转。

【问题讨论】:

  • 你在使用网络转换吗?
  • 我也在使用 unet,如果对象在客户端生成,并且不翻转(旋转),那么它可能无法正常工作。
  • @LumbusterTick 我使用脚本进行网络转换。这不是问题,因为它在我在游戏中旋转时起作用,但是当我在相同位置替换预制件时,生成预制件总是以零旋转结束。我确实意识到这些值没有同步但不理解,因为我正在从我获取 pos 的实际预制件中指定当前旋转。
  • 好的,让我们尝试不同的事情,这真的帮助了我一次,从你的命令函数在你网络生成调用 clientrpc 函数并将实例化的游戏对象传递给它并在那里改变它的旋转并告诉我这是否有效,如果它不会,这意味着这里有问题,并尝试在实例化函数中进行资源加载,看看是否有帮助
  • @LumbusterTick 它可以工作:-) 但是,我确实遇到了错误。请参阅原始帖子中的更新。我用“try & catch”管理了这个错误,但不明白为什么我得到这个错误,但它有效。另外,请写一个正式的答案,以便我将其标记为完成。

标签: unity3d unity3d-unet


【解决方案1】:

在网络生成后,从您的命令函数调用 clientrpc 函数并将实例化的游戏对象传递给它并在那里更改其旋转。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2018-04-22
    • 2011-12-02
    相关资源
    最近更新 更多