Unity教程之-Unity5.1新的网络引擎UNET(六)UNET Multiplayer Lobby

 

继续上篇文章《Unity教程之-Unity5.1新的网络引擎UNET(五)UNET Network Messages》,多人游戏 都有一个暂存区(staging area ):实际游戏之前等待所有玩家加入的地方,在这一area  –  通常被称为 “lobby”, 玩家可能能够选择选项,能将自己设置为准备好后比赛开始。
NetworkLobbyManager 是专门的NetworkManager网络管理器,可以提供Unity多人游戏大厅(Unity Multiplayer lobby )。它包括:

• 限制可以加入的players 的数量
• 每个客户端支持多个players ,那么限制每个客户端的玩家数量
• 防止玩家游戏in-progress时加入
• 每名player 准备好状态,所以,游戏开始时所有玩家都是准备好了
• 每个player 配置数据
• 当比赛结束的时候重新加入大厅
• 虚拟函数,它允许自定义逻辑来 lobby events
GuiLobbyManager 是为lobby 特殊lobby 管理,提供了UI 。它可以作为一个资产包(asset package ),可以导入Unity项目轻松地添加一个lobby 到多人游戏。脚本和 UI 预置在包中可以定制,为使外观和感觉与众不同。
有两种player 对象- 在NetworkLobbyManager中的每个预制的插槽(prefab slot ) :
LobbyPlayer 对象
• 每个player
• 创建客户端连接,或添加player时 被创建
• 一直存在直到客户端断开连接
• 为该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 被服务器上每个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;
}

好了,本篇unity3d教程关于UNET Multiplayer Lobby 的介绍到此结束,下篇我们再会!