Bak*_*tak 4 c# networking reference unity-game-engine
当涉及到将玩家引用到另一个对象的脚本时,Unity 让我感到困惑。我使用了几种方法来引用 localPlayer 对象:
gameObject.Name(没用过但也不靠谱)public GameObject Player;在检查器拖放中分配(当播放器是预制件时会遇到问题)public static [PlayerControllerClass] instance;和设置instance = this。void Start()为了playerSpeed从另一个脚本访问我做PlayerControllerClass.instance.playerSpeed = 10;是否有其他解决方案可以以适当的方式引用玩家。
注意:我知道我的问题可能与特定问题无关,但如果有人会提供帮助,我可以解释更多。
Edit1:例如我想
localPlayer在一个 NetworkGame 中找到所有玩家都具有相同名称、相同标签但只有一个玩家是 localPlayer 的。我可以localPlayer从另一个脚本访问吗?Edit2:我接受的答案是我感觉最好的答案。我将通过从一组玩家[ ] 中访问它来使用预览
score text中提供的答案localPlayerlocalPlayer
你的问题直到你的编辑才清楚,然后我意识到这是一个网络问题。
我需要在 NetworkGame 中找到 localPlayer,其中所有玩家都具有相同的名称、相同的标签但只有一个玩家是 localPlayer 我可以从另一个脚本访问 localPlayer 吗?
您可以找到使用NetworkConnection.playerControllers哪些 retruens List of PlayerControllerthen 循环遍历它并检查它是否有效的玩家。之后,从中获取 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;
}
Run Code Online (Sandbox Code Playgroud)
如果您已NetworkIdentity附加到播放器而不是NetworkBehaviour,只需获取NetworkIdentity并检查isLocalPlayer属性。您还可以找到 GameObject 然后检查NetworkIdentity和isLocalPlayer属性。
if (obj.GetComponent<NetworkIdentity>().isLocalPlayer){}
Run Code Online (Sandbox Code Playgroud)
您可能需要的其他有用的播放器操作:
查找所有玩家:
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;
}
Run Code Online (Sandbox Code Playgroud)
按名称查找玩家(也可以按标签或图层更改为):
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;
}
Run Code Online (Sandbox Code Playgroud)
编辑前的旧答案:
是否有其他解决方案可以以适当的方式引用玩家。
是的,您GameObject.Find可以使用找到 GameObject ,然后,您可以使用该GetComponent函数来获取附加到它的脚本。
我注意到你提到你也想在场景中引用预制件。预制件和已经出现在场景中的对象之间存在差异,并且它们都有不同的引用方式。
这是场景中对象的示例。您可以在“层次结构”选项卡中看到它们:
让我们按名称引用“画布”游戏对象:
GameObject canvasObj = GameObject.Find("Canvas");
Run Code Online (Sandbox Code Playgroud)
让我们参考Canvas附加到“画布”游戏对象的脚本:
GameObject canvasObj = GameObject.Find("Canvas");
Canvas canvas = canvasObj.GetComponent<Canvas>();
Run Code Online (Sandbox Code Playgroud)
预制件:
以下是“项目”选项卡中的预制件示例:
将预制件放在名为“Resources”的文件夹中。您必须这样才能使用ResourcesAPI引用它们。
让我们参考“Capsule”预制游戏对象:
GameObject prefab = Resources.Load<GameObject>("Capsule");
Run Code Online (Sandbox Code Playgroud)
要使用它,您必须实例化它:
GameObject instance = Instantiate(prefab);
Run Code Online (Sandbox Code Playgroud)
您只能在实例化后在预制件上获取组件:
CapsuleCollider cc = instance.GetComponent<CapsuleCollider>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3303 次 |
| 最近记录: |