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