Photon网络游戏开发——PUN2简介

        Photon Unity Networking (PUN) 是为多人对战游戏而生的一个Unity package。灵活的配对让您的玩家进入可以通过网络实现同步对象的房间。 RPCs,自定义属性和“低级”Photon事件是其中的一些功能特性。快速和(可选的)可靠的通信是通过Photon专用服务器完成的,所以客户端不必一对一连接。

        PUN 基本上可以支持Unity 的所有平台,并且有两种选择:

        PUN2 FREE :包含各种演示、预制脚本和参考文档的免费软件包。基本支持所有的平台。

        PUN2 PLUS:不仅PUN2 FREE包含的内容,附加Photon Cloud 的 100 个并发用户计划(约 40k MAU,有效期 12 个月)。

1、PUN2的结构

        你通常不必了解PUN包的结构,对于了解它的结构还是有必要提及,PUN封装了三层API:

        (1)最上层是 PUN 代码,它实现了 Unity 特定的功能,如网络对象、RPC 等。

        (2)第二层包含与 Photon 服务器一起工作、匹配、回调等的逻辑。这是实时 API,可以单独使用。您会注意到 PUN 和 Realtime API(也称为 LoadBalancing API)之间的主题有很多重叠,但这很好。

        (3)最底层由 DLL 文件组成,其中包含反序列化、协议等。

2、开始使用

        为了充分利用 PUN,您需要进行一些编程。此页面显示了几个重要的代码片段作为概述。

        完成学习 "PUN Basics Tutorial"之后,我们就可以开始使用了。

3、连接和回调

        ConnectUsingSettings可以立刻上网,它获取PhotonServerSettings上所有重要的设置,你就可以放手去做了。

PhotonNetwork.ConnectUsingSettings();

        PUN 使用回调让您知道客户端何时建立连接、加入房间等。

        比如:IConnectionCallbacks.OnConnectedToMaster

        为了方便使用,PUN拥有MonoBehaviourPunCallbacks,它继承自MonoBehaviour。它实现了重要的回调接口并自动注册,因此您可以继承它并覆盖特定的回调方法。

public class YourClass : MonoBehaviourPunCallbacks
{
    // ...
    public override void OnConnectedToMaster()
    {
        Debug.Log("OnConnectedToMaster() was called by PUN.");
        PhotonNetwork.JoinRandomRoom();
    }
    // ...
}

        或者在任何类中实现 IConnectionCallbacks,并通过 PhotonNetwork.AddCallbackTarget 为回调注册实例。

4、配对系统

        在OnConnectedToMaster的内部,您可以尝试加入现有房间或创建自己的房间。以下代码片段显示了开始或加入游戏的可能方法调用。

// Join room "someRoom"
PhotonNetwork.JoinRoom("someRoom");
//Fails if "someRoom" is not existing, closed or full. Error callback: IMatchmakingCallbacks.OnJoinRoomFailed

// Tries to join any random game:
PhotonNetwork.JoinRandomRoom();
//Fails if there are no open games. Error callback: IMatchmakingCallbacks.OnJoinRandomFailed

// Create this room.
PhotonNetwork.CreateRoom("MyMatch");
// Fails if "MyMatch" room already exists and calls: IMatchmakingCallbacks.OnCreateRoomFailed

        当朋友们想一起玩并且想通过 PUN 之外的方式进行交流(例如使用 Photon Chat、Facebook)时,他们可以起一个房间名然后使用 JoinOrCreateRoom.。其他人就无法看到这个房间进行匹配。

RoomOptions roomOptions = new RoomOptions();
roomOptions.IsVisible = false;
roomOptions.MaxPlayers = 4;
PhotonNetwork.JoinOrCreateRoom(nameEveryFriendKnows, roomOptions, TypedLobby.Default);

        使用JoinOrCreateRoom可以让房间按需构造,也不必关心谁先进到房间,如果房间人数满了,则调用IMatchmakingCallbacks.OnJoinRoomFailed(如果您在某处实现并注册它)。

        在我们的指南中阅读有关配对的更多信息。

5、游戏逻辑

        游戏对象可以通过PhotonView组件实例化为“网络游戏对象” 。它标识对象和所有者(或控制器),控制的玩家会更新其他所有人。

        通常,您会将 PhotonView 添加到预制件中,为其选择 Observed 组件并使用 PhotonNetwork.Instantiate 创建实例。

        PhotonView 的被观察组件负责每秒多次写入(和读取)网络对象的状态。为此,脚本必须实现 IPunObservable,它定义了 OnPhotonSerializeView。它看起来像这样:

// used as Observed component in a PhotonView, this only reads/writes the position
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
    }
}

        客户端可以调用 Remote Procedure Calls 在不经常发生改变的特定网络对象上。

// defining a method that can be called by other clients:
[PunRPC]
public void OnAwakeRPC(byte myParameter)
{
    //Debug.Log(string.Format("RPC: 'OnAwakeRPC' Parameter: {0} PhotonView: {1}", myParameter, this.photonView));
}
// calling the RPC somewhere else
photonView.RPC("OnAwakeRPC", RpcTarget.All, (byte)1);

        单独的 GameObjects,您还可以发送自己的事件:

PhotonNetwork.RaiseEvent(eventCode, eventContent, raiseEventOptions, SendOptions.SendReliable);

        Read more about PUN's RPCs and RaiseEvent.

6、演示和教程

        在PUN包中,你能找到一些演示和有用的脚本,他们可以被重复利用、拆解之后重构。

        To get properly started, take your time to read and code the "PUN Basics Tutorial".

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值