团结 |尝试使用客户端权限生成玩家时出现 NullReferenceException
Unity | NullReferenceException when trying to spawn player with client authority
我正在创建一个多人游戏,并尝试使用客户端权限生成我的玩家预制件,以便每个玩家都可以由其各自的用户控制。
我的工作流程如下:
1) 主机启动,生成他们的 PlayerUnit。
2) 客户端连接,生成他们的 PlayerUnit。
3) 游戏开始,PlayerUnits 生成相应的PlayerCharacters(这就是问题所在)。
我可以使用 NetworkServer.Spawn(player);
在玩家的罚款中生成,但是,这允许主机控制所有 PlayerCharacters。因此,据我所知,PlayerCharacters 必须以客户端权限生成,因此只有正确的用户才能控制它们。但是,当我使用 NetworkServer.SpawnWithClientAuthority(player, connectionToClient);
生成 PlayerCharacter 时,出现以下错误:
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联网。
这是解决方案:
问题在于传递 PlayerUnit 和 PlayerCharacters 之间的连接。
通过使用 NetworkServer.ReplacePlayerForConnection(connectionToClient, player, connectionID);
,我为 PlayerCharacter 提供了 PlayerUnit 之前拥有的连接。
至少这是我的理解。
我正在创建一个多人游戏,并尝试使用客户端权限生成我的玩家预制件,以便每个玩家都可以由其各自的用户控制。
我的工作流程如下: 1) 主机启动,生成他们的 PlayerUnit。 2) 客户端连接,生成他们的 PlayerUnit。 3) 游戏开始,PlayerUnits 生成相应的PlayerCharacters(这就是问题所在)。
我可以使用 NetworkServer.Spawn(player);
在玩家的罚款中生成,但是,这允许主机控制所有 PlayerCharacters。因此,据我所知,PlayerCharacters 必须以客户端权限生成,因此只有正确的用户才能控制它们。但是,当我使用 NetworkServer.SpawnWithClientAuthority(player, connectionToClient);
生成 PlayerCharacter 时,出现以下错误:
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联网。
这是解决方案:
问题在于传递 PlayerUnit 和 PlayerCharacters 之间的连接。
通过使用 NetworkServer.ReplacePlayerForConnection(connectionToClient, player, connectionID);
,我为 PlayerCharacter 提供了 PlayerUnit 之前拥有的连接。
至少这是我的理解。