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

这篇具有很好参考价值的文章主要介绍了【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

简单介绍

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

安装

  • 安装包,输入邮箱来注册,或输入Appid来登录。
    【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用,【游戏开发】,unity,学习,游戏引擎
  • 输入邮箱后,发来确认邮件。点击链接,输入密码来注册新的 Photon 账号。顺带会给你 appID
    Photon链接
    【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用,【游戏开发】,unity,学习,游戏引擎

简单使用

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

一些 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
    【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用,【游戏开发】,unity,学习,游戏引擎
  • 新建一个 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 level
        PhotonNetwork.AutomaticallySyncScene = true;
    }
    void Start()
    {
        Connect();
    }


    public void Connect()
    {
        if (PhotonNetwork.IsConnected)
        {
            PhotonNetwork.JoinRandomRoom();
        }
        else
        {
            PhotonNetwork.ConnectUsingSettings();
            PhotonNetwork.GameVersion = gameVersion;
        }
    }
}

  • 在场景中,添加空节点,挂载该脚本,运行后:
    【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用,【游戏开发】,unity,学习,游戏引擎
  • 这貌似是成功了。

设置简单的大厅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 level
        PhotonNetwork.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物体
    【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用,【游戏开发】,unity,学习,游戏引擎
  • 测试连接
    顺序依次为 PhotonNetwork.ConnectUsingSettings() -> OnConnectedToMaster() -> OnJoinedRoom() -> OnJoinRandomFailed() -> CreateRoom() -> OnDisconnected()
    额额,虽然有点复杂但还是能懂大概流程。
    【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用,【游戏开发】,unity,学习,游戏引擎

游戏场景搭建

  • 新建一个场景 RoomFor1
    搭建一个默认舞台
    【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用,【游戏开发】,unity,学习,游戏引擎
  • 新建一个脚本,用于创建 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
    为其添加监听
    并把这两个物体创建预设体,方便后续使用
    【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用,【游戏开发】,unity,学习,游戏引擎
  • 复制其他的场景,并添加到 Build List 中
    【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用,【游戏开发】,unity,学习,游戏引擎

关卡加载

  • 修改上述 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 connecting

        if (PhotonNetwork.IsMasterClient)
        {
            Debug.LogFormat("OnPlayerEnteredRoom IsMasterClient {0}", PhotonNetwork.IsMasterClient); // called before OnPlayerLeftRoom

            LoadArena();
        }
    }

    public override void OnPlayerLeftRoom(Player other)
    {
        Debug.LogFormat("OnPlayerLeftRoom() {0}", other.NickName); // seen when other disconnects

        if (PhotonNetwork.IsMasterClient)
        {
            Debug.LogFormat("OnPlayerLeftRoom IsMasterClient {0}", PhotonNetwork.IsMasterClient); // called before OnPlayerLeftRoom

            LoadArena();
        }
    }
}

事后

  • 当时经过测试,加载房间一直失败
    甚至我直接打开官方的demo,也是创建房间失败…
    然后我去 Photon 论坛上问了,结果提交讨论失败…
    【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用,【游戏开发】,unity,学习,游戏引擎
  • 然后我还去问 Support Team 了 (通过邮箱),他们居然两三天就回我了
    【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用,【游戏开发】,unity,学习,游戏引擎

【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用,【游戏开发】,unity,学习,游戏引擎文章来源地址https://www.toymoban.com/news/detail-727845.html

  • 好吧,可能大概率是推荐 JP region 的问题,当时有点忙也就放着不管了
  • 然后我现在捯饬一下,发现确实是 region 的问题
    【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用,【游戏开发】,unity,学习,游戏引擎
  • 注:Fixed Region 请不要填 asia,空着就行
    Dev Region 虽然推荐 jp,请填 cn
    然后就创建房间成功了!
    【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用,【游戏开发】,unity,学习,游戏引擎

