• 多人游戏厅
    • 大厅玩家对象
    • 最少玩家
    • 游戏玩家
    • 将大厅添加到游戏中
    • 示例项目

    多人游戏厅

    很多多人游戏都有一个中场区域(通常称为“大厅”)供玩家在玩真正的游戏之前加入。在这个区域,玩家可以选择选项并将自己设置为准备开始游戏。

    NetworkLobbyManager是一个专门的网络管理器,它提供了Unity多人游戏大厅。其功能包括以下内容:

    1. 限制可以加入的玩家人数
    2. 每个客户端支持多个玩家,限制每个客户端的玩家数量
    3. 防止玩家加入游戏进行中
    4. 每个玩家都已准备就绪状态,以便在所有玩家都准备就绪时开始游戏
    5. 具有每个玩家的配置数据
    6. 允许在游戏结束时重新加入大厅
    7. 允许大厅事件的自定义逻辑的虚拟功能
    8. 一个简单的用户界面,用于与大厅进行交互

    以下是在服务器上调用的NetworkLobbyManager虚拟函数:

    1. OnLobbyStartHost
    2. OnLobbyStopHost
    3. OnLobbyStartServer
    4. OnLobbyServerConnect
    5. OnLobbyServerDisconnect
    6. OnLobbyServerSceneChanged
    7. OnLobbyServerCreateLobbyPlayer
    8. OnLobbyServerCreateGamePlayer
    9. OnLobbyServerPlayerRemoved
    10. OnLobbyServerSceneLoadedForPlayer
    11. OnLobbyServerPlayersReady

    上述所有的服务器函数都有空的默认实现,除了使用PlayScene OnLobbyServerPlayersReady调用ServerChangeScene

    以下是在客户端上调用的NetworkLobbyManager虚拟功能:

    1. OnLobbyClientEnter
    2. OnLobbyClientExit
    3. OnLobbyClientConnect
    4. OnLobbyClientDisconnect
    5. OnLobbyStartClient
    6. OnLobbyStopClient
    7. OnLobbyClientSceneChanged
    8. OnLobbyClientAddPlayerFailed

    所有上述客户端函数都有空的默认实现。

    1. PS : 勾选了Auto Create Player选项以后 通过 OnClientConnect(NetworkConnection conn)创建LobbyPlayer

    大厅玩家对象

    有两种玩家对象,其中每个在NetworkLobbyManager中都有一个Prefab插槽。插槽可以在此屏幕截图中看到:

     6.216 多人游戏大厅  - 图1

    当玩家加入大厅时,LobbyPlayerLobbyPlayerPrefab创建:

    1. 每个玩家一个LobbyPlayer
    2. 客户端连接时创建,或添加玩家
    3. 存在,直到客户断开连接
    4. 为大厅持有此玩家的就绪标志
    5. 在大厅里处理命令
    6. 将用户脚本添加到此预制中以保存特定于游戏的玩家数据
    7. 该预制件必须具有NetworkLobbyPlayer组件

    最少玩家

    该最低玩家字段代表在大厅“准备就绪”的玩家的最小数目与开始比赛。如果连接的客户端数量超过“最低限度玩家数”值,则等待所有连接的客户端变为“就绪”,即可启动匹配。

    例如,如果“Minimum Players”设置为2:

    1. 启动一个游戏实例并启动主机。然后在游戏大厅界面中,按您的播放器的开始。您仍处于大厅模式,因为开始游戏的最少Ready玩家人数为2人。
    2. 开始另外两个游戏实例,并在那里启动客户端。“Minimum Players”设置为2并不重要。等待所有连接的玩家变为Ready
    3. 按一个玩家在大厅UI中开始。两名玩家已准备就绪,但仍处于大厅模式。在最后一位玩家的大厅UI中按“开始”,所有玩家都将移至游戏模式。

    游戏玩家

    GamePlayer在游戏开始时由GamePlayerPrefab创建:

    1. 每个玩家一个GamePlayer
    2. 游戏场景开始时创建
    3. 重新进入大厅时被摧毁
    4. 在游戏中处理命令
    5. 该预制件必须具有NetworkIdentity组件

    所述NetworkLobbyPlayer组件用于LobbyPlayer对象。它提供了一些可用于自定义大厅行为的虚拟功能回调

    1. public virtual void OnClientEnterLobby();
    2. public virtual void OnClientExitLobby();
    3. public virtual void OnClientReady(bool readyState);

    当游戏进入大厅时,客户端会调用函数OnClientEnterLobby。这种情况发生在大厅场景第一次启动时,以及从游戏场景返回到大厅时。

    当游戏退出大厅时,客户端会调用函数OnClientExitLobby。切换到游戏场景时发生这种情况。

    OnClientReady函数在该玩家的就绪状态改变时在客户端上被调用。

    将大厅添加到游戏中

    向多人游戏添加网络大厅的过程(不使用多人游戏大厅资产包):

    1. 创建一个新的大厅场景
    2. 作为第一个场景,将场景添加到构建设置(菜单:文件 > 构建设置...)
    3. 在新场景中创建一个新的GameObject(菜单:GameObject > Create Empty),并将其命名为LobbyManager
    4. NetworkLobbyManager组件添加到LobbyManager游戏对象
    5. NetworkManagerHUD组件添加到LobbyManager GameObject
    6. 在用于NetworkLobbyManager部件检查员窗口中,设置大堂场景的NetworkLobbyManger到现场时隙包含LobbyManager游戏对象
    7. NetworkLobbyManager Play Scene插槽设置为游戏的主游戏场景
    8. 创建一个新的GameObject并将其命名为LobbyPlayer
    9. NetworkLobbyPlayer组件添加到LobbyPlayer
    10. LobbyPlayer创建一个预制件(将其拖动到“项目”窗口中),然后从场景中删除该实例
    11. LobbyManagerNetworkLobbymanager组件上,将LobbyPlayer预制件分配给大厅播放器预制插槽
    12. 将主游戏中玩家的预制分配给游戏玩家预制插槽
    13. 保存场景
    14. 运行游戏

    此版本的NetworkLobbyManager使用OnGUI用户界面,如NetworkManagerHUD。要获得更好的用户界面,请使用多人大厅资产包(可在Unity论坛的NetworkStarter示例包中找到)。

    NetworkLobbyManager具有许多可用于自定义大厅行为的虚拟功能回调。最重要的是OnLobbyServerSceneLoadedForPlayer,它在从大厅过渡到主游戏时在每个玩家的服务器上调用。这是将大厅设置应用于玩家对象的理想场所。

    1. // for users to apply settings from their lobby player object to their in-game player object
    2. public override bool OnLobbyServerSceneLoadedForPlayer(GameObject lobbyPlayer, GameObject gamePlayer)
    3. {
    4. var cc = lobbyPlayer.GetComponent<ColorControl>();
    5. var player = gamePlayer.GetComponent<Player>();
    6. player.myColor = cc.myColor;
    7. return true;
    8. }

    示例项目

    Unity资产商店中有一个示例项目,它使用NetworkLobbyManager并为大厅提供GUI。这可以作为与大厅进行多人游戏的起点。

    大堂示例项目

    ?