PUN☀️一、基础配置、搭建大厅程序

简介: PUN☀️一、基础配置、搭建大厅程序

🟥 前言

PUN作用: 搭建多人 在线 / 局域网 网络游戏

使用的版本: Unity2017.4.7+、PUN 2 - FREE

Appid配置网址: PUN

中国区官网: 中国区官网

教程参考地址: 地址

20190826补

Photon逻辑顺序

连接到服务器——加入某房间——主客户端加载场景。类似LOL自定义模式

:PUN会根据统一的版本号、Appid,加入主客户端的房间,使所有客户端加载同一个场景


🟧 Appid配置

作用:PUN会根据Appid和版本号,确认你们属于同一个应用。

配置网址传送门

导入SDK后出现提示框:



🚩如果你以前在PUN网页上配置过:

你可以直接输入你申请的Appid,点Setup Project;或Skip跳过,选择Project里的PhotonServerSettings,将配置好的Appid填入该位置。


🚩若你是第一次使用:

则填入你的邮箱,点Setup Project,会出现注册、进入他们网站之类的。

完成注册后,创建Pthton PUN的应用,根据a做即可。

查看Photon全部日志信息

日志信息改为Full,可查看Photon全部日志信息。


🟨 连接地区设置

PUN默认连接海外云服务器。想用中国区服务器,就要进行如下配置:

1️⃣ 获得中国区Appid

🚩进入中国区官网:中国区官网

🚩点击试用购买——申请免费中国区光子云——把创建好的Appid复制进去,提交

注意:该Appid未填入申请中国区时,仍是海外区Appid。当申请后就变成中国区的了。所以Appid可多创建几个,一个用于中国区,一个海外。


2️⃣ 程序设置

使用中国区Appid需要进行以下程序设置:

🚩LoadBalancingClient 脚本:

public string NameServerHost = “ns.exitgames.com”;

改为:

public string NameServerHost = “ns.photonengine.cn”;

🚩Unity 的 PhotonServerSettings——Fixed Region填入 CN

20210320测试:

现在不许输入 CN ,输入反而连接不上

**注意:**若用海外的服务器,则LoadBalancingClient脚本不用改,不用填CN,Appid用海外的即可。


🟩 搭建大厅

实现连接到服务器。

1️⃣ 场景及连接脚本

1、创建新场景

2、新建空物体,将如下代码挂上去

using UnityEngine;
using Photon.Pun;
 
public class Launcher : MonoBehaviour
{
    //此客户端的版本号。用户之间通过gameVersion(允许你做出破坏性的改变)进行隔离。
    string gameVersion = "1";
 
    void Awake()
    {
        // 这确保我们可以在主客户端和同一房间的所有客户端上使用photonnet . loadlevel()自动同步它们的级别
        PhotonNetwork.AutomaticallySyncScene = true;
    }
 
    void Start()
    {
        ConnectServer();
    }
 
    //连接到服务器
    public void ConnectServer()
    {
        // 检查是否连接了服务器
        if (!PhotonNetwork.IsConnected)
        {
            //首先连接到光子在线服务器。
            PhotonNetwork.GameVersion = gameVersion;
            PhotonNetwork.ConnectUsingSettings();
        }
    }
}


2️⃣ 查看初步结果

1、因为我们现在刚申请了中国区服务器,客服会在1-2工作日完成配置,现在还没配置好,所以我们现在如果使用中国区服务器Unity会报错。

所以我们暂且使用海外服务器,不用填CN,LoadBalancingClient脚本不用改,Appid用海外的即可。

2、运行,即可看到成功输出信息了


3️⃣ 利用加入服务器成功的回调,实现加入服务器房间

PUN连接顺序:

连接服务器–加入房间

此时的代码,只实现了加入服务器,没写加入到服务器房间的逻辑。

我们也不能将加入房间的代码直接放在进行连接之后,因为连接服务器也需要时间,直接加入房间不可能成功。

所以我们要用回调加入房间。以下提供的两种方法,建议方法2。

🚩 方法1:IConnectionCallbacks

a、 继承IConnectionCallbacks并实现接口(里面有连接回调接口)

b、 OnConnected连接回调接口改为:

public void OnConnected()
        {
            PhotonNetwork.JoinRandomRoom();
        }


🚩方法2:MonoBehaviourPunCallbacks(推荐)

改为继承MonoBehaviourPunCallbacks。可增加如下回调:

#region Pun Callbacks
 
    // 连接服务器成功回调
    public override void OnConnectedToMaster()
    {
        PhotonNetwork.JoinRandomRoom();
    }
 
    //连接服务器回调
    public override void OnDisconnected(DisconnectCause cause)
    {
        Debug.LogWarningFormat("OnDisconnected() was called by PUN with reason {0}", cause);
    }
 
    // 加入房间成功回调
    public override void OnJoinedRoom()
    {
        Debug.Log("OnJoinedRoom");
    }
 
    //加入房间失败回调
    public override void OnJoinRandomFailed(short returnCode, string message)
    {
        Debug.Log("we failed to join a random room, maybe none exists or they are all full. No worries, we create a new room.");
 
        PhotonNetwork.CreateRoom(null, new RoomOptions());
    }
 
    #endregion

现在我们测试,发现已经加入房间成功了



