我正在尝试使用 Unity 5.1.4 和 c# 为 Android 制作网络游戏。首先我做了一个可以托管和加入的网络游戏。由于团队管理的原因,我需要一个大厅,首先需要客户端与服务器建立连接以同步变量。
我使用了 Unity Standard Assets 并尝试为必要的脚本派生一些方法。将 NetworkLobby 附加到工作中的网络游戏仍然存在一些问题。
更准确地说,我需要这个大厅来让加入的玩家选择一个“团队”,并通过它来生成哪个玩家预制件。
情况/想法:
有两个主要脚本正在运行。一个扩展 NetworkLobbyManager 的 NetworkLobbyManager_custom 和一个扩展 LobbyPlayer 的 LobbyPlayer_custom。两者都是大厅的标准 Assets 。 NetworkLobbyManager 附加到 GameObject,LobbyPlayer_custom 附加到我用作大厅预制件的预制件。
NetworkLobbyManger_Custom 管理我的菜单和大厅场景中的 Canvas 和按钮。它还在服务器和客户端之间建立连接。
LobbyPlayer_custom 用于保存玩家选择的团队并更改为客户端上的游戏场景。
应用程序是这样工作的:
- NetworklobbyManager_custom 可让您启动主机/作为客户端加入。
- 在您建立连接后,会弹出一个带有两个按钮的 Canvas 来选择团队。
- 单击按钮后,系统会检查团队是否有空闲位置,并且所选团队应保存在 LobbyPlayer_custom 脚本中。
这是我遇到的问题。我无法访问包含脚本或用于保存选择的脚本的 LobbyPlayerPrefabs。
当我尝试访问 LobbyPlayer_custom 脚本以查找做出选择的 LobbyPlayer_custom 的 ID 时,我收到 NullPointerException。
private string GetLobbyPlayersIdByIp (string ip)
{
LobbyPlayer_custom lobbyPlayer;
for(int i=0; i< maxPlayers; i++)
{
if ((lobbySlots[i] != null))
{ // nullpointer here
lobbyPlayer = lobbySlots[i] as LobbyPlayer_custom;
if (lobbyPlayer.GetPlayerIP().Equals(ip))
{
return lobbyPlayer.GetPlayerUID();
}
}
}
return "null";
}
我还尝试通过如下方式查找所有 LobbyPlayerPrefab 实例来访问 LobbyPlayer_custom 脚本:
LobbyPlayer_custom lobbyPlayer;
Object[] objs = Resources.FindObjectsOfTypeAll(typeof(GameObject));
foreach (Object obj in objs)
{
if (obj.name.Contains("player") || obj.name.Contains("Player"))
{
lobbyPlayer = (obj as GameObject).GetComponent<LobbyPlayer_custom>();
//none of the lobbyPlayers methods are accessible
}
}
有谁知道如何访问生成的预制件的所有 LobbyPlayer 脚本?
非常感谢。
最佳答案
如果您要实例化预制件,FindObjectsOfType() 应该可以满足您的需求。另一种选择是在实例化预制件时将每个脚本实例存储在列表中。
关于c# - 尝试访问 NetworkLobby 中的 LobbyPlayer 实例时出现 Unity NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34839772/