Единство |NullReferenceException при попытке породить игрока с правами клиента - PullRequest
0 голосов
/ 10 ноября 2019

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

Мой рабочий процесс выглядит следующим образом: 1) Хост запускается, его PlayerUnitпородил. 2) Клиент подключается, его PlayerUnit создается. 3) Игра начинается, PlayerUnits порождает соответствующих PlayerCharacters (Вот в чем проблема).

Я могу появиться в порядке игрока, используя NetworkServer.Spawn(player);, однако это позволяет хосту контролировать все PlayerCharacters. Поэтому, насколько я понимаю, PlayerCharacters должен порождаться с полномочиями клиента, чтобы только правильный пользователь мог контролировать их. Однако, когда я запускаю PlayerCharacter с NetworkServer.SpawnWithClientAuthority(player, connectionToClient);, я получаю следующие ошибки:

NullReferenceException: Object reference not set to an instance of an object
UnityEngine.Networking.NetworkServer.SpawnWithClientAuthority (UnityEngine.GameObject obj, UnityEngine.Networking.NetworkConnection conn) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:1565)

SpawnWithClientAuthority NetworkConnection is not ready!
UnityEngine.Networking.NetworkServer:SpawnWithClientAuthority(GameObject, NetworkConnection)

И хост все еще может управлять обоими персонажами игрока.

Это мой код для порожденияPlayerUnit (в моем CustomNetworkManager):

public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
{
    var player = Instantiate(playerPrefab);
    NetworkServer.AddPlayerForConnection(conn, player, playerControllerId); 
}

public override void OnClientConnect(NetworkConnection conn)
{
    base.OnClientConnect(conn);
    ClientScene.AddPlayer(0); 
}

Это код для вызова PlayerCharacter (прикреплен к PlayerUnit):

[Command]
public void CmdSpawnPlayer(int playerCount)
{
    CustomNetworkHUD.playerCount++;
    var players = new GameObject[] { redPlayer, bluePlayer, greenPlayer, yellowPlayer };
    var player = Instantiate(players[playerCount - 1]);
    player.SetActive(true);
    ClientScene.RegisterPrefab(player);
    NetworkServer.Spawn(player); // No errors, but not desired behaviour
    //NetworkServer.SpawnWithClientAuthority(player, connectionToClient);  
}

Извините, если проблема очень очевидна, этоя впервые общаюсь с Unity.

...