使用Photon Engine完善你的在线游戏-1

发布于 2023-06-30  134 次阅读


简介

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