【Unity3D插件】PUN 2插件分享《Unity3D多人在线联机联网插件》——客户端服务器端一体

推荐阅读

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

稍微关注过博主的同学应该有印象,我已经出过PUN(Photon Unity Networking)插件的教程:
【Unity3D插件】Photon Unity Networking(PUN)插件分享《多人联机服务器》
在这里插入图片描述
怎么现在又来了呢?

主要是这篇文章是在2020年发表的,PUN从那时开始已经更新了很多版本。

目前,PUN开发团队也经过了多个版本的迭代开发,现在已经更新到了PUN 2。

PUN 2对比PUN来说的话,连接更稳定,数据传输也更加高效。

那接下来博主就带着大家来看一下新版PUN的使用吧。

二、Photon Unity Networking(PUN)介绍

Photon Unity Networking简称PUN,是一款多人游戏的Unity插件包。

灵活的配对让你的玩家进入可以通过网络同步对象的房间。

快速和可靠的通信是通过专用的Photon服务器完成的,因此客户端不需要一对一的连接。

主要作用就是实现多人游戏的服务器,是一款服务器端和客户端在一起的服务器。

不用再去搭建服务器,PUN是成熟可用的服务器框架,节省造轮子的时间。

三、快速上手

这一节,就带领大家快速上手PUN服务器搭建。

3-1、注册账号

点击进入Photon的官网https://dashboard.photonengine.com

登录账号:
在这里插入图片描述
如果没有注册过账号就点击 Create one… 注册账号:
在这里插入图片描述

3-2、创建程序

进入到后台控制页面后,创建一个新的程序:

在这里插入图片描述
设置类型和名字:
在这里插入图片描述
App ID复制下来,有用:
在这里插入图片描述

3-3、在项目中导入PUN2

(1)创建项目
我用的Unity版本是Unity 2019.4.7f1,设置项目名称和位置(项目名称可以不与前面步骤创建的程序名字一致,我这里是为了方便演示):
在这里插入图片描述
注意:PUN2 支持Unity版本,2018.4.22或更高,往下的版本不支持。

(2)打开资源商店
在Unity编辑器面板,使用快捷键Ctrl+9打开商店,搜索PUN:
在这里插入图片描述
(3)点击Download下载插件,下载完毕点击Import进行导入:
在这里插入图片描述

3-4、设置参数

导入完成后,会弹出参数设置窗口,将前面步骤复制的App ID填入:
在这里插入图片描述
点击Skip就可以了。

之后在Assets/Photon/PhotonUnityNetworking/Resources文件夹找到PhotonServerSettings文件,设置参数,将之前复制的App ID复制粘贴进入,APp version设置为1,PUN Loggin 设置Full:
在这里插入图片描述

3-5、编写代码

接下来就编写代码测试一下多个客户端是否可以加入到同一个房间。

新建脚本命名为Launcher.cs,双击打开脚本进行编辑:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;

public class Launcher : MonoBehaviourPunCallbacks
{
    void Start()
    {
        //初始化用户设置
        PhotonNetwork.ConnectUsingSettings();
    }

    //连接到服务器
    public override void OnConnectedToMaster()
    {
        base.OnConnectedToMaster();
        Debug.Log("服务器连接成功");

        //创建或者加入房间 设置最大游戏玩家数
        PhotonNetwork.JoinOrCreateRoom("Room1", new Photon.Realtime.RoomOptions { MaxPlayers = 20 }, default);
    }

    //加入到房间
    public override void OnJoinedRoom()
    {
        base.OnJoinedRoom();

        Debug.Log("加入到房间:" + PhotonNetwork.CurrentRoom);
    }
}

将脚本拖到Main Camera对象上。

3-6、运行程序

选择Build And Run运行程序:
在这里插入图片描述
然后运行Unity编辑器:
在这里插入图片描述
可以看到加入了房间,房间内有两个对象。

当然现在什么效果都没有,没有关系,在接下来的案例中,我们会显示加入后联机的效果。

接下来就来看一下关键API吧。

四、关键API介绍

官方文档在:https://doc.photonengine.com/zh-cn/pun/current/getting-started/pun-intro

4-1、连接和回调

使用ConnectUsingSettings可以让你应用你资产文件夹中的PhotonServerSettings的属性设置:

PhotonNetwork.ConnectUsingSettings();

PUN使用回调,让客户端只是何时建立了一个连接,何时加入了一个房间等等。

PUN使用了MonoBehaviourPunCallbacks接口实现了重要的回调接口并自动注册自己,可以继承它并覆盖特定的回调方法:

//连接到服务器
public override void OnConnectedToMaster()
{
    base.OnConnectedToMaster();
    Debug.Log("服务器连接成功");
}

//加入到房间
public override void OnJoinedRoom()
{
     base.OnJoinedRoom();

     Debug.Log("加入到房间:" + PhotonNetwork.CurrentRoom);
}

4-2、加入、创建房间

OnConnectedToMaster之后,可以选择加入一个现有的房间或创建一个房间。

比如说:

// 加入一个名字叫做“Room”的房间
PhotonNetwork.JoinRoom("Room");
// 如果“Room”不存在、关闭或已满,则加入失败。 错误的回调:IMatchmakingCallbacks.OnJoinRoomFailed  
// 尝试加入任何随机房间
PhotonNetwork.JoinRandomRoom();
// 如果没有公开放假,则加入失败。 错误的回调:IMatchmakingCallbacks.OnJoinRandomFailed  
// 创建一个房间
PhotonNetwork.CreateRoom("MyMatch");
// 如果“MyMatch”房间已经存在则创建失败,错误的回调:IMatchmakingCallbacks.OnCreateRoomFailed  

