fgui的ui管理框架_DCET: Unity3D客户端和.Net Core服务器双端框架,支持代码全热更(包括FGUI和双端行为树)...
簡介
DCET是Unity3D客戶端和.Net Core服務器的雙端框架。
DCET與ET的差異
DCET是基于ET4.0、5.0、6.0進行二次開發的分支版本,主要差異如下:
移除UGUI模塊;
新增FGUI模塊,包括UI加載、UI管理、UI控件管理代碼自動生成插件等完整的FGUI工作流;
新增行為樹模塊,包括可視化編輯器、雙端運行時、邏輯全熱更的完整的行為樹工作流;
新增Lua模塊,包括CSharp.Lua(自動翻譯熱更層代碼為Lua)、xLua(執行CSharp.Lua翻譯的熱更層Lua代碼)、RapidJson、lua-protobuf、LuaSocket、LPeg、FFI for lua53等完整的Lua熱更工作流。
將框架模塊化,并使用Unity的PackageManager進行管理,可以根據項目需求,按需選擇模塊引用。同時將框架和游戲業務分離,使維護框架代碼更方便。
入門
1.搭建環境
?第一步:下載DCET,下載的方式分為三種:
使用Git命令進行下載,通過Git命令行工具,輸入:git clone https://github.com/DukeChiang/DCET.git 目標文件夾(如:D:/WorkSpace/DCET),回車即可下載。
使用SourceTree等可視化工具進行下載,找到Clone功能,輸入源路徑:https://github.com/DukeChiang/DCET.git,選擇目標路徑:D:/WorkSpace/DCET(示例),然后點擊Clone。如果Clone失敗,可以嘗試方式2進行下載,然后使用Add功能進行可視化管理。
?第二步:下載并安裝Unity2018.4.12f1,有兩種下載方式,根據自己的情況選擇一種方式下載,只需要能正常使用相應版本的Unity即可,理論上是支持大多數的Unity的版本的,不過由于Unity版本眾多,如果需要在其他版本的Unity中使用,需自行適配。下載地址如下:
?第三步:安裝VS2019,在安裝Unity時,可以選擇安裝VS2019,或者通過VS官網下載(https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=Community&rel=16),然后安裝的時候選擇:.NET桌面開發、使用C++桌面開發、使用Unity的游戲開發(可以去掉Unity編輯器安裝)、使用C++的Linux開發、.Net Core跨平臺開發。推薦安裝以上組件,在DCET開發中都可能用到。
2.運行指南
?第一步:啟動服務器:搭建環境完成之后,打開Server/Server.sln解決方案,點擊生成解決方案,如果控制臺輸出的日志中,所有項目都生成成功,即可點擊“Start”啟動服務器。如果控制臺輸出的日志中提示存在生成失敗的項目,則很可能是環境不全導致,右鍵點擊“DCET.Init”項目,點擊屬性,查看目標框架.NET Core 3.0是否正常安裝,如果未安裝,則需要下載并安裝(https://dotnet.microsoft.com/download),如果安裝之后,目標框架依然沒有.NET Core 3.0,說明VS版本過低,更新到最新版即可解決。
?第二步:啟動客戶端:打開Unity2018.4.12f1,點擊Open,選擇DCET路徑下的Unity目錄,點擊選擇文件夾,即可啟動DCET客戶端。此時,打開“Scenes/Init”場景,點擊運行按鈕,即可成功運行,點擊登錄,點擊進入地圖,然后就可以右鍵點擊屏幕,看到骷髏移動的狀態同步的官方示例。如果運行中,點擊登錄提示“System.Exception: Rpc error”,一般情況下是服務器未成功啟動,需要檢查第一步是否未完成。如果運行中,出現異常“XLua.LuaException: F:/DukeChiangGit/ET/Unity/Assets\Res/Lua/Hotfix/Message/AutoGeneratedCode/OuterMessage.lua.txt:600: attempt to call a nil value (method 'setIsRequired')”,一般情況下是未生成Wrap文件,點擊菜單欄XLua/Generate Code生成即可。
3.開發指南
?為了框架代碼維護更方便,且按需引用更方便,現已將框架模塊化,并通過Unity的PackageManager和Assembly Definition進行管理,所以相對于ET的目錄結構會存在一定的差異,但實際功能幾乎沒有差別。下文將分別闡述服務器和客戶端的開發指南。
服務器:服務器代碼所在目錄為DCET/Server,并通過DCET/Server/Server.sln解決方案管理所有項目(包括框架和游戲業務),框架代碼所在目錄為DCET/Server/Packages,具體的項目將在進階文檔中詳細介紹。游戲業務代碼所在目錄為DCET/Server/Assets,分為Init、Runtime、Hotfix、Benchmark四個項目,其中Init為入口項目,Runtime為非熱更項目、Hotfix為熱更項目、Benchmark為測試項目,依賴關系為Init→Benchmark→Hotfix→Runtime。
客戶端:客戶代碼所在目錄為DCET/Unity,并通過DCET/Unity/Unity.sln解決方案管理所有項目(包括框架和游戲業務),框架代碼所在目錄為DCET/Unity/Packages,具體的項目將在進階文檔中詳細介紹。游戲業務代碼所在目錄為DCET/Unity/Assets,分為Runtime、Hotfix、Editor三個項目,其中Runtime為入口項目和非熱更項目、Hotfix為熱更項目、Editor為編輯器項目,依賴關系為Editor→Hotfix→Runtime,Runtime通過反射或Lua的方式啟動Hotfix,所以不需要Runtime依賴Hotfix。
?值得注意的是框架和游戲業務的依賴關系為:游戲業務→框架,依賴不當將導致項目混亂,不利于維護。
?注:“A→B”表示A引用B,可以理解為A可以調用B,B不可以調用A。
進階
1.模塊概述
?DCET分為核心、下載器、配置、網絡、協程鎖、數值、尋路、行為樹、FGUI、Lua模塊, 每個模塊一般分為Editor、Runtime、Hotfix三個項目(程序集),其中Editor為編輯器相關功能,Runtime為非熱更相關功能,Hotfix為熱更相關功能,依賴關系為Editor→Hotfix→Runtime。而模塊間的依賴關系為Lua模塊→其他模塊→核心模塊,用戶可以遵循依賴關系輕松的移除或新增模塊。
?注:客戶端引用通過Assembly Definition進行管理,擴展名為.asmdef,存放于各模塊的各個文件夾根目錄;服務器引用通過項目名/依賴項右鍵進行管理。
2.核心模塊
?核心模塊是其他模塊的基礎,主要提供實體化(組件化)和事件系統的基礎功能支持,也是ET框架設計中最為精髓的部分。所在目錄為:Packages/DCET.Core,下文將重點介紹這兩個方面:
Entity
?Entity即為實體,是經過純粹的ECS不斷改良而來的實體化開發思想,他與Unity的GameObject有一定的相似之處,但又截然不同,具體的不同點在于Unity是采用的Entity+Component的設計思想,而ET采用的是一切皆Entity的設計思想,同時Entity也擁有Component的能力,這種設計將為代碼組織和重用帶來極大的便利,整個代碼結構就可以像樹狀圖一樣清晰,并且代碼也將可以像樹枝一樣被輕松的組合重用。舉個例子,角色有技能列表,各個技能操作方式不同,有直接使用型、有充能型。
public class Role : Entity
{
// 角色相關信息
}
public class SkillComponent : Entity
{
private readonly Dictionary idSkills = new Dictionary();
// 技能增刪查等管理方法
}
public class Skill : Entity
{
// 技能相關信息
}
public class SkillChargeComponent : Entity
{
public void Start()
{
// 充能開始
}
public void End()
{
// 充能結束
}
}
?根據以上示例可以看出,當為充能型技能時,可以為Skill加上SkillChargeComponent組件,技能釋放時就可以走充能邏輯;當技能為直接釋放型技能時,則不需要加SkillChargeComponent組件,也就不會走充能邏輯,這樣一來則可以輕松重用代碼邏輯,并且代碼組織結構也十分清晰。
?此外,Entity與Unity的MonoBehaviour一樣存在生命周期,而ET的生命周期實現方式略有不同,是通過Attribute標記和啟動時根據標記信息自動注冊,然后根據生命周期執行,具體用法如下:
[ObjectSystem]
public class TestComponentAwakeSystem : AwakeSystem
{
public override void Awake(TestComponent self, string param1)
{
self.Awake(param1);
}
}
[ObjectSystem]
public class TestComponentLoadSystem : LoadSystem
{
public override void Load(TestComponent self)
{
self.Load();
}
}
[ObjectSystem]
public class TestComponentUpdateSystem : UpdateSystem
{
public override void Update(TestComponent self)
{
self.Update();
}
}
[ObjectSystem]
public class TestComponentLateUpdateSystem : LateUpdateSystem
{
public override void LateUpdate(TestComponent self)
{
self.LateUpdate();
}
}
[ObjectSystem]
public class TestComponentDestroySystem : DestroySystem
{
public override void Destroy(TestComponent self)
{
self.Destroy();
}
}
EventSystem
?EventSystem即為事件系統,是解耦的重要方式。代碼和現實世界一樣,有著千絲萬縷的聯系,如果所有的聯系都如同亂麻一般緊密的耦合在一起,將對代碼的維護造成巨大的困難。這時候就需要將代碼以類為單位,將類引用和事件(或委托)作為聯系的橋梁,其中類引用是一種強聯系的方式,這種方式是最直接,最簡單,最方便,最緊密的聯系方式,但如果僅僅只用這種聯系方式也會造成代碼混亂,耦合緊密,難以重用,難以維護的結果。這時候也就需要事件(或委托)進行聯系,也就是解耦(一種弱聯系),當被引用類同時需要引用引用類時,就需要通過這種方式進行聯系,這種方式是能為重用創作條件、避免代碼形成網狀結構的聯系方式。最終代碼結構就形成樹狀結構,清晰明了,利于重用和維護。
?ET的事件系統實現方式,與上文提到的生命周期實現方式原理相同,具體的用法如下:
// 發起事件
Game.EventSystem.Run(EventIdType.Log, "Hello World");
// 捕獲事件
[Event(EventIdType.Log)]
public class Log_WriteLine: AEvent
{
public override void Run(string param1)
{
Console.WriteLine(param1);
}
}
3.AssetBundle模塊
?AssetBundle模塊主要負責資源打包、管理、下載等功能,所在目錄為:Packages/DCET.AssetBundle,具體的使用方法如下:
?配置資源服務器地址和服務器地址:Tools/Start Global Config
?構建資源包和安裝包:Tools/Build Installer (默認只會打包Init場景)
?啟動資源服:Tools/Start Asset Server
?資源管理組件:Hotfix/ResourcesComponent.cs
4.配置模塊
?配置模塊主要負責Excel配置表導出、解析、管理等功能,所在目錄為:Packages/DCET.Config,具體的使用方法如下:
?Excel配置表導出:Tools/Start Config
?配置表管理組件:Hotfix/ConfigComponent.cs
5.網絡模塊
?網絡模塊主要負責網絡消息收發、消息序列化/反序列化、消息管理、TCP/KCP傳輸協議,服務器啟動、更新、管理等功能,所在目錄為:Packages/DCET.Config,具體使用方法如下:
?生成Protobuf消息協議:Tools/Gen Proto
?服務器同步:Tools/Rsync
?服務器命令行:Tools/Start Server Command
?服務器重載:Tools/Start Server Manager
?消息分發組件:MessageDispatcherComponent.cs
?網絡數據發送組件:NetOuterComponent.cs (可以配置TCP/KCP/WebSocket傳輸協議)
?網絡數據接收組件:NetInnerComponent.cs (可以配置TCP/KCP/WebSocket傳輸協議)
6.協程鎖模塊
7.數值模塊
8.尋路模塊
9.行為樹模塊
10.FGUI模塊
11.Lua模塊
高級
1.xLua+CSharp.Lua適配原理
FAQ
待更新
技術支持
ET群:474643097
DCET新群:1105670843
總結
以上是生活随笔為你收集整理的fgui的ui管理框架_DCET: Unity3D客户端和.Net Core服务器双端框架,支持代码全热更(包括FGUI和双端行为树)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求素数: 一般线性筛法 + 快速线性筛法
- 下一篇: asp.net ajax控件工具集 Au