到了这里,关于【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 项目实训--Unity多人游戏开发(十一、PUN框架--游戏场景篇(加载与同步))

    本地加载 有许多方法,举几个例子: 本地加载 本地异步加载(场景内容过多时,防止卡顿异步加载) 多人游戏加载场景 pun2插件加载 这个异步加载起初是觉得场景内容如果过多会引起卡顿。所以把这个应用在了单机模式上。 至于多人游戏加载场景,可能用不到而且也没法

    2024年02月01日
    浏览(38)
  • Unity之Photon PUN2开发多人游戏如何实现组队功能

    Photon Unity Networking 2 (PUN2) 是一款基于Photon Cloud的Unity多人游戏开发框架。它提供了一系列易于使用的API和工具,使开发者可以快速构建多人戏,并轻松处理多人游戏中的网络同步、房间管理、玩家匹配等问题。 我们在查看Pun2的Demo时,会发现Demo中自带了一个简易的PhotonTeam和

    2024年02月11日
    浏览(37)
  • Unity之使用Photon Server + PUN2 开发局域网多人游戏

    Photon Engine是一款跨平台的实时多人游戏引擎,它提供了可靠的基础设施和工具,使开发者能够轻松地构建和部署多人游戏。Photon Engine支持多种平台,包括PC、移动设备和Web,同时还提供了多种语言的SDK,如C++、C#、Java、JavaScript等,使得开发者可以使用自己熟悉的编程语言进

    2024年02月13日
    浏览(30)
  • 80个在线小游戏源码

    搭建80个在线小游戏网站源码,解压即可食用,支持在本地浏览器打开。 纯HTML,直接将压缩包上传网站目录解压即可 80个在线小游戏源码-小8源码屋

    2024年04月26日
    浏览(15)
  • 游戏行业实战案例 5 :玩家在线分布

    【面试题】 某游戏数据后台设有“登录日志”和“登出日志”两张表。 「登录日志」记录各玩家的登录时间和登录时的角色等级。  「登出日志」记录各玩家的登出时间和登出时的角色等级。 其中,「角色 id 」字段唯一识别玩家。 游戏开服前两天( 2022-08-13 至 2022-08-14 )

    2024年02月13日
    浏览(23)
  • 推荐一个可以提高生产力的在线游戏

    很久没推荐好玩的工具了,今天给家推荐一个非常有意思的游戏:Habitica Habitica除了是个游戏之外,居然还是一个生产力应用! 为什么说Habitica还是个生产力应用呢?因为它还可以帮助我们养成习惯! 通过Habitica,我们可以用它的每日目标和代办事项列表功能来跟踪和管理你

    2023年04月25日
    浏览(36)
  • 100人同时在线游戏的服务器多少钱一台?

    100人同时在线游戏的服务器多少钱一台? 想要自己开发游戏的你是否会有这样的疑问? 为你的游戏选择合适的服务器配置,需要根据游戏类型(角色扮演、射击、生存和沙盒等)、游戏版本、游戏端(手游、端游和页游等)和游戏用户群体分布来综合考虑。 当你想要做一款

    2023年04月26日
    浏览(46)
  • 赛车游戏——【极品飞车】(内含源码inscode在线运行)

    「作者主页」 :雪碧有白泡泡 「个人网站」 :雪碧的个人网站 「推荐专栏」 : ★ java一站式服务 ★ ★ 前端炫酷代码分享 ★ ★ uniapp-从构建到提升 ★ ★ 从0到英雄,vue成神之路 ★ ★ 解决算法,一个专栏就够了 ★ ★ 架构咱们从0说 ★ ★ 数据流通的精妙之道★ CSDN最新推

    2024年02月14日
    浏览(23)
  • 有意思!一个关于 Spring 历史的在线小游戏

    发现 Spring One 的官网上有个好玩的彩蛋,分享给大家! 进到Spring One的官网,可以看到右下角有个类似马里奥游戏中的金币图标。 点击该金币之后,会打开一个新的页面,进入下面这样一个名为:The History Of Spring 的在线小游戏 你可以使用上下左右的方向键来控制Spring的Logo一

    2024年04月27日
    浏览(22)
  • 【字节跳动青训营】后端笔记整理-2 | Go实践记录:猜谜游戏,在线词典,Socks5代理服务器

    **本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金:🔗Go实践记录:猜谜游戏,在线词典,Socks5代理服务器 | 青训营 我的go开发环境: *本地IDE:GoLand 2023.1.2 *go:1.20.6 猜数字游戏也算是入门一门编程语言必写的程

    2024年02月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包