2 Star 1 Fork 2

fyindex/DCET

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

简介

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/

MIT License Copyright (c) 2018 tanghai Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

Unity3D客户端和.Net Core服务器双端框架,支持代码全热更(包括FGUI和双端行为树) 展开 收起
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C#
1
https://gitee.com/fyindex/DCET.git
git@gitee.com:fyindex/DCET.git
fyindex
DCET
DCET
dukechiang_master

搜索帮助