如果说要跟朋友一起玩,则可以设置一个房间名称并使用JoinOrCreateRoom来加入房间,其他人不应该被分配到这个房间:

RoomOptions roomOptions = new RoomOptions();
roomOptions.IsVisible = false;//不可见
roomOptions.MaxPlayers = 4;//最大游玩人数
PhotonNetwork.JoinOrCreateRoom(nameEveryFriendKnows, roomOptions, TypedLobby.Default);

JoinOrCreateRoom房间是按需创建的,所以谁创建的并不重要,如果房间满了,则加入失败。 错误的回调:IMatchmakingCallbacks.OnJoinRoomFailed

4-3、游戏逻辑

可以同步的对象需要加上PhotonView组件,它标识对象可以被同步更新给房间内其他对象。

通常这个对象是需要实例化出来的,可以通过PhotonNetwork.Instantiate创建一个实例化对象。

使用OnPhotonSerializeView函数去负责写入或读取联网对象的状态,比如:

// 找到使用PhotonView组件的对象,读取或写入位置信息
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
    if (stream.IsWriting)
    {
        Vector3 pos = transform.localPosition;
        stream.Serialize(ref pos);
    }
    else
    {
        Vector3 pos = Vector3.zero;
        stream.Serialize(ref pos);  // pos gets filled-in. must be used somewhere
    }
}

OK,API了解了,接下来就使用一个实例来演示一下怎么使用吧。

五、案例

5-1、场景搭建

新建场景,新建一个Plane和Cube:
在这里插入图片描述
注意:将Plane和Cube的位置归零。

给Cube加上Rigidbody组件:

在这里插入图片描述

给Cube加上PhotonView组件,如果要同步的话,这个组件是必须的:
在这里插入图片描述
将Cube拖到Project视图的Resources文件夹内做成预制体:
在这里插入图片描述

5-2、编写脚本

新建脚本ClickFloor.cs,将脚本附给Plane对象:

using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ClickFloor : MonoBehaviour
{
    public GameObject m_CubePrefab;
    PhotonView photonView;

    void Start()
    {
        photonView = GetComponent<PhotonView>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                PhotonNetwork.Instantiate(m_CubePrefab.name, hit.point + new Vector3(0, 3, 0), Quaternion.identity, 0);
            }
        }
    }
}

将Cube拖入卡槽中:
在这里插入图片描述
然后新建脚本Launcher.cs编辑代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;

public class Launcher : MonoBehaviourPunCallbacks
{
    private string NetworkClientState;//信息提示
    void Start()
    {
        NetworkClientState = "请稍等...服务器连接中...";
        //初始化用户设置
        PhotonNetwork.ConnectUsingSettings();
    }

    //连接到服务器
    public override void OnConnectedToMaster()
    {
        base.OnConnectedToMaster();
        NetworkClientState = "服务器连接成功";
        Debug.Log(NetworkClientState);

        //创建或者加入房间 设置最大游戏玩家数
        PhotonNetwork.JoinOrCreateRoom("Room1", new Photon.Realtime.RoomOptions { MaxPlayers = 20 }, default);
    }

    //加入到房间
    public override void OnJoinedRoom()
    {
        base.OnJoinedRoom();
        NetworkClientState = "加入到房间:" + PhotonNetwork.CurrentRoom;
        Debug.Log(NetworkClientState);
    }

    void OnGUI()
    {
        //显示连接信息
        GUILayout.Label(NetworkClientState, GUILayout.Width(300), GUILayout.Height(100));
    }
}

点击File→Build And Run运行程序:
在这里插入图片描述
然后打开Unity编辑器运行程序:

PUN服务器Demo录制程序

六、后记

你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。
在这里插入图片描述

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。
  • 27
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
Unity UnityWebSocket插件是一款用于在Unity项目中实现WebSocket通信的插件。WebSocket是一种新的网络通信协议,它建立在HTTP协议之上,可以提供全双工通信,使得客户端和服务器可以通过一次HTTP握手建立持久的连接,实现实时的双向通信。 Unity UnityWebSocket插件可以方便地在Unity中使用WebSocket协议进行网络通信。它提供了简洁易用的API接口,开发者可以轻松地实现连接、发送和接收消息等操作。通过该插件,我们可以构建实时的游戏功能,例如聊天系统、多人游戏和实时更新等。 使用Unity UnityWebSocket插件,开发者可以通过几行代码实现WebSocket的连接和消息处理。首先需要创建WebSocket连接,通过指定服务器地址和端口号等参数进行连接。连接建立后,可以通过发送消息来与服务器进行通信,并通过接收消息事件来处理服务器返回的数据。 Unity UnityWebSocket插件还提供了一些高级功能,例如心跳机制和断线重连。心跳机制可以保持连接的稳定性,防止连接断开。断线重连功能可以在网络连接断开后自动重新连接服务器,确保通信的连续性。 总之,Unity UnityWebSocket插件是一款强大的工具,可以帮助开发者在Unity中实现WebSocket通信。它提供了简单易用的接口,并支持一些高级功能,使得开发者可以轻松地构建实时的游戏功能。该插件的使用可以提高开发效率,为游戏开发带来更多可能性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恬静的小魔龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值