同步从 Unet/Unity 5 中的另一个可交互对象更改的非玩家对象转换?

Sync non-player object transform that is changed from another interactable object in Unet/Unity 5?

我的游戏中有一个立方体,它在观察另一个物体时在其初始状态和更大的状态之间切换。这在单人游戏中运行良好,但是当我将它带到多人游戏时,我找不到正确的选项组合来让它在两个客户端(一个是主机)上更新。每个玩家仍然可以激活自己的立方体,但不会出现在另一台机器上。该脚本位于具有网络标识的按钮上,它访问也具有网络标识和网络转换的多维数据集。

单人代码参考:

void Update () {

    if (Camera.main != null) {
        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out hit)) {
            if (hit.collider.gameObject == gameObject && hit.distance < 5) {
                PlatformScale();
            } else {
                PlatformReset();
            }
        }
    }
}

void PlatformScale () {
    platform.transform.localScale = Vector3.Lerp (platform.transform.localScale, platformScale, 3f * Time.deltaTime);
}
void PlatformReset () {
    platform.transform.localScale = Vector3.Lerp (platform.transform.localScale, platformStartingScale, 3f * Time.deltaTime);
}

如果您还没有通读,我强烈建议您通读 Unity Networking Manual

我建议使用 [Command] 或 [ClientRpc](取决于哪些对象在服务器上,哪些是本地的)函数来 lerp 尺度。

不过,您可能不需要它们,因为您有网络转换。确保您在网络上正确地 spawned/instantiated 多维数据集。

编辑:在网络上生成立方体...

using UnityEngine;
using UnityEngine.Networking;

public class CubeStuff : NetworkBehaviour {

    public GameObject cubePrefab;
    public GameObject cube;
    public override void OnStartServer() {
        GameObject cubeSpawn = (GameObject)Instantiate(cubePrefab, transform.position, transform.rotation);
        NetworkServer.Spawn(cubePrefab);
    }
}

但是:根据文档,您不需要通过网络生成对象,只要它是 in the scene 因为这是为您处理的 - 所以您的问题出在其他地方。

我没有足够的信息来真正了解您的设置。您的按钮和 UI 可以是场景中的一个对象,只需确保它们已选中本地玩家权限并且它们的 OnClick() 引用正在调用 [Command] 函数。

所以经过多方查找,我发现在 Unet 中无法同步 localScale,这是一个突出的错误。我更改了我的代码以使用位置而不是本地比例。感谢大家的帮助。