王者荣耀实时对战服务器Photon之PUNLobby大厅

发表于2017-11-18
评论1 4.1k浏览

Lobby大厅,您的应用程序的大厅存在于主服务器上,以列出您的游戏的房间。只要有空房间可以使用随机房间,或者如果没有现有房间可以先创建房间再加入房间,可以创建一个新的房间我们首先解决本教程的核心问题,能够连接到Photon Cloud服务器并加入房间。

1.创建一个新场景,并将其保存为Launcher.unity

2.创建一个新的c#脚本。

3.在层次结构中创建一个名为Launcher的空的GameObject

4.c#脚本Launcher拖GameObject Launcher物体上

5.打开编辑c#脚本编写如下代码

6,保存c#脚本。

我们来看看这个脚本到目前为止的代码结构,首先是从一般的Unity开发脚本,然后看看我们制作的PUN脚本特定的流程。

命名空间:

虽然不是强制性的,但为您的脚本提供合适的命名空间可防止与其他资产和开发人员的冲突。如果另一个开发者创建一个类Launcher怎么办? Unity将进行报错,您或该开发人员将必须重命名Unity的类以允许执行项目。如果冲突来自您从Unity商店下载的插件,这可能很棘手不好解决。现在,Launcher类真的是Com.MyCompany.MyGame.launcher实际上在命名空间下,其他人不太可能会这样完全相同的命名空间,减少发生错误的几率,也会使您的工作安全和组织良好。

MonoBehaviour类别:

请注意,我们使用MonoBehaviour派生我们的Class,这本质上将我们的Class转换成Unity组件,然后我们可以放到GameObjectPrefab上。扩展MonoBehaviour的类可以访问许多非常重要的方法和属性。在你的情况下,我们将使用两个回调方法Awake()和Start()。

PhotonNetwork.autoJoinLobby

Awake()方法中,我们将PhotonNetwork.autoJoinLobby设置为false,因为我们不需要大厅功能,我们只需要获取现有的房间列表。这通常是强制设置的好方法,因为在同一个项目中,您可以有另一个场景实际上想要自动加入大厅,因此在同一个项目中,两种情况都会很好,在两者之间进行切换。

PhotonNetwork.ConnectUsingSettings()

Start()方法中,我们使用PhotonNetwork.ConnectUsingSettings()将我们的公共函数connect()称为PUN Cloud。请注意代表您的gameversion_gameVersion变量。您应该将其保留为“1”,直到您需要对已经存在的项目进行版本升级更改。要记住的重要信息是PhotonNetwork.ConnectUsingSettings()是您的游戏联网并连接到Photon Cloud的起点。放到Start方法中可以进入场景就连接到PhotonCloud。

PhotonNetwork.automaticallySyncScene

我们的游戏将根据玩家人数有一个可调节的竞技场,并确保每个连接的播放器的加载场景是相同的,我们将利用Photon提供的非常方便的功能:PhotonNetwork.automaticallySyncScene

当这样做时,MasterClient可以调用PhotonNetwork.LoadLevel(),所有连接的玩家将自动加载相同的级别。

此时,您可以保存启动场景并打开PhotonSettings(从Unity菜单窗口/ Photon Unity Networking / Highlight Photon Server Settings中选择),我们需要将调试级别设置为Full,如下所示:

然后我们可以Play运行场景。您应该在Unity Console中看到好几十个日志。专门查看“连接到masterserver”。日志表明,我们现在已经连接起来,准备加入一个房间。

编写代码时候保持的良好习惯。这里我们假设电脑连接到互联网,但是如果计算机没有连接到互联网会发生什么?我们来看看吧。关闭计算机的互联网并播放场景。你应该在Unity控制台看到一个错误“Connect()到'ns.exitgames.com'失败:System.Net.Sockets.SocketException:没有这样的主机是已知的”。

理想情况下,我们的脚本应该意识到这个问题,并对这些情况做出正确的处理,不管发生什么情况或问题,都可以进行处理不会是让项目进行奔溃。

现在我们来处理这两种情况,并在我们的Launcher脚本中通知我们我们确实连接到PUN Server。这将是PUN回调的介绍。

PUN CallBacks

PUN是使用回调非常灵活,并提供了三个不同的实现方式。 让我们来看看这三种方法,为了学习,我们会根据情况选择最适合的方法。

方法

当使用常规MonoBehaviour时,实际上可以简单地创建私有方法。

 void OnConnectedToMaster()

    {

        Debug.Log("DemoAnimator/Launcher: OnConnectedToMaster() was called by PUN");

    }

任何MonoBehaviour可以实现该回调方法或PUN的任何其他消息。 正如Unity正在

