前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >PUN☀️三、服务器大厅、服务器房间

PUN☀️三、服务器大厅、服务器房间

作者头像
星河造梦坊官方
发布2024-08-15 21:06:33
发布2024-08-15 21:06:33
10500
代码可运行
举报
运行总次数:0
代码可运行

🟥 目标

1、点“开始连接”,进入房间

2、将你的用户名发送到PUN,实现同步

类似游戏中能看到其他用户名字

3、点击开始连接,开始连接隐藏,出现正在连接中的字样。

🟧 开发过程

1️⃣ Unity界面

a、界面

完成目标中UI的设置与逻辑。代码自行编写。

b、脚本绑定

实现点击“开始连接”,进入房间。

  • 开始连接按钮,绑定 Launcher 脚本的 Skode_JoinRoom

2️⃣ 用户名同步

告诉PUN你的名字,用于后面进行显示。

  • 下脚本挂载到任意物体上,给该脚本绑定输入框
  • 输入框的OnEndEdit,绑定该脚本动态(Dynamic string)的SetPlayerName方法
代码语言:javascript
代码运行次数:0
运行
复制
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
 
public class PlayerNameInputField : MonoBehaviour
{
    #region  Parameters
 
    public InputField inputField;
 
    const string playerNamePrefKey = "PlayerName";
    string defaultName = string.Empty;
 
    #endregion
 
 
    #region Mono CallBacks
 
    void Start()
    {
        if (inputField != null)
        {
            if (PlayerPrefs.HasKey(playerNamePrefKey))
            {
                defaultName = PlayerPrefs.GetString(playerNamePrefKey);
                inputField.text = defaultName;
            }
        }
 
        PhotonNetwork.NickName = defaultName;
    }
 
    #endregion
 
 
    #region Public Methods
 
    //设置玩家的名字,并将其保存在PlayerPrefs中以备将来使用。
    //在OnEndEdit绑定动态
    public void SetPlayerName(string value)
    {
        if (string.IsNullOrEmpty(value))
        {
            Debug.LogError("输入框应输入玩家名字");
            return;
        }
 
        PhotonNetwork.NickName = value;
 
        PlayerPrefs.SetString(playerNamePrefKey, value);
    }
 
    #endregion
}

3️⃣ 点击开始连接后,开始连接隐藏

注意:在连接服务器失败OnDisconnected() 时,显示开始连接和输入名字:

Launcher最终代码:

代码语言:javascript
代码运行次数:0
运行
复制
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
 
public class Launcher : MonoBehaviourPunCallbacks
{
    #region  Parameters
 
    [Tooltip("连接服务器失败后要显示的物体")]
    public GameObject[] failedShow;
 
    //此客户端的版本号。用户之间通过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);
 
        for (int i = 0; i < failedShow.Length; i++)
        {
            failedShow[i].SetActive(true);
        }
    }
 
    // 加入房间成功回调
    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
}

🟨 服务器房间设置

那么,我们来想一下:

  • 我们建好房间了,可想更改房间参数,更改房间最大人数,怎么办呢?
  • 以及更改了,有没有回调啊?
  • 加入随即房间时,能不能自动筛选房间啊?

🚩服务器房间属性

完成服务器房间属性、自定义属性的设置、更改。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🟥 目标
  • 🟧 开发过程
    • 1️⃣ Unity界面
    • 2️⃣ 用户名同步
    • 3️⃣ 点击开始连接后,开始连接隐藏
  • 🟨 服务器房间设置
    • 🚩服务器房间属性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档