Unity5.1 新的网络引擎UNET(六) UNET Multiplayer Lobby
孙广东 2015.7.12
Multiplayer Lobby 多人游戏大厅
非常多多人游戏 都有一个暂存区(staging area ):实际游戏之前等待全部玩家加入的地方。在这一area – 通常被称为 “lobby”, 玩家可能能够选择选项,能将自己设置为准备好后比赛開始。
NetworkLobbyManager 是专门的NetworkManager网络管理器,能够提供Unity多人游戏大厅(Unity Multiplayer lobby )。它包含:
• 限制能够加入的players 的数量
• 每一个client支持多个players ,那么限制每一个client的玩家数量
• 防止玩家游戏in-progress时加入
• 每名player 准备好状态,所以,游戏開始时全部玩家都是准备好了
• 每一个player 配置数据
• 当比赛结束的时候又一次加入大厅
• 虚拟函数。它同意自己定义逻辑来 lobby events
GuiLobbyManager 是为lobby 特殊lobby 管理,提供了UI 。它能够作为一个资产包(asset package ),能够导入Unity项目轻松地加入一个lobby 到多人游戏。脚本和 UI 预置在包中能够定制。为使外观和感觉与众不同。
有两种player 对象- 在NetworkLobbyManager中的每一个预制的插槽(prefab slot ) :
LobbyPlayer 对象
• 每一个player
• 创建client连接。或加入player时 被创建
• 一直存在直到client断开连接
• 为该player在大堂准备好了flag
• 在大厅里处理命令
• 将用户脚本加入到prefab来保存特定于游戏的玩家数据
GamePlayer 对象
• 每一个player
• 当開始游戏场景时创建
• 又一次进入大厅时被摧毁
• 在游戏中处理命令
NetworkLobbyPlayer 组件用于 LobbyPlayer 的对象。它提供了一些可用于自己定义大堂行为的虚函数回调
public virtual void OnClientEnterLobby() { } public virtual void OnClientExitLobby() { } public virtual void OnClientReady(bool readyState) { }
加入 Lobby 到一个 Game:
将 NetworkLobby 加入到多人游戏 (不使用多人游戏大厅 资产包) 的过程:
• 创建一个新的LobbyScene大堂场景
• 场景加入到 build settings,将作为第一个场景
• 在新场景中创建一个新的游戏物体,将它重命名为 LobbyManager
• 将 NetworkLobbyManager 组件加入到 LobbyManager 对象
• 将 NetworkManagerHUD 组件加入到 LobbyManager 对象
• 打开 NetworkLobbyManager 组件在inspector面板上
• 将 LobbyScene 设置为当前场景
• 将 PlayScene 设置为主要进行游戏的游戏场景
• 创建一个新的游戏对象并将它重命名为 LobbyPlayer
• 将 NetworkLobbyPlayer 组件加入到 LobbyPlayer
• 为 LobbyPlayer 创建为一个预置体,从现场删除这个实例
• 设置 LobbyPlayerPrefab 插槽为 LobbyPlayer 预置体
• 在main game中的player的GamePlayerPrefab 插槽设置 为这个预制体
• 保存场景。
• 执行游戏
此版本号的NetworkLobbyManager使用了 OnGUI 用户界面。像 NetworkManagerHUD 。
关于更好的用户界面请 使用的多人游戏大厅资产包(multiplayer-lobby asset package.
)。
NetworkLobbyManager 有非常多可用于自己定义大堂行为的虚函数回调。
最重要的是 OnLobbyServerSceneLoadedForPlayer 被server上每一个player调用,由于他们从大厅过渡到main game。这是应用设置的理想场所 ,从大堂到玩家的游戏对象。
// for users to apply settings from their lobby player object to their in-game player object public override bool OnLobbyServerSceneLoadedForPlayer(GameObject lobbyPlayer, GameObject gamePlayer) { var cc = lobbyPlayer.GetComponent<ColorControl>(); var player = gamePlayer.GetComponent<Player>(); player.myColor = cc.myColor; return true; }