【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用

2023-11-05 00:50

本文主要是介绍【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【Unity工具,简单学习】PUN 2,多人在线网络工具

  • 前言
    • 简单介绍
    • 安装
  • 简单使用
    • 一些 nomenclature 部分
    • 连接到 Server
    • 设置简单的大厅UI
    • 游戏场景搭建
    • 关卡加载
    • 事后

前言

  • 链接
    在这里插入图片描述

简单介绍

  • PUN 可以让你简单地开发多人游戏,在全球范围推出
    让开发者不用管托管、链接和延迟
    支持移动端、台式、一些主机
    全球范围内低延迟
    始终连接,无需穿透
  • 免费20 CCU(Concurrent User, 并发用户)
    支持 Unity 2019 - 2022

安装

  • 安装包,输入邮箱来注册,或输入Appid来登录。
    在这里插入图片描述
  • 输入邮箱后,发来确认邮件。点击链接,输入密码来注册新的 Photon 账号。顺带会给你 appID
    Photon链接
    在这里插入图片描述

简单使用

  • 官方教程 (英文)
    博主主要是从上述教程中学习。

一些 nomenclature 部分

  • 其中用到了 Photon Cloud,内有很多运行 Photon Server 的机子。
    Client 先连接到 Name Server,然后检查 AppId,知道要去哪个 region,然后去对应的 Master Server
    Master Server 是管理区域服务器的 hub,它让 Client 去到某个 Game Server
  • 只有相同 AppId 的玩家可以相互看到对方
    还有 Game Version 字符串,阻隔旧版本与更新版本的玩家
  • Region 是一个个有序分开的区域,在全球范围内分布,为了玩家之间更好的连接
    不同区域之间相互分离
  • RoomPhoton Cloud 是以房间为基础的游戏,每个配对只有优先的玩家(16人上限)
    房间内的每个人接受其他人发送的任何公有信息
    在两个房间内的玩家无法交流
    最好的进入房间的方法是使用 Random Matchmaking,询问 server 任意一个房间,或指明一些玩家希望的额外属性
    每个房间都有一个名字,也叫标识符 identifier,除非房间满了或关闭了,都可以通过名字加入房间
    Master Server 可以提供房间的列表
  • Lobby:在 Master Server 上,列出游戏中的所有房间,但是玩家之间不能相互交流

连接到 Server

  • 点击 Window -> Photon Unity Networking -> Highlight Server Settings
    点开下面的 asset 文件,右侧 PUN Logging 选择 Full
    在这里插入图片描述
  • 新建一个 Launcher 脚本,如下
  • 注意头文件为 using Photon.Pun
    注意可能会有重名脚本,可以自行添加命名空间等方法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
public class Launcher : MonoBehaviour
{private string gameVersion = "1";void Awake(){// Then let master server can use PhotonNetwork.LoadLevel()// Everyone will see the same levelPhotonNetwork.AutomaticallySyncScene = true;}void Start(){Connect();}public void Connect(){if (PhotonNetwork.IsConnected){PhotonNetwork.JoinRandomRoom();}else{PhotonNetwork.ConnectUsingSettings();PhotonNetwork.GameVersion = gameVersion;}}
}
  • 在场景中,添加空节点,挂载该脚本,运行后:
    在这里插入图片描述
  • 这貌似是成功了。

设置简单的大厅UI

