学习Unity3D网络插件photon pun和PhotonServer(一)

发表于2018-08-29
评论0 3.6k浏览
项目中可能会用到PhotonServer这个服务器引擎做开发,但是相关的入门教程不够看,为此下面给大家分享下学习Unity3D网络插件photon pun和PhotonServer系列教程,希望能对大家有些帮助。

photon是可以客户端和服务端都用Lite来做,客户端有ExitGames.Client.Photon.Lite命名空间,服务器也有对应的Lite,这种好处在于,代码很干净,比较好管理,Photon本身的代码和自己写的代码可以分的很清楚。但是有个弊端,游戏里的物体同步需要自己去写,我还没发现有这个API。

所以我客户的选择用PhotonPUN这个是在PHOTON的基础上再次封装,写法和Unity本身的网络很像,因为这个插件里有个很重要的组件PhotonView,可以直接丢到物体上。这个物体就可以和别的客户端同步了。不要太爽。

IPunCallbacks接口,里面包含了PUN本身设定的一些回调函数,和UNITY3D本身的Start等方法一样,是当别的事件触发了以后调用。

客户端用了PUN,服务端是有Photon提供的云服务器,但是都在国外,卡的很,其实是可以连接到本地的LoadBalancing服务器。并且其他服务不能启用。

以下是一些API的使用方法:
//连接到主服务器
 PhotonNetwork.ConnectToMaster("127.0.0.1", 5055, "许可证", "游戏版本号");
//是否自动加入大厅,默认是
PhotonNetwork.autoJoinLobby = false;
//是否自动销毁玩家离开前生成的物体,默认是
PhotonNetwork.autoCleanUpPlayerObjects = false;
//加入或者创建房间
 PhotonNetwork.JoinOrCreateRoom("房间1", new RoomOptions() { maxPlayers = 10 },  TypedLobby);    TypedLobby是大厅类,如果只有一个大厅就NULL
//实例化一个物体,让它同步
 PhotonNetwork.Instantiate("Cube", new Vector3(0, 0, 0), Quaternion.identity, 0);  
 “Cube”是prefab的名字,必须放在Resources文件下面,并且要加上一个photonView组件。PhotonView同步只支持位置大小和旋转,是有一个PhotonRIgidbody View组件,看起来是刚体的同步,但是感觉没用。
//服务器时间
 PhotonNetwork.time 这个返回过来的秒,但是感觉不对。
//给其他客户的发送Event      这个是用的photonPun来写,在大厅不能调用,必须要再房间里面,其实底层就是PhotonServer,为了跟UNITY3D的写法一样又封装了。
先添加一个PhotonView组件,而且脚本要继承自Photon.MonoBehaviour
    public void Hello()
    {     
       this.photonView.RPC("DoHello",PhotonTargets.All,null);   //第一个函数名,第二个接受对象为全部玩家,第三个为参数
    }
    [RPC]                                    //方法名上必须加 [RPC]    
    void DoHello()
    {
        tips.text = "Hello";
    }
//给其他客户的发送Event      这个是用的photonServer来写
            RaiseEventOptions options=new RaiseEventOptions ();              
            options.TargetActors=new int[]{1,2,3};      //接受客户的的ID
            EventData evnetdate = new EventData();
            Dictionary<byte, object> dic = new Dictionary<byte, object>();      
            dic.Add(1, "这是从客户端"+PhotonNetwork.playerName+"发来的事件消息");    
            evnetdate.Code = 77;
            evnetdate.Parameters = dic;
            PhotonNetwork.RaiseEvent(evnetdate.Code, dic, true, options);    //一个参数是操作码,第二个是事件内容字典,第三个是否可靠 ,第四个是 RaiseEventOptions 
//接收Event
PhotonNetwork.OnEventCall += this.OnEventRaised;    //注册回调的函数
    public void OnEventRaised(byte eventCode, object content, int senderID)   //byte eventCode,其实是个字典或者Hastable
    {
        switch (eventCode)
        {
            case 77:
                eventString =( (Dictionary<byte, object>)content) [1].ToString();
                break;
        }

//给服务器发送请求

这个我并没有发现PUN里面有这个API,需要自己去写,在 PhotonNetwork里自己写一个函数 OpCustom发送请求。服务器也要相应的写一个收到请求的处理

服务器的相关处理主要修改MasterServer / MasterClientPeer.cs 里面

//返回请求响应

这个也没有,可以按照IPunCallbacks 接口里面的函数写法来写,修改这个接口,添加一个返回函数到接口里面,在NetworkPeer里面OnOperationResponse判断,如果请求代码小于200就调用我们自己写的返回响应的函数。(因为Photon本身的操作码都在200--255之间)
        if (operationResponse.OperationCode<200)
        {
            SendMonoMessage(PhotonNetworkingMessage.OnReceiveOpCustomResponse, operationResponse); 
            return;
        }
PhotonNetworkingMessage.OnReceiveOpCustomResponse这个函数是我自己加的,这样客户端只要一发送请求,服务器返回回来就用自动调用一个函数,然后我们可以去那个函数里去处理接受到的响应。

其他的一些API都蛮简单,看看就会了。

总得来说,我感觉PUN比photon Lite好用很多,而且自己修改好和服务器通讯的代码以后,客户端代码很干净,层次很清楚。服务端还需要再研究研究。
来自:https://blog.csdn.net/u012322710/article/details/50614080

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

0个评论