許久沒寫了,今日閑來無事隨性一些,總結一下最近的游戲經歷(寫游戲)
Photon服務器的進階~
距離上一篇估計也過去一個多月了,對於Photon真是又愛又恨。
愛着它的書寫方便。
恨着它的教程稀少總走彎路,但最后都不知道愛不愛着了。
作為服務器的進階就得講點高逼格的東西啦。
老套路給教程。我的經驗都是對別的教程的理解或者是升華,想自己升華的果斷點完教程然后右上角吧。
http://search.jikexueyuan.com/course/?q=Photon //極客學院對於Photon的講解,比較清晰明了
還有我上篇文章發的鏈接
http://www.cnblogs.com/liusuqi/category/447143.html //貌似都是對官方Demo的翻譯,現在去官方看有的已經沒有了,所有很有借鑒價值
把這倆個結合在一起看會有奇效哦~ (大概O_O)
說了這么長時間廢話,恩。。進入正題!
我把Photon的進階分為兩個部分:
1. Lite的使用
2.Peer的使用
讓我們來說說這個第一點吧,其實挺坑的,教程里這個說一個Lite的使用啊,又一個Room的。最開始都不知道怎么用這些東西,其實這個就是官方寫的一個Lite Demo 在deploy下的Lite/bin 里有個Lite.dll 這個就是教程中常說的Lite拉,找到這個可真費勁啊~
這個dll只需要導入服務端就可以,Unity3d的dll自帶這個命令的所以不需要。
現在讓我們來看看服務器端的代碼,我們的繼承就要變了
public class MyApplication : LiteApplication //Application類的繼承改變 public class MyPeer : LitePeer //Peer類的繼承改變
這樣我們才能使用Lite里的功能,其實Lite就是對原先的PeerBase和Application進行了封裝,加入了Room,方便了廣播數據和房間分配
關於Lite的概念這里講解了 http://www.cnblogs.com/liusuqi/archive/2013/05/15/3079713.html
有幾個比較重要的操作:
Join 加入: 輸入任何房間的名字,如果它不存在的話它將被創建,加入時將隱式地離開先前的房間(如果有的話),返回指定的ActorNumber。
Leave 離開: 離開房間(但保持連接)。
RaiseEvent 觸發事件: 告訴房間發送一個事件到其他Peer。事件有一個EventCode,可以攜帶客戶端提供的數據。Lite並不存儲事件。
GetProperties 獲取屬性: 在Lite中,屬性可以被附加到房間和玩家上,伴隨着這個操作,他們都將被獲取。
SetProperties 設置屬性: 高度的任意的鍵-值對,一個房間或一個單一的玩家,Lite不使用數據,所以客戶端可以發送任意的數據,代碼按照慣例。
這里面還提到了一個比較重要的概念Room(房間),舉幾個例子:
比如說游戲中有的組隊系統,你發言的時候只能組隊的人看見而別人看不見,這就是房間的作用。
說了這么多,那這幾個操作和方法怎么使用呢? 或許你會說那個博客里不有例子么,但是其實並不是一回事。
我們說的這幾個操作多在客戶端中使用,而服務器就是個轉接的,該實現的方法Lite.dll都已經幫我們實現了,非常方便。
現在就說說在客戶端中的寫法:
using UnityEngine; using ExitGames.Client.Photon.Lite; using ExitGames.Client.Photon; using System.Collections; using System.Collections.Generic; public class Test : MonoBehaviour, IPhotonPeerListener { LitePeer peer; public void RadioRoomEvent(byte eventCode, Hashtable customEventContent) { peer.OpRaiseEvent(eventCode, customEventContent, true); // 給目前在服務器中的所有玩家發送事件 } public void JoinRoom(string RoomName) { peer.OpJoin(RoomName); // 發送加入房間的消息 } public void LeaveRoom() { peer.OpLeave(); // 發送離開房間的消息 } public void SendMessage(byte customOpCode, Dictionary<byte, object> customOpParameters) { peer.OpCustom(customOpCode, customOpParameters, true); // 給服務器發送消息
} public void DebugReturn(DebugLevel level, string message) { Debug.Log(message); } public void OnEvent(EventData eventData) { //處理服務器轉發回來的事件 } public void OnOperationResponse(OperationResponse operationResponse) { //處理服務器發回來的消息 } public void OnStatusChanged(StatusCode statusCode) { switch (statusCode) { case StatusCode.Connect: Debug.Log("Connect"); break; case StatusCode.Disconnect: Debug.Log("Disconnect"); break; } } // Use this for initialization void Start () { peer = new LitePeer(this, ConnectionProtocol.Udp); peer.Connect("localhost:5055", "MyServer"); } // Update is called once per frame void Update () { peer.Service(); } }
幾點注意的:
包名 using ExitGames.Client.Photon.Lite;
發送加入房間 peer.OpJoin(RoomName); // 非常的方便
同樣離開也非常方便
而怎么處理由Lite向客戶端發送的事件呢~ 下P在講解.