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

C# 同步从Unet/Unity 5中的另一个可交互对象更改的非玩家对象转换?,c#,unity3d,unity5,unity-networking,unity3d-unet,C#,Unity3d,Unity5,Unity Networking,Unity3d Unet,我在游戏中有一个立方体,当我看着另一个物体时,它会在初始状态和较大状态之间移动。这在单人游戏中效果很好,但当我把它带到多人游戏中时,我找不到合适的选项组合来让它在两个客户端(一个是主机)上更新。每个玩家仍然可以激活自己的多维数据集,但不能在另一台机器上显示。脚本位于具有网络标识的按钮上,它访问具有网络标识和网络转换的多维数据集 单人代码参考: void Update () { if (Camera.main != null) { RaycastHit hit;

我在游戏中有一个立方体,当我看着另一个物体时,它会在初始状态和较大状态之间移动。这在单人游戏中效果很好,但当我把它带到多人游戏中时,我找不到合适的选项组合来让它在两个客户端(一个是主机)上更新。每个玩家仍然可以激活自己的多维数据集,但不能在另一台机器上显示。脚本位于具有网络标识的按钮上,它访问具有网络标识和网络转换的多维数据集

单人代码参考:

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);
}
void更新(){
如果(Camera.main!=null){
雷卡斯特击中;
Ray-Ray=Camera.main.screenpointoray(输入.鼠标位置);
如果(物理.光线投射(光线,出击)){
if(hit.collider.gameObject==gameObject&&hit.distance<5){
平台规模();
}否则{
平台重置();
}
}
}
}
void PlatformScale(){
platform.transform.localScale=Vector3.Lerp(platform.transform.localScale,platformScale,3f*Time.deltaTime);
}
无效平台重置(){
platform.transform.localScale=Vector3.Lerp(platform.transform.localScale,platformStartingScale,3f*Time.deltaTime);
}

以防您还没有阅读,我强烈建议您阅读

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

尽管如此,您可能不需要它们,因为您有网络转换。确保网络上的多维数据集已正确/可用

编辑:要在网络上生成多维数据集

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);
    }
}
但是:根据文档,只要对象是为您处理的,您就不需要通过网络生成对象-因此您的问题存在于其他地方


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

因此,经过大量搜索后,我发现您无法在Unet中同步localScale,这是一个突出的错误。我已将代码更改为使用位置,而不是本地刻度。感谢您的帮助。

该对象未实例化,必须是这样才能工作的吗?我就在现场。我已经阅读了手册,但是我找不到任何关于更新由其他设备控制的非玩家对象上的转换的内容。如果你有一个直接的,将帮助我,这将是伟大的。它应该只是产卵它的工作。。。我在手机上,很抱歉格式太糟糕了。你能试着在场景中添加一个空的游戏对象吗,在里面添加一个脚本:
publicgameobjectcubeprefab;public override void OnStartServer(){NetworkServer.Spawn(cubePrefab);}
您需要为多维数据集创建一个预置,并将该预置注册到网络管理器的可生成对象中,然后将其拖动到上述脚本检查器中的cubePrefab插槽中。试着和你的立方体互动,然后再联系我。如果你能确认这不起作用,我将能够提供更多帮助。嗨,我将在几个小时内无法测试,谢谢你的帮助。我有一个想法,为什么必须生成对象才能在游戏中修改,我必须将单独按钮上的脚本移动到玩家,还是也必须生成该对象?我更新了答案,以包含在网络上生成多维数据集所需的代码,我仍然觉得很奇怪,我必须在游戏开始的时候,在场景中生成对象,而不是在场景中。似乎如果我在一个场景中有50个门,并且必须在网络中生成它们,那么这将比在场景中已有这些门的效率要低。