4️⃣ 设置房间连接人数

设置一个房间的连接人数

[Tooltip("最大连接人数")]
    public byte maxPlayersPerRoom = 4;
 
    //加入房间失败回调
    public override void OnJoinRandomFailed(short returnCode, string message)
    {
        Debug.Log("we failed to join a random room, maybe none exists or they are all full. No worries, we create a new room.");
 
        PhotonNetwork.CreateRoom(null, new RoomOptions { MaxPlayers=maxPlayersPerRoom});
    }

最终代码

using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
 
public class Launcher : MonoBehaviourPunCallbacks
{
    #region  Parameters
 
    //此客户端的版本号。用户之间通过gameVersion(允许你做出破坏性的改变)进行隔离。
    string gameVersion = "1";
 
    [SerializeField]
    [Tooltip("最大连接人数")]
    byte maxPlayersPerRoom = 4;
 
    bool isPressPlay = false;
 
    #endregion
 
 
    #region Mono CallBacks
 
    void Awake()
    {
        // 这确保我们可以在主客户端和同一房间的所有客户端上使用photonnet . loadlevel()自动同步它们的级别
        PhotonNetwork.AutomaticallySyncScene = true;
    }
 
    void Start()
    {
        ConnectServer();
    }
 
    #endregion
 
 
    #region Public Method
 
    //绑定到开始连接上:连接到服务器房间
    public void Skode_JoinRoom()
    {
        isPressPlay = true;
 
        //若还未连接服务器,则先连接服务器,再加入房间
        if (!PhotonNetwork.IsConnected)
            ConnectServer();
        else
            LoadRoom();
    }
 
    #endregion
 
 
    #region Private Methods
 
    //连接到服务器
    void ConnectServer()
    {
        // 检查是否连接了服务器
        if (!PhotonNetwork.IsConnected)
        {
            //首先连接到光子在线服务器。
            PhotonNetwork.GameVersion = gameVersion;
            PhotonNetwork.ConnectUsingSettings();
        }
    }
 
    void LoadRoom()
    {
        PhotonNetwork.JoinRandomRoom();
    }
 
    void LoadScene()
    {
        PhotonNetwork.LoadLevel("Room for " + PhotonNetwork.CurrentRoom.PlayerCount);
    }
 
    #endregion
 
 
    #region Pun Callbacks
 
    // 连接服务器成功回调
    public override void OnConnectedToMaster()
    {
        if (isPressPlay)
            LoadRoom();
    }
 
    //连接服务器失败回调
    public override void OnDisconnected(DisconnectCause cause)
    {
        Debug.LogWarningFormat("OnDisconnected() was called by PUN with reason {0}", cause);
    }
 
    // 加入房间成功回调
    public override void OnJoinedRoom()
    {
        //主客户端加载场景即可。其他客户端进入房间后,会自动加载主客户端的场景
        if (PhotonNetwork.IsMasterClient)
            LoadScene();
    }
 
    //加入房间失败回调
    public override void OnJoinRandomFailed(short returnCode, string message)
    {
        Debug.Log("we failed to join a random room, maybe none exists or they are all full. No worries, we create a new room.");
 
        //创建房间后,会自动加入房间。从而触发加入房间成功的回调。
        PhotonNetwork.CreateRoom(null, new RoomOptions { MaxPlayers = maxPlayersPerRoom });
    }
 
    #endregion
}


相关文章
|
3月前
|
图形学
PUN☀️三、服务器大厅、服务器房间
PUN☀️三、服务器大厅、服务器房间
|
6月前
|
小程序 JavaScript Java
基于微信小程序的自驾游拼团小程序的设计与实现(源码+lw+部署文档+讲解等)
基于微信小程序的自驾游拼团小程序的设计与实现(源码+lw+部署文档+讲解等)
|
6月前
|
JavaScript Java 测试技术
基于Java的家乡特产网上商城的设计与实现(源码+lw+部署文档+讲解等)
基于Java的家乡特产网上商城的设计与实现(源码+lw+部署文档+讲解等)
39 0
|
6月前
|
小程序 数据安全/隐私保护
基于小程序的校园二手交易系统设计与实现(源码+lw+部署文档+讲解等)
基于小程序的校园二手交易系统设计与实现(源码+lw+部署文档+讲解等)
280 0
|
程序员 Swift
谁说程序员不懂浪漫,教你使用SwiftUI搭建一个电子相册送给她吧~
谁说程序员不懂浪漫,教你使用SwiftUI搭建一个电子相册送给她吧~
188 0
|
前端开发 Java 数据库
SpringBoot日记本系统全程直播01:先把框架搞起来撒~~
SpringBoot日记本系统全程直播01:先把框架搞起来撒~~
130 0
|
小程序 定位技术 API
幼儿园小程序实战开发教程(终篇)
幼儿园小程序实战开发教程(终篇)
幼儿园小程序实战开发教程(终篇)
|
存储 编译器 C++
类的入门<C++入门>(跑路人笔记)(3)
类的入门<C++入门>(跑路人笔记)
类的入门<C++入门>(跑路人笔记)(3)
|
存储 编译器 C语言
类的入门<C++入门>(跑路人笔记)(1)
类的入门<C++入门>(跑路人笔记)
类的入门<C++入门>(跑路人笔记)(1)