当前位置: 代码迷 >> 综合 >> unity mirror 脚本添加玩家(取消Auto Create Player)
  详细解决方案

unity mirror 脚本添加玩家(取消Auto Create Player)

热度:28   发布时间:2024-02-12 13:09:29.0

情景描述:通过玩家在房间中设置的信息玩家角色、玩家颜色在进入游戏场景时根据玩家这些信息进行数据的初始化,比如:根据不同角色设置出生地点。通过阅读mirror的源码可以找到官方创建玩家时的方法,在源码NetworkRoomManager中提供可以被重写的OnRoomServerCreateGamePlayer方法。

找到此方法后我们根据自己的需求进行代码的编写,OnRoomServerCreateGamePlayer这个方法有两个参数NetworkConnection conn, GameObject roomPlayer,这里的roomPlayer变量携带了需要在游戏场景中创建玩家用到的信息。方法返回的是GameObject也就是处理过的玩家。代码如下:

 public override GameObject OnRoomServerCreateGamePlayer(NetworkConnection conn, GameObject roomPlayer){// get start position from base classvar roleName = roomPlayer.GetComponent<MyNetworkRoomPlayer>().RoleName;Transform startTempPostion = null;for (int i = 0; i < startPositions.Count; i++){var name = startPositions[i].transform.name;Debug.Log("位置的名字:" + name);if (name == roleName){startTempPostion = startPositions[i].transform;}}GameObject gamePlayer = startTempPostion != null? Instantiate(playerPrefab, startTempPostion.position, startTempPostion.rotation): Instantiate(playerPrefab, Vector3.zero, Quaternion.identity);return gamePlayer;}

代码意图为:根据玩家的角色信息设置在游戏场景中的默认位置,返回带有初始信息的玩家。

注意事项:由于房间NetworkRoomManager脚本是继承NetworkManager在我们取消自动添加玩家这个操作后,在玩家加入房间时可供玩家设置信息的列表就不会进行创建,这里还需要修改一处代码。找这个坑的思路是查找NetworkManager中autoCreatePlayer这个变量在哪些方法中使用,搜索发现三个方法分别是OnServerAddPlayerInternal,OnClientConnect,OnClientSceneChanged,通过阅读代码结合我们的情景锁定在客户端与服务器建立链接时调用。基于此确定OnClientConnect方法,这个方法同时是虚方法提供重写。在我们的脚本MyNetworkRoomManager(继承NetworkRoomManager)进行查找定位重写OnRoomClientConnect方法。代码如下:

   public override void OnRoomClientConnect(NetworkConnection conn){if (!clientLoadedScene){// Ready/AddPlayer is usually triggered by a scene load completing. if no scene was loaded, then Ready/AddPlayer it here instead.if (!ClientScene.ready) ClientScene.Ready(conn);ClientScene.AddPlayer(conn);}}

非常简单就是去掉判断逻辑。

  相关解决方案