【问题标题】:Command not trigger from client命令未从客户端触发
【发布时间】:2017-01-19 06:45:36
【问题描述】:

此代码位于播放器上,对菜单中的按钮按下作出反应,其想法是当第一次按下按钮“btn_MenuKill”时它变成橙色,下一次将颜色变回原来的黄色并执行"print ("FIRE THE PROCESS")", 在 SyncVar Hook "void ProcessKillObject(bool _MP_Orange) {".

这是情况/问题:

在编辑器中启动主机

1) 单击主机客户端(编辑器)上的按钮 = [命令] 有效

2) 单击远程客户端上的按钮 = 不起作用,不要触发 [Command]

在生成的“远程”客户端中启动主机

1) 单击主机客户端上的按钮 = [命令] 有效

2) 点击远程客户端上的按钮 = [Command] 有效

我不明白为什么当主机在编辑器上并且我使用遥控器上的按钮时 [Command] 不起作用。

代码如下:

[SyncVar(hook = "ProcessKillObject")] public bool MP_KillOrange = false;
[SyncVar(hook = "MoveMainMenu")] public bool MP_MainMenu;
private NetworkIdentity objNetId;
private Color32 yellowButtonColor = new Color32 (200, 200, 2, 255);
private Color32 orangeButtonColor = new Color32 (255, 96, 0, 255);

public void Btn_Kill() {

    if (!isLocalPlayer)
        return;

    foreach (string objectTag in MP_Singleton.Instance.master_Object_List) {
        GameObject dummy = GameObject.Find (objectTag);
        Cmd_LocalAuthority (true, dummy);
    }

    Cmd_ProcessKill ();
}

// SyncVar Hook
void ProcessKillObject(bool _MP_Orange) {

    if (_MP_Orange) {
        GameObject.Find ("btn_MenuKill").GetComponent<Button> ().image.color = orangeButtonColor;
    } else if (!_MP_Orange) {
        GameObject.Find ("btn_MenuKill").GetComponent<Button> ().image.color = yellowButtonColor;

        print ("FIRE THE PROCESS");
    }
}

[Command] //>>>>>> THIS IS NOT TRIGGERED
void Cmd_ProcessKill() {

    // >>>>>>>>>>>>>>>>>>>>>>
    GameObject.Find ("MyText").GetComponent<Text> ().text = "HIT"; // TO SEE THAT THE COMMAD TRIGGER
    //>>>>>>>>>>>>>>>>>>>>>>>
    if (MP_KillOrange) 
        MP_MainMenu = !MP_MainMenu;

    MP_KillOrange = !MP_KillOrange;

}


[Command]
void Cmd_LocalAuthority(bool getAuthority, GameObject obj) {

    objNetId = obj.GetComponent<NetworkIdentity> ();        // get the object's network ID

    if (getAuthority) {
        objNetId.AssignClientAuthority (connectionToClient);    // assign authority to the player
    } else {
        objNetId.RemoveClientAuthority (connectionToClient);    // remove the authority from the player
    }
}

【问题讨论】:

  • 如果我删除“Cmd_LocalAuthority (true, dummy);”它可以工作,但是我移动的非玩家对象不会停留在我移动它的位置。
  • 已解决,我使用了 RPC,然后它工作了。

标签: unity3d network-programming unity3d-unet


【解决方案1】:

我添加了 RPC,然后它就可以工作了。

[ClientRpc]
void Rpc_Position(GameObject myGO, float ranX, float ranY, int zDepth, float twist) {

    myGO.transform.position = new Vector3 (ranX, ranY, zDepth);
    myGO.transform.localEulerAngles = new Vector3(0f, 0f, twist);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 2013-11-15
    相关资源
    最近更新 更多