标签DCET下的文章

DukeChiang 发布于 05月03, 2020

DCET官方文档

简介

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,下载的方式分为三种:

  • 直接下载压缩包,通过下载地址:https://github.com/DukeChiang/DCET/archive/dukechiang_master.zip,进行下载。
  • 使用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的PackageManagerAssembly 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<long, Skill> idSkills = new Dictionary<long, Skill>();
    
        // 技能增删查等管理方法
    }
    
    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<TestComponent, string>
    {
        public override void Awake(TestComponent self, string param1)
        {
            self.Awake(param1);
        }
    }
    
    [ObjectSystem]
    public class TestComponentLoadSystem : LoadSystem<TestComponent>
    {
        public override void Load(TestComponent self)
        {
            self.Load();
        }
    }
    
    [ObjectSystem]
    public class TestComponentUpdateSystem : UpdateSystem<TestComponent>
    {
        public override void Update(TestComponent self)
        {
            self.Update();
        }
    }
    
    [ObjectSystem]
    public class TestComponentLateUpdateSystem : LateUpdateSystem<TestComponent>
    {
        public override void LateUpdate(TestComponent self)
        {
            self.LateUpdate();
        }
    }
    
    [ObjectSystem]
    public class TestComponentDestroySystem : DestroySystem<TestComponent>
    {
        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<string>
    {
        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

ET官网:http://bbs.etframework.net/

阅读全文 »

DukeChiang 发布于 05月25, 2019

DCET-5.0更新日志

DCET-5.0

2019.5.25 更新日志

  • 1.移除UGUI框架。
  • 2.加入FGUI框架,并兼容ET5.0。
  • 3.增加双端行为树共享变量组件,增加外部行为树设置,增加使用示例。

阅读全文 »

DukeChiang 发布于 05月25, 2019

DCET-4.0更新日志

DCET-4.0

2019.4.25 更新日志

  • 1.行为树增加共享变量,增加外部行为树设置,增加使用示例。
  • 2.优化FGUI框架。
  • 3.增加资源包管理插件AssetBundles-Browser-1.7.0。
  • 4.增加资源包分析标记工具 Tools/AssetBundles菜单下(包含资源零冗余分析标记)。
  • 5.优化ResourcesComponent保证Shader零冗余,并且防止Shader加载滞后和卸载再加载出现丢失(变紫)问题 。
  • 6.增加Clear工具,方便资源优化。
  • 7.增加引用加载器、预设光照贴图信息、相机深度贴图设置。

2019.2.14 更新日志

  • 1.增加双端行为树。
  • 2.增加FGUI框架及代码自动生成插件。
  • 3.UI框架分为Model层和Hotfix层,Model层不能热更一般只有一个下载资源页面,Hotfix层是全热更的。
  • 4.Unity/FairyGUI-Editor为UI编辑器软件目录;Unity/FGUIProject为本项目UI工程目录。

阅读全文 »

DukeChiang 发布于 05月25, 2019

DCET-FGUI2ET插件更新日志

DCET5.0-FGUI2ET

DCET4.0-FGUI2ET

v1.0.5

  • 1.插件新增资源url自动生成代码功能。
  • 2.修改ETComponent.template模板,增加FUI.Name默认名为空时设为Id,方便查询。
  • 3.修改ETPackage.template模板,将FGUIPackage改成FUIPackage,增加资源url生成模板。

v1.0.4

  • 1.为所有自定义组件缓存与GObject的映射,自动生成的代码会管理他们的Add和Remove,通过GObject.Get()获取。
  • 2.配合FGUI的Pool机制,设计了自定义组件的GetFromPool()方法。使用GetFromPool()获取/创建,Dispose回收,在创建之后也可以使用GObject.Get()获取,注意应该在GetPool 和 ToPool之间使用GetFromPool() 和 Dispose操作。

v1.0.3

  • 1.修改自定义参数(FGUI2ET.GetMemberByTypeOrName),命名不准确:Key=FGUI2ET.GetMemberByIndexOrName,Value=Index或Name或No。
  • 2.修复中文命名组件和包名的创建异常,但是不建议使用中文名,并且不允许使用中文属性名。
  • 3.所有的自定义组件全部继承自FUI,可以直接访问属性,挂在逻辑脚本。但是需要修改ET-FUI框架的FUI继承。如果不想改框架,可以自行修改ETComponent.template模板。暴露的参数基本可以满足自定义需求。

v1.0.2

  • 1.删除无用的Binder代码。
  • 2.增加Package名代码,不用手动添加FGUIType.Package名类型。
  • 3.结合ET-FGUI框架,自动生成ET-FGUIComponent代码,遵循ET-Component的生命周期。
  • 4.增加组件名前缀自定义功能,在(文件>项目设置>自定义属性)中配置:Key=FGUI2ET.ClassNamePrefix,Value=默认为空。
  • 5.生成组件中如果使用ETHotfix命名空间,可以在ETComponent.template中删除using ETHotfix;
  • 6.自定义组件本身不应该具有业务逻辑,所以自定义组件继承自Entity是为了在自定义组件上挂组件写逻辑,而不是直接在自定义组件的System中写逻辑,因为如果在自定义组件里写业务逻辑所有引用该组件的组件都会全部执行,不灵活。

v1.0.1

  • 1.解决自定义GComponent嵌套类型生成无效。
  • 2.修复自定义组件代码逻辑错误,并在Unity中测试创建组件实例通过。
  • 3.增加命名空间前缀自定义功能,在(文件>项目设置>自定义属性)中配置:Key=FGUI2ET.NameSpace,Value=默认为空。

v1.0.0

  • 1.将plugins、template目录放在FGUI安装根目录覆盖即可。
  • 2.插件会自动生成默认参数,若需要修改,在(文件>项目设置>自定义属性)中配置: Key=FGUI2ET,Value=Yes或No(开启关闭插件) Key=FGUI2ET.Outpath,Value=ETHotfix代码生成路径 Key=FGUI2ET.GetMemberByTypeOrName,Value=Type或Name或No(按名字、类型生成组件成员或者不生成)。
  • 3.在项目设置中,当包设置勾选了FGUI自身的代码生成,即不会生成ETHotfix代码(一般主工程使用)。

阅读全文 »