学习UNITY3D网络插件photon pun和PhotonServer

本文为原创,转载请注明出处!


想到哪写到哪,主要是给自己做一个记录,记性不太好。教程实在是少的可怜


学习PhotonServer这个服务器引擎已经有一段时间了。一直想做一个带大厅的棋牌类型游戏,所以最近又把Photon捡起来了,有了新的体会。


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

所以我客户的选择用Photon PUN  这个是在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 dic = new Dictionary();      
            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)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好用很多,而且自己修改好和服务器通讯的代码以后,客户端代码很干净,层次很清楚。服务端还需要再研究研究。


本文为原创,转载请注明出处!

你可能感兴趣的:(PhotonServer)