欢迎大家继续学习《Unity 游戏编程进阶》
本节我们介绍 PUN 的基本连接流程
首先我们回顾网络游戏的 C/S
架构 客户端依次连接服务器的 Login Server、 Master Server 以及
Game Server 开始游戏的运行,这里服务器只管理一个网络游戏
在 PUN 的 C/S 架构中,我们使用 Unity
引擎和 PUN 开发 Unity 客户端 其中,Unity
引擎实现场景绘制、 游戏逻辑处理等游戏功能 PUN 实现 Unity
客户端与 Phonton 服务器之间的网络通信功能 当 Unity 客户端连接 Photon
服务器时,首先连接 Name Server Name Server 可以管理多个网络游戏。
Unity 客户端向 Name Server 发送游戏信息,包括游戏的 AppId 和版本标识符。
Name Server 根据游戏信息,查询与该版本对应的 Master Server
并将 Master Server 的 IP 地址发送给客户端 注意
Photon 服务器中不包含管理玩家帐号和密码的 Login Server
客户端连接 Photon 服务器时,不需要发送游戏的帐号密码
[空白_录音] 获得
Master Server IP 后,Unity 客户端连接 Master Server 请求 Master Server
的游戏大厅列表,Master Server 接收到请求以后,将游戏大厅列表发送给 Unity
客户端 Master Server 可以包含多个游戏大厅
每个游戏大厅可以包含多个游戏房间 Unity 客户端可以选择进入某个游戏大厅
在这个游戏大厅中创建新的游戏房间,或者加入已有的游戏房间 Unity
客户端将创建或者加入游戏房间的请求发送给 Master Server Master Server
获得请求后,将管理该游戏房间的 Game Server 地址发送给 Unity 客户端
Game Server 管理游戏房间内的信息传递
Unity 客户端向 Game Server 发送游戏数据 Game Server
对游戏数据进行认证、 处理 把处理的结果发送给游戏房间内所有的
Unity 客户端 实现 Unity 客户端之间的信息传递。
通常情况下 Photon 服务器包含多个 Game Server,管理不同游戏房间内的信息传递
下面我们演示 Unity 客户端连接 Photon 服务器的流程
首先新建 Unity 项目,导入 Photon Unity Networking
的资源包 [空白_录音] 其次选中 Project
视图中的 PhotonServerSettings 文件 在 Inspector 视图中设置 PUN
的连接配置 下面介绍 PhotonServerSettings
的 Hosting 属性 该属性表示 Photon
服务器托管方式,它包含五个可选属性 Not Set 表示未设置
Photon 服务器的连接方式 Unity 客户端无法连接到 Photon
服务器;Photon Cloud 表示使用 Photon 云端的 Photon
服务器,Exit 公司在全球范围内部署了多个 Photon 云端的服务器 供 Photon
开发者使用;Self Hosted 表示开发者可以自己搭建的
Photon 服务器 Offline Mode 表示离线模式,任何与
Photon 网络通信相关的函数就被忽略 Best Region
表示最佳云端区域 Unity 客户端会尝试连接所有的 Photon
云端服务器 最终选择网络连接状态最佳的 Photon 云端服务器 本门课程中,我们讲解
Photon Cloud 和 Self Hosted 服务器托管模式 下面介绍
Self Hosted 连接配置
Server Address 表示 Photon 服务器的地址;Server Port 表示
Photon 服务器端口号 Protocol 表示使用的传输层协议,可以选择 TCP
或UDP AppId 表示 Photon 帐户的应用 Id Auto-Join Lobby
表示是否自动加入大厅 [空白_录音]
下面我们在本地部署 Photon 服务器,方便打开 PhotonControl 可执行程序
PhotonControl 启动后,我们在系统托盘右键点击 PhotonControl
的图标 在打开的菜单中,选择 LoadBalancing 的 Start as application
PhotonControl 开始运行 Photon 服务器。
在 PhotonControl 右键菜单中,点击 Game Server IP Config 中的 Set Local IP
选项 设置服务器的 IP,在 Unity 客户端的 PhotonServer Settings
中,我们将服务器 IP 添入 Server Address 属性中 完成 Set Hosting
方式的服务器连接设置 下面介绍 Photon Cloud
的连接配置 Photon Cloud 不需要配置 Photon 服务器的
IP 地址和端口 只需要设置 Region 属性,该属性表示 Photon
云端服务器的区域 完成 PhotonServerSettings 的设置后
我们介绍如何使用 Unity 客户端脚本连接 Photon 服务器 我们在 Unity
客户端创建 C# 脚本,重命名为 PhotonConnection 下面讲解
PhotonConnection 脚本
该脚本使用 Photon 命名空间,继承 PunBehaviour 类 我们使用
string 类型的字段 temp 保存网络连接状态 在 Console
控制台视图中输出网络连接状态 在 Start 函数中,我们使用 PhotonNetwork.
ConnectUsingSettings 连接 Photon 服务器 在
PhotonConnection 脚本中
我们覆写 PUN 的 OnConnectedToMaster 回调函数 该回调函数在 Unity 客户端连接到
Master Server 时被调用 OnConnectedToMaster 函数调用
PhotonNetwork.JoinLobby Unity 客户端进入默认游戏大厅
我们覆写 PUN 的 OnJoinedLobby 回调函数 该函数在
Unity 客户端进入大厅时被调用 OnJoinedLobby 函数调用
PhotonNetwork.CreateRoom 创建并进入房间
接下来我们把 PhotonConnection
脚本 绑定到场景的任一游戏对象上
最后点击预览游戏按钮 运行 Unity
客户端,测试 Photon 服务器连接,在预览游戏过程中 控制台试图显示
Unity 客户端的网络连接状态的变化情况 下面我们介绍
PUN 的网络连接状态 PeerCreated 表示
Unity 客户端未连接 Photon 服务器 ConnectingToNameServer
表示正在连接 Photon 服务器的 NameServer Authenticating 表示
Photon 服务器正在认证 Unity 客户端的请求 ConnectingToMasterserver
表示 Unity 客户端已经通过 NameServer 认证 获得游戏的 MasterServer
地址,Unity 客户端正在连接 MasterServer ConnectedToMaster
表示 Unity 客户端已成功连接 MasterServer Unity 客户端连接
MasterServer 后 执行回调函数 OnConnectedToMaster
该函数调用 PhotonNetwork.JoinLobby 函数 Unity
客户端进入游戏大厅,网络连接状态变为 JoinedLobby Unity
客户端进入游戏大厅后 执行回调函数
OnJoinedLobby,PhotonNetwork.CreateRoom 函数
Unity 客户端创建并进入游戏房间,在创建、
进入游戏房间的过程中 Unity 客户端的网络连接状态多次发生变化,首先是
ConnetingToGameServer 表示 Unity 客户端正在连接管理该游戏房间的
GameServer 其次是 Authenticating,表示 Photon
服务器正在认证 Unity 客户端的请求 接着是 Joining,表示 Unity
客户端正在创建或者加入游戏房间 最后是 Joined,表示 Unity
客户端已经加入游戏房间 [空白_录音]
如果 Unity 客户端在上述任一阶段断开与 Photon 服务器的连接
客户端显示 PeerCreated 的状态
下一节我们对 PUN 的常用类进行介绍