本文为原创,转载请注明出处!
想到哪写到哪,主要是给自己做一个记录,记性不太好。教程实在是少的可怜
学习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.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
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好用很多,而且自己修改好和服务器通讯的代码以后,客户端代码很干净,层次很清楚。服务端还需要再研究研究。
本文为原创,转载请注明出处!