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
}





大家还有什么问题,欢迎在下方留言!


在这里插入图片描述
如果你有 技术的问题 项目开发

都可以加下方联系方式

和我聊一聊你的故事🧡

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值