Проблема смещения полномочий неигрового объекта - PullRequest
0 голосов
/ 20 октября 2018

Я делаю многопользовательскую игру и хочу, чтобы игрок взаимодействовал с неигровым объектом (трансформация которого может быть изменена любым игроком).Когда я взаимодействую их с игроком, который присоединился первым (или с парнем, который размещает), он работает, но если я пытаюсь взаимодействовать с другим игроком (тем, кто присоединился ко второму), объекты возвращаются в то место, которое покинул первый игрокего в.

Так что я попытался сместить полномочия неигрового объекта, но у меня возникают следующие ошибки.Кто-нибудь сталкивается с той же проблемой или знает какой-либо другой способ решения вышеуказанной задачи?Я использую следующий код для изменения полномочий:

    [Command]
void Cmd_AssignLocalAuthority(GameObject obj)
{
    print("shifting authority successfully");
    NetworkInstanceId nIns = obj.GetComponent<NetworkIdentity>().netId;
    GameObject client = NetworkServer.FindLocalObject(nIns);
    NetworkIdentity ni = client.GetComponent<NetworkIdentity>();
    ni.AssignClientAuthority(connectionToClient);
}

[Command]
void Cmd_RemoveLocalAuthority(GameObject obj)
{
    print("reverting authority successfully");
    NetworkInstanceId nIns = obj.GetComponent<NetworkIdentity>().netId;
    GameObject client = NetworkServer.FindLocalObject(nIns);
    NetworkIdentity ni = client.GetComponent<NetworkIdentity>();
    ni.RemoveClientAuthority(ni.clientAuthorityOwner);
}

И ошибка, которую я получаю, это

enter image description here

1 Ответ

0 голосов
/ 20 октября 2018

Вы должны знать, что изменения ДОЛЖНЫ вызываться из объекта игрока, а не из самого объекта, так как у него нет полномочий.

Для установки полномочий вы должны сделать что-то вроде этого:

[Command]
public void CmdSetAuth(NetworkInstanceId objectId, NetworkIdentity player)
{
    GameObject iObject = NetworkServer.FindLocalObject(objectId);
    NetworkIdentity networkIdentity = iObject.GetComponent<NetworkIdentity>();

    //Checks if anyone else has authority and removes it and lastly gives the authority to the player who interacts with object
    NetworkConnection otherOwner = networkIdentity.clientAuthorityOwner;
    if (otherOwner == player.connectionToClient)
    {
        return;
    }
    else
    {
        if (otherOwner != null)
        {
            networkIdentity.RemoveClientAuthority(otherOwner);
        }
        networkIdentity.AssignClientAuthority(player.connectionToClient);
    }

    networkIdentity.AssignClientAuthority(player.connectionToClient);
}
...