  • 修改之前的 Launcher 脚本,让他继承自 MonoBehaviourPunCallbacks
    重载一些基本函数,设置加载时显示/关闭UI元素
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
using Photon.Realtime;public class Launcher : MonoBehaviourPunCallbacks
{private string gameVersion = "1";[SerializeField]private byte maxPlayersPerRoom = 4;[SerializeField]private GameObject controlPanel;[SerializeField]private GameObject progressLabel;void Awake(){// Then let master server can use PhotonNetwork.LoadLevel()// Everyone will see the same levelPhotonNetwork.AutomaticallySyncScene = true;progressLabel.SetActive(false);controlPanel.SetActive(true);}public void Connect(){progressLabel.SetActive(true);controlPanel.SetActive(false);if (PhotonNetwork.IsConnected){PhotonNetwork.JoinRandomRoom();}else{PhotonNetwork.ConnectUsingSettings();PhotonNetwork.GameVersion = gameVersion;}}public override void OnJoinRandomFailed(short returnCode, string message){Debug.Log("PUN Basics Tutorial/Launcher:OnJoinRandomFailed() was called by PUN. No random room available, so we create one.\nCalling: PhotonNetwork.CreateRoom");// #Critical: 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 });}public override void OnJoinedRoom(){Debug.Log("PUN Basics Tutorial/Launcher: OnJoinedRoom() called by PUN. Now this client is in a room.");}public override void OnConnectedToMaster(){Debug.Log("PUN Basics Tutorial/Launcher: OnConnectedToMaster() was called by PUN");PhotonNetwork.JoinRandomRoom();}public override void OnDisconnected(DisconnectCause cause){progressLabel.SetActive(false);controlPanel.SetActive(true);Debug.LogWarningFormat("PUN Basics Tutorial/Launcher: OnDisconnected() was called by PUN with reason {0}", cause);}
}
  • 新建 PlayerNameInput 脚本,来修改玩家的名字
    PPK 是我自己写的脚本,你可以直接用 PlayerPrefs.GetString 之类的替换。
    作用是防止键名 typo
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;[RequireComponent(typeof(InputField))]
public class PlayerNameInput : MonoBehaviour
{void Start(){string defaultName = string.Empty;InputField _inputfield = GetComponent<InputField>();if (_inputfield != null){defaultName = PPK.GetString(PPK.playerName);_inputfield.text = defaultName;}PhotonNetwork.NickName = defaultName;}public void SetPlayerName(string name){if (string.IsNullOrEmpty(name)){return;}PhotonNetwork.NickName = name;PPK.SetString(PPK.playerName, name);}
}
  • 场景架构如下
    InputField 设置监听,为其添加 Player Name Input 脚本
    Launcher 脚本中的 Control Panel, Progress Label 添加对应的UI物体
    在这里插入图片描述
  • 测试连接
    顺序依次为 PhotonNetwork.ConnectUsingSettings() -> OnConnectedToMaster() -> OnJoinedRoom() -> OnJoinRandomFailed() -> CreateRoom() -> OnDisconnected()
    额额,虽然有点复杂但还是能懂大概流程。
    在这里插入图片描述

游戏场景搭建

  • 新建一个场景 RoomFor1
    搭建一个默认舞台
    在这里插入图片描述
  • 新建一个脚本,用于创建 GameManager 的预设体,控制退出房间
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using Photon.Pun;
using Photon.Realtime;
public class GameManagerPUN : MonoBehaviourPunCallbacks
{public override void OnLeftRoom(){SceneManager.LoadScene("LobbyScene");}public void LeaveRoom(){PhotonNetwork.LeaveRoom();}
}
  • 场景中创建 GameManagerTopPanel 并在其中添加 LeaveButton
    为其添加监听
    并把这两个物体创建预设体,方便后续使用
    在这里插入图片描述
  • 复制其他的场景,并添加到 Build List 中
    在这里插入图片描述

关卡加载

  • 修改上述 GameManager 脚本如下:
    使用 PhotonNetwork.LoadLevel() 而不是 Unity 的场景跳转
    使用 OnPlayerEnteredRoom(), OnPlayerLeftRoom() 来监听玩家的进入和离开房间
    使用 PhotonNetwork.IsMasterClient 来检测玩家是否在 Master Server ,这之后才能加载到 Game Server
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using Photon.Pun;
using Photon.Realtime;
public class GameManagerPUN : MonoBehaviourPunCallbacks
{public override void OnLeftRoom(){SceneManager.LoadScene("LobbyScene");}public void LeaveRoom(){PhotonNetwork.LeaveRoom();}private void LoadArena(){if (!PhotonNetwork.IsMasterClient){Debug.LogError("PhotonNetwork : Trying to Load a level but we are not the master Client");return;}Debug.LogFormat("PhotonNetwork : Loading Level : {0}", PhotonNetwork.CurrentRoom.PlayerCount);PhotonNetwork.LoadLevel("RoomFor" + PhotonNetwork.CurrentRoom.PlayerCount);}public override void OnPlayerEnteredRoom(Player other){Debug.LogFormat("OnPlayerEnteredRoom() {0}", other.NickName); // not seen if you're the player connectingif (PhotonNetwork.IsMasterClient){Debug.LogFormat("OnPlayerEnteredRoom IsMasterClient {0}", PhotonNetwork.IsMasterClient); // called before OnPlayerLeftRoomLoadArena();}}public override void OnPlayerLeftRoom(Player other){Debug.LogFormat("OnPlayerLeftRoom() {0}", other.NickName); // seen when other disconnectsif (PhotonNetwork.IsMasterClient){Debug.LogFormat("OnPlayerLeftRoom IsMasterClient {0}", PhotonNetwork.IsMasterClient); // called before OnPlayerLeftRoomLoadArena();}}
}

事后

  • 当时经过测试,加载房间一直失败
    甚至我直接打开官方的demo,也是创建房间失败…
    然后我去 Photon 论坛上问了,结果提交讨论失败…
    在这里插入图片描述
  • 然后我还去问 Support Team 了 (通过邮箱),他们居然两三天就回我了
    在这里插入图片描述

在这里插入图片描述

  • 好吧,可能大概率是推荐 JP region 的问题,当时有点忙也就放着不管了
  • 然后我现在捯饬一下,发现确实是 region 的问题
    在这里插入图片描述
  • 注:Fixed Region 请不要填 asia,空着就行
    Dev Region 虽然推荐 jp,请填 cn
    然后就创建房间成功了!
    在这里插入图片描述

这篇关于【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/346299

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件