使用IPunCallbacksIPunObservable接口

PUN提供了两个C#接口,您可以在Class中实现。 IPunObservableIPunCallbacks

这是一个非常安全的方法来确保类符合所有的接口,但是强制开发人员实现所有的接口声明。 最好的脚本编辑器将使这个任务变得非常简单,如上所述当使用MonoDevelop时。 然而,该脚本可能会遇到很多可能暂时用不到的方法。 

我们确实要使用IPunObservable,进一步下载数据序列化教程。

Using Photon.PunBehaviour

最后一个技术,这是我们经常使用的技术,是最方便的。 而不是创建一个派生自MonoBehaviour的类,我们将从Photon.PunBehaviour派生类,因为它暴露了特定的属性和虚拟方法,以便我们方便使用和覆盖。 这是非常实用的,因为我们可以确保我们没有任何打字错误,我们不需要实现所有的方法。

注意:当重写时,大多数脚本编辑器将默认实现一个基本调用,并自动为您填写,但在我们的例子中,我们不需要,因为Photon.PunBehaviour的一般规则,从不调用基本方法。让我们来实践这个OnConnectedToMaster()和OnDisconnectedFromPhoton()pun回调

1编辑c#脚本启动器

2将基类从MonoBehaviour修改为Photon.PunBehaviour

public class Launcher : Photon.PunBehaviour {

3在类的末尾,在Photon.PunBehaviour CallBacks区域内添加以下两种方法。

4保存启动器脚本。

现在如果我们在有或没有互联网的情况下玩这个场景,我们可以采取适当的步骤通知玩家和/或进一步了解逻辑。 当我们开始构建UI时,我们将在下一节中讨论这一点。 现在我们将处理成功的关系:

所以,我们附加到OnConnectedToMaster()方法下面的调用:

// #Critical: The first we try to do is to join a potential existing room. If there is, good, else, we'll be called back with OnPhotonRandomJoinFailed()  

PhotonNetwork.JoinRandomRoom();

我们需要知道尝试加入随机房间是否失败,在这种情况下,我们需要实际创建一个房间,因此我们在脚本中实现OnPhotonRandomJoinFailed()PUN回调,并使用PhotonNetwork创建一个房间。 CreateRoom(),并且您已经知道了相关的PUN回调OnJoinedRoom(),当我们有效地加入房间时,它会通知您的脚本:

现在,如果您运行场景,并且您应该最终遵循连接到PUN的逻辑顺序,尝试加入现有的房间,否则创建房间并加入新创建的房间。

在本教程的这一点上,由于我们现在已经涵盖了连接和加入房间的关键方面,所以很少有东西不是很方便,而且需要比以后更好地解决。 这些与学习PUN并不重要,但从整体的角度来说是重要的。

Expose variables in Unity Inspector Unity Inspector中显示变量

您可能已经知道了这一点,但是如果您没有,MonoBehaviours会自动将其公共属性公开到Unity Inspector。 这是Unity中非常重要的一个概念,在我们的例子中,我们将修改我们定义LogLevel的方式,并创建一个公共变量,以便我们可以在不接触代码的情况下进行设置。

/// <summary>

/// The PUN loglevel. 

/// </summary>

public PhotonLogLevel Loglevel = PhotonLogLevel.Informational;

Awake()中,我们将修改如下:

// #NotImportant

// Force LogLevel

PhotonNetwork.logLevel = Loglevel;

所以,现在我们不强制脚本成为某种类型的LogLevel,我们只需要在Unity检查器中设置它,然后点击运行,不需要打开脚本,编辑它,保存它,等待Unity 重新编译,最后运行。 这样更有效率和灵活性。

我们会为每个房间的最大玩家数量做限制。 在代码中进行硬编码不是最好的做法,而是让它作为一个公共变量,这样我们可以随后决定和改变这个数字,而不需要重新编译。

在类声明的开始,在公共变量区域内,我们来补充:

/// <summary>

/// The maximum number of players per room. When a room is full, it can't be joined by new players, and so new room will be created.

/// </summary>   

[Tooltip("The maximum number of players per room. When a room is full, it can't be joined by new players, and so new room will be created")]

public byte MaxPlayersPerRoom = 4;

然后我们修改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 }, null);

不管你有关于Photon产品的问题或者是Photon价格问题或者Photon教程方面的问题或者其他问题都可以联系我们给我我们留言,我们真诚的为您服务。关注我们公众号PhotonServer获取等多新鲜资讯。


关注我们公众号PhotonServer 获取最新教程资源。

王者荣耀实时对战服务器Photon之Pun应用系列文章 如果你喜欢请关注我公众号,并推荐给你你的小伙伴,谢谢。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引