Проблема с передачей полномочий неигровому объекту

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

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

    [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);
}

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

введите здесь описание изображения


person Haseeb Asif    schedule 20.10.2018    source источник


Ответы (1)


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

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

[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);
}
person Lotan    schedule 20.10.2018
comment
позвольте мне попробовать! Вы имеете в виду, что я должен прикрепить этот скрипт к объекту Player в моей игре? - person Haseeb Asif; 21.10.2018
comment
Эй, чувак! спасибо, что он работает нормально, но теперь заключается проблема, когда я передаю полномочия клиенту, я также теперь хочу, чтобы полномочия вернулись к клиенту-серверу, и теперь это не работает! поделившись написанным кодом, может быть, вы мне тоже поможете - person Haseeb Asif; 21.10.2018
comment
вот ссылка на код! извините, мне не удалось опубликовать код в комментариях, так как я не знаю, как это сделать! mega.nz/#!B3gWDKz/#!B3gWDKz7 - person Haseeb Asif; 21.10.2018
comment
Я также делюсь здесь проектом git! Так что вы можете посмотреть - person Haseeb Asif; 21.10.2018
comment
вот ссылка git bitbucket.org/haseebasif/unet-box-movement/src / master заранее спасибо - person Haseeb Asif; 21.10.2018