客戶端
4.
5.(可選)使用unity2017.2.0以下版本,編譯原始版ET客戶端報沒有引用錯誤時,刪除hoxfit下引用的UnityEngine.dll和UnityEngine.UI.dll,重新引用…\Editor\Data\UnityExtensions\Unity\GUISystem文件下的unityengine.UI.dll和引用…\Editor\Data\Managed 文件下的UnityEngine.dll。
6.Microsoft Visual Studio使用15.5.4以上版本,否則Unity可能會加載不了Hotfix.dll。如果加載不了需要自行重新引用Hotfix.dll。
7.安裝VS2017、unity2017及以上版本后,按流程操作無誤,可能仍出現問題,可重啟計算機試試。
注:
1.在運行和打包時,關閉全局配置界面,避免出現報錯干擾。
2.Tool上ILRuntime的生成工具是為了給ILRuntime提速用,需先加上ILRuntime的宏再點擊上面的兩個按鈕,不然會報錯或者無法正常生成。
3.在2018中打包需要Api Compatibility Level選擇 .NET4.X庫,不然會報Bson的錯。
客戶端修改界面步驟:
調試方法:
1、unity設置標記輸入框里的ILRuntime宏刪除。
2、在VS里重新生成解決方案
3、工具菜單標記資源包在點PC生成資源包菜單
4、將Release文件夾下的PC文件夾替換掉主工程文件夾(LandlordsCore-master)文件夾下的PC文件夾
5、熱更時恢復unity宏標記設置
增加界面:
1.在Global/UI下添加需要增加界面(如:NewUI)的父物體(如:NewUIParent),在UI的ReferenceCollector上添加界面的父物體(NewUIParent)的引用。
2.需要增加的界面(NewUI)添加CanvasConfig並將CanvasName設置為需要增加界面的父物體(NewUIParent)的名字。
3.在UIType枚舉里面添加枚舉成員(如:BEnum)。
4.模仿UILoginFactory類新建一個UI***Factory類,在界面添加按鈕處調用打開方法:Hotfix.Scene.GetComponent<UIComponent>().Create(UIType.BEnum);
5.在新增加的界面(NewUI)做邏輯處理須模仿UILoginComponent類新建一個UI***Component類,在類中實現想要的效果;在新增加的界面(NewUI)的ReferenceCollector組件上需要的引用。
6.熱更時須打開unity設置標記輸入框里的ILRuntime宏,Hotfix工程添加ILRuntime宏(屬性—–>生成–>條件編譯符號處加上 ILRuntime,重新生成修改過的工程,如不添加宏會無法啟動。
7.點擊工具菜單Tools–>打包–>設置標記–>設置標記,再Tools–>打包–>PC生成資源,將Release文件夾下的PC文件夾替換掉主工程文件夾(LandlordsCore-master)文件夾下的PC文件夾。
熱更時,只能hotfix拓展Model中的類,model無法拓展hotfix中的類,熱更的拓展方法只能放在hotfix中,model中不能調用hotfix中的方法。
服務端(基於哲學棋牌Demo)
各服務器作用
注:按需將整個系統拆分成不同的進程。比如你需要一個單獨處理聊天的服務器進程,那么可以增加Chat進程。根據需求配置服務器功能。
1.Manager:連接客戶端的外網和連接內部服務器的內網,對服務器進程進行管理,自動檢測和啟動服務器進程。加載有內網組件NetInnerComponent,外網組件NetOuterComponent,服務器進程管理組件。自動啟動突然停止運行的服務器,保證此服務器管理的其它服務器崩潰后能及時自動啟動運行。
2.Realm:對ActorMessage消息進行管理(添加、移除、分發等),連接內網和外網,對內網服務器進程進行操作,隨機分配Gate服務器地址。加載有ActorMessage消息分發組件ActorMessageDispatherComponent,ActorManager消息管理組件ActorManagerComponent,內網組件NetInnerComponent,外網組件NetOuterComponent,服務器進程管理組件LocationProxyComponent,Gate服務器隨機分發組件。客戶端登錄時連接的第一個服務器,也可稱為登錄服務器。
3.Gate:對玩家進行管理,對ActorMessage消息進行管理(添加、移除、分發等),連接內網和外網,對內網服務器進程進行操作,隨機分配Gate服務器地址,對Actor消息進程進行管理,對玩家ID登錄后的Key進行管理。加載有玩家管理組件PlayerComponent,ActorMessage消息分發組件ActorMessageDispatherComponent,ActorManager消息管理組件ActorManagerComponent,內網組件NetInnerComponent,外網組件NetOuterComponent,服務器進程管理組件LocationProxyComponent,Actor消息管理組件ActorProxyComponent,管理登陸時聯網的Key組件GateSessionKeyComponent。對客戶端的登錄信息進行驗證和客戶端登錄后連接的服務器,登錄后通過此服務器進行消息互動,也可稱為驗證服務器。
4.Location:連接內網,服務器進程狀態集中管理(Actor消息IP管理服務器)。加載有內網組件NetInnerComponent,服務器消息處理狀態存儲組件LocationComponent。
5.Map:連接內網,對ActorMessage消息進行管理(添加、移除、分發等),對場景內現在活動物體存儲管理,對內網服務器進程進行操作,對Actor消息進程進行管理,對ActorMessage消息進行管理(添加、移除、分發等),服務器幀率管理。ActorMessage消息分發組件ActorMessageDispatherComponent,ActorManager消息管理組件ActorManagerComponent,內網組件NetInnerComponent,服務器進程管理組件LocationProxyComponent,服務器幀率管理組件ServerFrameComponent。
6.AllServer:將以上服務器功能集中合並成一個服務器。另外增加DB連接組件DBComponent,DB管理組件DBProxyComponent。
7.Benchmark:連接內網和測試服務器承受力。加載有內網組件NetInnerComponent,服務器承受力測試組件BenchmarkComponent。
數據庫(基於哲學紳士的ET棋牌Demo)
數據庫組件
一、Hotfix
1.DBQueryBatchRequestHandler : AMRpcHandler<DBQueryBatchRequest, DBQueryBatchResponse>
批量加入數據庫緩存字典。
2.DBQueryJsonRequestHandler : AMRpcHandler<DBQueryJsonRequest, DBQueryJsonResponse>
通過json批量加入數據庫緩存字典。
3.DBSaveRequestHandler : AMRpcHandler<DBSaveRequest, DBSaveResponse>
保存數據到數據庫。
4.DBSaveBatchRequestHandler : AMRpcHandler<DBSaveBatchRequest, DBSaveBatchResponse>
批量保存數據到數據庫。
5.DBQueryRequestHandler : AMRpcHandler<DBQueryRequest, DBQueryResponse>
數據添加到數據庫緩存字典。
二、Model
1.InnerMessage類中包含數據請求和數據回復相關的類。
(1)、數據請求類繼承ARequest,包含有DBQueryRequest緩存請求類、DBQueryBatchRequest批量緩存請求類、DBQueryJsonRequest用Json緩存請求類、DBSaveRequest數據保存請求類、DBSaveBatchRequest數據批量保存請求類。
(2)、數據回復類繼承AResponse,包含有DBQueryResponse緩存回復類、DBQueryBatchResponse批量緩存回復類、DBSaveResponse數據保存回復類、DBSaveBatchResponse數據批量保存回復類。
2.DBProxyComponent:用於進行數據緩存保存和保存到數據庫操作。
3.DBComponent:連接數據庫。
4.DBCacheComponent:數據庫緩存組件。
5.DBTask類的子類DBSaveTask執行數據保存、DBSaveBatchTask批量數據保存、DBQueryTask查詢數據庫保存至數據緩存字典、DBQueryBatchTask批量查詢數據庫保存至數據緩存字典、DBQueryJsonTask用Json查詢數據庫保存至數據緩存字典。
三、數據庫讀寫
(1)、原版ET數據庫讀寫
1.創建需要讀寫的類,繼承Entity。
2.讀寫數據,調用DBProxyComponent類中的方法查詢或者保存。
查詢方法有Query<T>(long id, bool needCache = true)按類名的ID查詢、QueryBatch<T>(List<long> ids, bool needCache = true)批量按類名的ID查詢、QueryJson<T>(string json, bool needCache = true)按類名用json進行自定義查詢。
保存方法有Save(Disposer disposer, bool needCache = true)按保存類中數據、SaveBatch(List<Disposer> disposers, bool needCache = true)批量保存類中數據、Save(Disposer disposer, bool needCache, CancellationToken cancellationToken)定時保存超時取消保存,保存時需要 EntityFactory.CreateWithId<AAA>(IdGenerater.GenerateId());實例化需要保存的類,AAA為需要保存的類名。
(2)、棋牌Demo數據庫讀寫
1.創建需要讀寫的類,繼承EntityDB。
2.EntityDB類上方添加標簽 [BsonKnownTypes(typeof(AAA))],AAA為需要讀寫的類名。
3.讀寫方法與原版ET相同。
ET添加修改消息
消息發送接收路線:例如消息發送路線:客戶端–>網關服務器–>內部功能服務器–>網關服務器–>客戶端,游戲啟動時通過標簽將協議碼為鍵、消息類為值存入字典,將消息請求類作為鍵、消息處理類作為值存入字典,將消息通過下文第四步中的Session類由AChannel類Send發送,通過TCP或UDP發送到目標網關服務器,網關服務器接收到消息由網關消息助手類處理發給內部功能服務器,內部功能服務器處理的消息處理類處理,通過消息回復類作為載體將消息回傳消息給網關服務器,網關服務器消息處理助手類中由消息回復類作為載體接收好數據被消息處理助手類回傳給客戶端,客戶端用相同的消息回復類接收回傳的數據進行使用。
服務器收發消息通過網關服務器gate進行,gate接收消息后根據情況將消息分發給其它服務器處理,其它服務器處理后消息回傳給gate,再由gate發給客戶端。
內部功能服務器實現分布式服務器功能:除Manager管理服務器和Location轉發Actor的服務器之外的服務器均作為路由服務器,ActorProxyComponent消息管理組件作為路由信息存儲組件存儲本服務器使用的消息ID和ActorProxy類處理Actor消息類(發送、接收等),先讀取路由信息存儲組件中的緩存,緩存沒有的情況下會由ActorProxy通過LocationProxyComponent服務器消息處理狀態存儲組件向Location轉發Actor消息IP對應的編號、管理服務器發送key(Actor消息ID),Location服務器通過LocationComponent處理其它服務器發送的Actor消息ID獲取消息的對應的IP,請求IP對應編號的服務器通過ActorProxyComponent或UnitGateComponent類讀取IP編號,然后通過IP編號能獲取到對應的IP和端口,從而發送消息給目標服務器。從Location服務器收到的Actor消息IP對應的服務器IP編號會存儲在本地服務器緩存。
此分布式服務器框架如果不夠用,瓶頸在於Location服務器的消息處理速度,可增加location服務器數量解決:在將Actor消息的ID與與所在服務器的IP對應編號作為消息傳給所有Location進行進行同ETDemo中Location服務器相同的處理,在處理Actor消息時,只需要向多個location服務器中的任意一個發送消息即可獲取到Action消息對應的IP編號。此方法瓶頸在於location服務器內能存儲的Action消息ID和IP編號的鍵值對個數。
此分布式服務器框架類似於即時通信服務器架構中的一種,Location服務器提供存儲和查詢目標消息服務器的IP服務:
https://www.cnblogs.com/myd620/p/6081100.html 即時通信服務器架構
http://blog.csdn.net/u010738184/article/details/49472795
https://www.cnblogs.com/liulun/p/3625941.html
一、Actor消息
1.在協議碼類Opcode類添加協議碼。
2.在OuterMessage文件中添加消息類。
如果需要序列化添加protobuf序列化標簽[ProtoContract]
注冊消息標簽[Message(Opcode.Frame_ClickMap)]
幀消息繼承幀同步抽象類AFrameMessage
添加protobuf屬性序列化標簽[ProtoMember(int a)],a為唯一
3.添加消息實現類。
添加消息實現標簽[MessageHandler((int)Opcode.XX)],XX參數為對應的消息協議碼
繼承消息實現的抽象類AMHandler<BB>,BB參數為對應消息的消息類,需要序列化則添加protobuf相關標簽。此類為消息接收方接收到消息后處理消息的類。
4.添加消息轉發組件
5.發送消息
通過SessionComponent類中SessionComponent.Instance.Session調用Session中的方法發送消息。
客戶端:
服務端:
附:來自TIM的在線文檔”ET框架筆記”,點擊查看:
https://docs.qq.com/doc/BBHvys04uyFR11t2171PDPa34yGBCe2XqPFc3