学习Unity3D网络插件photon pun和PhotonServer(一)
发表于2018-08-29
项目中可能会用到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
如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引