1.Photon引擎
Photon Unity Network(PUN)
Photon Server技术
2.Photon引擎简介
Photon引擎隶属于Exit Games公司,是世界著名独立网络引擎和多人通信平台,适用于独立开发者和专业工作室
Photon引擎具有通信快速、高可靠性、使用方便、容易扩展等优点
Photon引擎包括Photon服务器,以及面向多种游戏开发工具的客户端SDK
3.Photon服务器
Photon服务器是一款工业级别的服务器,核心使用C++语言实现
允许开发者使用C#语言,自定义Photon服务器逻辑
支持多种模式的网络游戏,如MOBA、MMO
4.Photon服务器的部署选择
Photon Server(本地)
Photon Cloud(云端)
5.Photon客户端
Photon引擎针对各个平台,提供了对应的客户端SDK
游戏引擎:Unity(Unity 3D SDK、Photon Unity Networking)、Unreal、Cocos2d-x
客户端平台:Windows、Linux、Android
Photon Unity Networking(PUN):针对Unity平台开发的一款网络插件,用于开发Unity客户端程序
6.PUN以及PhotonServer的下载和配置
向Unity项目中导入PUN插件,在Asset Store中下载导入(只有Unity2018.4.22或更高版本才能在Asset Store中下载)
![](https://img-blog.csdnimg.cn/img_convert/d98a908c027021b212501a7d636c115e.png)
导入PUN之后,会出现下图这样的窗口,让你输入AppId或者Email,这里我们先关闭该窗口,后面再进行配置
![](https://img-blog.csdnimg.cn/img_convert/2526fa1cd978ae277538abd2e8d10206.png)
导入完成后,Project视图中Assets文件夹下会多出下图文件
![](https://img-blog.csdnimg.cn/img_convert/21790800fc6b63cca5c320f49273f724.png)
去Photon引擎官网注册账号(官网:https://www.photonengine.com/zh-cn),注册完成后,在Dashboard下点击CREATE A NEW APP
![](https://img-blog.csdnimg.cn/img_convert/ac045bdf38b67964e47f433f701d0619.png)
其它内容不用改变,Application Name可随便写,Description和URL可写可不写,然后点击Create按钮,进行创建即可
![](https://img-blog.csdnimg.cn/img_convert/cb109801e6f5728167cf65fbc27dedb0.png)
创建完成后,复制AppID,回到Unity的AppId中
![](https://img-blog.csdnimg.cn/img_convert/1c6ee99dd82a85dc2237e46e167b01aa.png)
![](https://img-blog.csdnimg.cn/img_convert/960aaf96ede7fa5a232a68bb859d1875.png)
![](https://img-blog.csdnimg.cn/img_convert/0bcfa981a4f92e4df733ae8705eaecdb.png)
![](https://img-blog.csdnimg.cn/img_convert/4b7080ffed65182a2746653b03fa6d6c.png)
下载Photon Server:PhotonEngine SDKs | Photon Engine,不挂梯子的话很难下载,可以多试几次
![](https://img-blog.csdnimg.cn/img_convert/ea72c4250c7fd373b4b60cc92c7c3704.png)
![](https://img-blog.csdnimg.cn/img_convert/5e6a65d5b283b27fbed2dab4b070c6f5.png)
Photon Server下载完成后,执行它的安装程序,完成Photon Server的安装(可自行百度),在Photon-OnPremise-Server-SDK_v4-0-29-11263\deploy\bin_Win64目录下双击PhotonControl.exe,电脑右下角的任务栏中,右击,选择LoadBalancing(MyCloud)->Start as application,如果没有启动成功,可以查阅:https://blog.csdn.net/qq_28936845/article/details/57412661
![](https://img-blog.csdnimg.cn/img_convert/3404185fd3af6dd2b6f846aec32b5822.png)
查看是否启动成功,可以点击Open Logs查看日志,下图是已经成功启动的
![](https://img-blog.csdnimg.cn/img_convert/6f14160bd7120c644a11272dfa9d33fb.png)
复制Current IP到Unity的Server Address
![](https://img-blog.csdnimg.cn/img_convert/828957c21f606ea94d32ca2594069b7f.png)
![](https://img-blog.csdnimg.cn/img_convert/b3982b5aac5869bb163a00ee6a81f4a2.png)
Hosting(服务器托管方式):Not Set(未设置)、Photon Cloud(Photon云端)、Self Hosted(自己搭建的服务器)、Offline Mode(离线模式)、Best Region(最佳云端区域)
Server Address:Photon服务器地址
Server Port:Photon服务器端口号
Protocol:传输层协议选择(TCP、UDP)
AppId:Photon账号的应用Id
Auto-Join Lobby:是否自动加入大厅
7.PUN的C/S架构之基本连接流程
![](https://img-blog.csdnimg.cn/img_convert/8824c2a7aa220ea3d96c7eeaeb1c4758.png)
![](https://img-blog.csdnimg.cn/img_convert/20cc53884c864e2a4549fe7145d9a6da.png)
将下面脚本挂载到场景物体后,回到unity并运行查看控制台打印的信息
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon;
public class PhotonConnection : PunBehaviour
{
// 记录网络连接状态
private string temp;
private void Start()
{
// 初始时,打印网络连接状态
temp = PhotonNetwork.connectionStateDetailed.ToString();
Debug.Log(temp);
// 连接Photon服务器
PhotonNetwork.ConnectUsingSettings("1.0");
}
private void Update()
{
// 连接状态发生改变是;打印log日志
if (temp != PhotonNetwork.connectionStateDetailed.ToString())
{
temp = PhotonNetwork.connectionStateDetailed.ToString();
Debug.Log(temp);
}
}
//覆写PUN回调函数,当Unity客户端连接到MasterServer时调用,进入默认游戏大厅
public override void OnConnectedToMaster()
{
PhotonNetwork.JoinLobby();
}
//覆写PUN回调函数,当Unity客户端加入大厅时调用,在大厅中创建房间并进入该房间
public override void OnJoinedLobby()
{
PhotonNetwork.CreateRoom("");
}
}
![](https://img-blog.csdnimg.cn/img_convert/1ed88981bfae0b640dbd93345d0d1d95.png)
上面网络连接状态的含义:
PeerCreated:Unity客户端未连接Photon服务器
ConnectingToMasterserver:Unity客户端从NameServer获得本网络游戏的MasterServer地址,开始连接MasterServer
Authenticating:Photon服务器正在认证Unity客户端的请求
Authenticated:Unity客户端已连接MasterServer,此时会执行回调函数OnConnectedToMaster()
JoinedLobby:Unity进入游戏大厅,执行回调函数OnJoinedLobby()
ConnectingToGameserver:Unity客户端开始连接管理该游戏房间的GameServer
ConnectedToGameserver:Unity客户端成功连接GameServer
Joining:客户端正在创建或者加入游戏房间
Joined:客户端已经加入游戏房间
注:如果Unity客户端在上述任意阶段断开与Photon服务器的连接,会回到PeerCreated状态
8.PUN常用类的说明
(1)IPunCallback:PUN在这个接口中,定义了许多与Photon网络连接相关的回调函数。网络连接状态发生变化时,游戏客户端会调用这些回调函数
(2)PunBehaviour:
![](https://img-blog.csdnimg.cn/img_convert/1edef2f9d04f14eea204c6cfb442a663.png)
(3)PhotonNetwork:是PUN中的静态类,包含了用于向Photon服务器发送请求的函数,以及保存了玩家信息的属性
PhotonNetwork.ConnectUsingSettings():连接Photon服务器
PhotonNetwork.JoinLobby():在MasterServer加入游戏大厅
PhotonNetwork.CreateRoon():在游戏大厅中创建游戏房间
PhotonNetwork.LeaveRoom():从游戏房间返回游戏大厅
PhotonNetwork.Instantiate():创建客户端控制的游戏对象
PhotonNetwork.room():客户端进入的游戏房间
PhotonNetwork.player():客户端玩家信息
(4)PhotonPlayer:表示Photon网络通信中的玩家
PhotonPlayer.ID:玩家的ID,由Photon服务器分配
PhotonPlayer.name:玩家的昵称,玩家可以自己设定昵称
PhotonPlayer.isLocal:该玩家是否为本地客户端的玩家
PhotonPlayer.customProperties:玩家的自定义属性
(5)PhotonView:管理游戏房间内客户端之间的通信
(6)RoomInfo:游戏房间的属性
(7)ServerSettings:服务器设置
(8)TypedLobbyInfo:游戏大厅的属性信息
(9)……………..
结语:合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。