【问题标题】:Problem in authority shifting of non-player object非玩家对象权限转移问题
【发布时间】:2019-03-25 01:13:34
【问题描述】:

我正在制作多人游戏,我想让玩家与非玩家对象交互(任何玩家都可以更改其变换)。当我与第一个加入的玩家(或主持的人)互动时,它正在工作,但如果我尝试与另一个玩家(第二个加入的人)互动,对象会回到第一个玩家离开的位置他在。

所以我尝试的是转移非玩家对象的权限,但我遇到了以下错误。 任何人都遇到同样的问题或知道任何其他方式来完成上述任务?我正在使用以下代码更改权限:

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

我得到的错误是这个

【问题讨论】:

    标签: unity3d multiplayer unity3d-unet unity-networking


    【解决方案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);
        }
    

    【讨论】:

    • 让我试一试!所以你的意思是我必须在我的游戏中附加这个脚本和 Player 对象?
    • 嗨,伙计!感谢它工作得很好,但现在问题在于当我将权限转移给客户端时,我现在也希望将权限返回给服务器客户端,而现在这不起作用!分享编写的代码,所以你也可以在这里帮助我
    • 这里是代码链接!抱歉,我无法在 cmets 中发布代码,因为我不知道该怎么做! mega.nz/#!B3gWDKzB!G0CY_BVH97BwZlZIPKvkbZOQeA7oZt9R_DOvX873E60
    • 我也在这里分享git项目!所以你可以看看
    • 这里是 git 链接 bitbucket.org/haseebasif/unet-box-movement/src/master 在此先感谢
    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多