Unity Networkserver.SpawnwithclientAuthroity在主机上不起作用

时间:2018-10-21 17:19:12

标签: unity3d

我遵循了有关如何使用Unity网络的Youtube教程https://www.youtube.com/watch?v=afz2An4X0vw。 关键是要让一个带有网络ID组件的对象生成播放器,并且为了控制播放器,我们需要赋予客户端生成播放器对该播放器的权限。

但是,与视频中的操作完全相同,每当我主持游戏(使用统一的Network HUD)时,hasAuthority都会在主机上返回false而不是true。

它在所有其他客户端上返回true(应如此)。 在我看来,托管人似乎并没有将自己视为客户端,而只是将其视为服务器,但这在上面链接的视频中并未发生。

我如何使托管播放器在hasAuthority上返回true,因为它拒绝使用以下代码?

对象上的脚本(客户端连接时生成):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class ThePlayerScript : NetworkBehaviour 
{

    public GameObject abigail;
    public GameObject abigailN;

    void Start () 
    {

        if(isLocalPlayer == false)
        {
            return;
        }
        CmdSpawnPlayer();
    }

    void Update () { }

    [Command]
    void CmdSpawnPlayer()
    {
        abigailN = Instantiate(abigail);
        NetworkServer.SpawnWithClientAuthority(abigailN, connectionToClient);
    }
}

由游戏对象产生的玩家代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class Abigail : NetworkBehaviour 
{

    public GameObject mainCamera;
    Vector3 myLocation;
    Vector3 cameraView;

    // Use this for initialization
    void Start () 
    {
        if(hasAuthority == false)
        {
            Destroy(this);
            return;
        }
        mainCamera = GameObject.Find("Main Camera");
    }
}

(我删除了Abigail类中的Update函数,因为它不相关,因为它没有被执行。)

1 个答案:

答案 0 :(得分:0)

我发现在这种情况下hasAuthority只会在Start()方法中返回false。如果您在Update()方法中使用它,则只需像在“ ThePlayerScipt”中那样使用以下方法分配权限即可正确返回true:

NetworkServer.SpawnWithClientAuthority(abigailN, connectionToClient);

希望有帮助:)