简介
Photon引擎是一款实时的Socket服务器和开发框架,快速、使用方便、容易扩展。
服务端架构在windows系统平台上,采用C#语言编写。
客户端SDK提供了多种平台的开发API,包括DotNet、Unity3D、C/C++以及ObjC等。
Photon引擎的体系特性如下:
1、架构于Windows平台下原生态性能高度优化的系统
2、经过证明适用于众多的商业游戏
3、由Exit Games提供迅捷到位的支持
4、服务器端游戏逻辑采用C#语言实现
5、支持广泛的框架设计,能帮助您处理常见的工作内容
6、简单易扩展的远程方法调用
7、采用纤程处理消息机制避免采用线程导致的问题
8、提供基于room游戏的基本应用Lite,方便原型开发
9、部署简单,支持云端服务
10、充分利用网络带宽
11、采用小尺寸的二进制协议,可根据需要使用有序可靠的UDP
12、直接支持常见的客户端平台,提供相同的工作流程
13、封装每个客户端平台的网络层模块
14、通信跨平台
15、使用Dictionary发送数据,无需担心数据序列化反序列化
简单而言,就是你可以将服务端的同步实现全部交给它!通过简单调用API即实现多人在线游戏!
注册账户/应用
https://www.photonengine.com/zh-cn#
注册完毕后你可以在仪表盘页面看到自己的应用和 AppID
https://dashboard.photonengine.com/zh-cn

申请中国区光子云
此时,我们需要做另外一件事情, 打开 https://vibrantlink.com/chinacloudapply/
这是光子的中国区申请,填写你的应用AppID及你注册的光子账号。
后续我们就能用CN区去连接游戏服务器,飞快!
通过时通常两天会邮件回复你的!

上述步骤 是必须做的! 这个是必须做的! 否则之后在开发和调试的时候非常麻烦 连JP和KR区时好时不好。
从Asset Store下载安装依赖包
https://assetstore.unity.com/packages/tools/network/pun-2-free-119922

就是👆这个,下载后在Unity打开并导入!
配置项目

通过SetupProject ,然后将你申请到的Appid填写到相应位置
Wizard位置 Window -> Photon Unity Networking -> PUN Wizard

将你的AppiD 填入 App id PUN
Server Settings 文件的位置:

测试连接服务
创建一个空物体,创建一个脚本,空物体挂在此脚本
奉上示例脚本
using Photon.Pun;
using Photon.Realtime;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestNet : MonoBehaviourPunCallbacks
{
// 自定义的大厅
private TypedLobby customLobby = new TypedLobby("lobby1", LobbyType.SqlLobby);
private void Awake()
{
// 通过刚才配置完Appid的文件连接光子云
PhotonNetwork.ConnectUsingSettings();
}
// 连上服务器啦
public override void OnConnectedToMaster()
{
Debug.Log("已连接上Master");
//PhotonNetwork.JoinLobby(customLobby);//加入大厅
Debug.Log("加入大厅成功");
}
// 与服务器的链接断开
public override void OnDisconnected(DisconnectCause cause)
{
base.OnDisconnected(cause);
Debug.LogError($"OnDisconnected!.{cause}");
}
// 开始匹配
public void StartMatch()
{
PhotonNetwork.JoinRandomRoom();
}
// 获取所有房间列表
public void GetRoomList()
{
// 根据大厅筛选房间,不同大厅有不同房间噢!
bool isRight = PhotonNetwork.GetCustomRoomList(customLobby, "C0 = 'yes'");
// 上述方法运行后,OnRoomListUpdate 会接受到回调!
Debug.LogWarning($"is RIght: {isRight}");
}
// 当房间列表更新时
public override void OnRoomListUpdate(List<RoomInfo> roomList)
{
Debug.LogWarning("roomListUpdated!");
// 你可以遍历更新到的房间列表,去做一些事情 -_-
foreach (var r in roomList)
{
// 下三种类型属于房间关闭/不可用/已移除状态
if (!r.IsOpen || !r.IsVisible || r.RemovedFromList)
{
}
}
}
// 当你加入房间失败的时候,这个方法回调会进入
public override void OnJoinRandomFailed(short returnCode, string message)
{
RoomOptions roomOptions =
new RoomOptions { MaxPlayers = 2, IsOpen = true };//房间最大人数4人
//加入房间失败,创建房间,设置房间名称和加入的最大玩家数量
PhotonNetwork.CreateRoom("1", roomOptions);
Debug.Log("加入房间失败,正在创建房间...");
}
// 创建房间成功时 方法会被回调,你可以做些什么,或啥都不做
public override void OnCreatedRoom()
{
base.OnCreatedRoom();
Debug.Log("成功创建房间...");
}
// 创建房间失败时候,这个方法回调会进入
public override void OnCreateRoomFailed(short returnCode, string message)
{
Debug.LogErrorFormat("房间创建失败 code {0} and error message {1}", returnCode, message);
}
// 成功加入房间后进入的回调
public override void OnJoinedRoom()
{
base.OnJoinedRoom();
Debug.Log("成功加入房间...");
// 通常在这里显示一下房间内的ui 玩家等
// 自动同步场景 跟随房主
PhotonNetwork.AutomaticallySyncScene = true;
}
// 当别的玩家加入房间时的回调
public override void OnPlayerEnteredRoom(Player newPlayer)
{
base.OnPlayerEnteredRoom(newPlayer);
Debug.Log($"玩家{newPlayer}加入了房间...");
int playerNum = PhotonNetwork.PlayerList.Length;
Debug.Log($"房间内的玩家{playerNum}");
// 如果我是房主,如果玩家满足两人了! 那就自动开启游戏
if (playerNum == 2 && PhotonNetwork.IsMasterClient)
{
PhotonNetwork.LoadLevel("Game");// 加载你的场景 (PhotonNetwork.AutomaticallySyncScene时,其他玩家也会跟着你同时加载scene)
}
}
// 连接成功
public override void OnConnected()
{
base.OnConnected();
Debug.Log("OnConnected...");
}
}
运行游戏你就可以看到它正常连接到服务器了

中国区的申请如果通过,可以修改配置文件到CN了!
修改方式:

填写 Fixed Region : CN
Server: ns.photonengine.cn
Comments | NOTHING