在您编辑之前,您的问题并不清楚,然后我意识到这是一个网络问题。
我需要在所有玩家都拥有的 NetworkGame 中找到 localPlayer
相同的名称,相同的标签,但只有一个播放器是本地播放器 我可以访问
来自另一个脚本的 localPlayer?
您可以使用NetworkConnection.playerControllers 找到返回PlayerController 列表的玩家,然后循环遍历它并检查它是否有效。之后,从中获取 NetworkBehaviour 检查 isLocalPlayer 属性。原来如此。
类似这样的:
GameObject FindLocalNetworkPlayer()
{
NetworkManager networkManager = NetworkManager.singleton;
List<PlayerController> pc = networkManager.client.connection.playerControllers;
for (int i = 0; i < pc.Count; i++)
{
GameObject obj = pc[i].gameObject;
NetworkBehaviour netBev = obj.GetComponent<NetworkBehaviour>();
if (pc[i].IsValid && netBev != null && netBev.isLocalPlayer)
{
return pc[i].gameObject;
}
}
return null;
}
如果您将NetworkIdentity 附加到播放器而不是NetworkBehaviour,只需获取NetworkIdentity 并检查isLocalPlayer 属性。您还可以找到 GameObject,然后检查 NetworkIdentity 和 isLocalPlayer 属性。
if (obj.GetComponent<NetworkIdentity>().isLocalPlayer){}
您可能需要的其他有用的播放器操作:
找到所有玩家:
List<GameObject> ListPlayers()
{
NetworkManager networkManager = NetworkManager.singleton;
List<PlayerController> pc = networkManager.client.connection.playerControllers;
List<GameObject> players = new List<GameObject>();
for (int i = 0; i < pc.Count; i++)
{
if (pc[i].IsValid)
players.Add(pc[i].gameObject);
}
return players;
}
按名称查找玩家(也可以按标签或层更改):
GameObject FindNetworkPlayer(string name)
{
NetworkManager networkManager = NetworkManager.singleton;
List<PlayerController> pc = networkManager.client.connection.playerControllers;
for (int i = 0; i < pc.Count; i++)
{
if ((pc[i].IsValid) && (name == pc[i].gameObject.name))
return pc[i].gameObject;
}
return null;
}
修改前的旧答案:
是否有其他解决方案可以以正确的方式引用玩家。
是的,你找到GameObject.Find的GameObject,之后,你可以使用GetComponent函数来获取附加到它的脚本。
我注意到您提到您也想在场景中引用预制件。预制件和场景中的对象之间存在差异,它们都有不同的引用方式。
这里已经是场景中的对象示例。您可以在层次结构标签中看到它们:
让我们通过名称引用“Canvas”游戏对象:
GameObject canvasObj = GameObject.Find("Canvas");
让我们将Canvas 脚本附加到“Canvas”游戏对象:
GameObject canvasObj = GameObject.Find("Canvas");
Canvas canvas = canvasObj.GetComponent<Canvas>();
预制件:
这是项目选项卡中的预制件示例:
将预制件放在名为“Resources”的文件夹中。您必须这样才能使用Resources API 引用它们。
让我们参考“Capsule”预制游戏对象:
GameObject prefab = Resources.Load<GameObject>("Capsule");
要使用它,你必须实例化它:
GameObject instance = Instantiate(prefab);
只有在实例化之后才能在预制件上获取组件:
CapsuleCollider cc = instance.GetComponent<CapsuleCollider>();