简介ET框架是类ECS的一个Unity前后端框架论坛地址为:https://et-framework.cnGit地址为:https://github.com/egametang/ET预备知识Unity程序集的使用接入流程本文将会以7.2版本进行分析。所以直接clonegithub上的仓库,将工程导入到本地,之后将分支切换到最新的release分支,"release7.2"菜单栏相关ENABLE_CODE选项ET->ChangeDefine->ADD_ENABLE_CODE/REMOVE_ENABLE_CODE一般在开发阶段使用Editor时需要启用ENABLE_CODE选项。该选项启用时,修改
cmd 输入验证 dotnet--version path:添加 cmd 输入mongo验证Unity2020.3.35f1c2安装Rider=》取消波浪线showcontextaction=》configtionispectionsevity运行:重新编译Unitymono和Client-Server服务器日志:打开Unity项目设置为Mono使用Tool-BuidlCode重新编译 打包运行发现打包报错:安装VS
1.前言ET算是我刚接触客户端时最早知道的框架,ET我最初眼馋的还是他的双端功能。包揽前后端的功能,这个很有吸引力。但是那时候对我来说这框架太复杂了,没法看。这两天又来看看,曾经很多不懂的地方现在都能看懂了,看了之后发现这框架还是不适合我,原因总结里再说,在这里做一下记录。首先说一下很多新手看这个框架的疑惑点,再说一下ET最有特色的几个功能:ETTask、事件系统、双端开发。2.新手常见问题这些问题是我以一个新手的视角来看的。也是我最初接触这个框架以来有疑惑的地方。2.1目录结构问题这里以7.2的目录为例。ET6就不用看了,就是闹着玩儿。代码位置主要关心以下三个目录,其中Share文件夹下主要
1.前言ET算是我刚接触客户端时最早知道的框架,ET我最初眼馋的还是他的双端功能。包揽前后端的功能,这个很有吸引力。但是那时候对我来说这框架太复杂了,没法看。这两天又来看看,曾经很多不懂的地方现在都能看懂了,看了之后发现这框架还是不适合我,原因总结里再说,在这里做一下记录。首先说一下很多新手看这个框架的疑惑点,再说一下ET最有特色的几个功能:ETTask、事件系统、双端开发。2.新手常见问题这些问题是我以一个新手的视角来看的。也是我最初接触这个框架以来有疑惑的地方。2.1目录结构问题这里以7.2的目录为例。ET6就不用看了,就是闹着玩儿。代码位置主要关心以下三个目录,其中Share文件夹下主要
类似魔兽世界,moba这种技能极其复杂,灵活性要求极高的技能系统,必须需要一套及其灵活的数值结构来搭配。数值结构设计好了,实现技能系统就会非常简单,否则就是一场灾难。比如魔兽世界,一个人物的数值属性非常之多,移动速度,力量,怒气,能量,集中值,魔法值,血量,最大血量,物理攻击,物理防御,法术攻击,法术防御,等等多达几十种之多。属性跟属性之间又相互影响,buff又会给属性增加绝对值,增加百分比,或者某种buff又会在算完所有的增加值之后再来给你翻个倍。普通的做法:一般就是写个数值类:classNumeric{publicintHp;publicintMaxHp;publicintSpeed;//
ActorLocationActor模型只需要知道对方的InstanceId就能发送消息,十分方便,但是有时候我们可能无法知道对方的InstanceId,或者是一个Actor的InstanceId会发生变化。这种场景很常见,比如:很多游戏是分线的,一个玩家可能从1线换到2线,还有的游戏是分场景的,一个场景一个进程,玩家从场景1进入到场景2。因为做了进程迁移,玩家对象的InstanceId也就变化了。ET提供了给这类对象发送消息的机制,叫做ActorLocation机制。其原理比较简单:因为InstanceId是变化的,对象的Entity.Id是不变的,所以我们首先可以想到使用Entity.Id
Actor模型Actor介绍在讨论Actor模型之前先要讨论下ET的架构,游戏服务器为了利用多核一般有两种架构,单线程多进程跟单进程多线程架构。两种架构本质上其实区别不大,因为游戏逻辑开发都需要用单线程,即使是单进程多线程架构,也要用一定的方法保证单线程开发逻辑。ET采用的是单线程多进程的架构,而传统Actor模型一般是单进程多线程的架构,这点是比较大的区别,不能说谁更好,只能说各有优势。优劣如下:逻辑需要单线程这点都是一样的,erlang进程逻辑是单线程的,skynetlua虚拟机也是单线程的。ET中一个进程其实相当于一个erlang进程,一个skynetlua虚拟机。采用单线程多进程不需要
事件机制EventSystemECS最重要的特性一是数据跟逻辑分离,二是数据驱动逻辑。什么是数据驱动逻辑呢?不太好理解,我们举个例子一个moba游戏,英雄都有血条,血条会在人物头上显示,也会在左上方头像UI上显示。这时候服务端发来一个扣血消息。我们怎么处理这个消息?第一种方法,在消息处理函数中修改英雄的血数值,修改头像上血条显示,同时修改头像UI的血条。这种方式很明显造成了模块间的耦合。第二种方法,扣血消息处理函数中只是改变血值,血值的改变抛出一个hpchange的事件,人物头像模块跟UI模块都订阅血值改变事件,在订阅的方法中分别处理自己的逻辑,这样各个模块负责自己的逻辑,没有耦合。ET提供了
一切皆实体目前十分流行ECS设计,主要是守望先锋的成功,引爆了这种技术。守望先锋采用了状态帧这种网络技术,客户端会进行预测,预测不准需要进行回滚,由于组件式的设计,回滚可以只回滚某些组件即可。ECS最重要的设计是逻辑跟数据的完全分离。即EC是纯数据,System实际上就是逻辑,由数据驱动逻辑。数据驱动逻辑是什么意思呢?很简单通过Update检测数据变化,通过事件机制来订阅数据变化,这就是所谓的数据驱动了。其它的特点例如缓存命中,在编写逻辑上来说并不太重要,现代游戏都用脚本,连脚本的性能都能容忍怎么会在乎缓存命中那点性能提升?ET在设计的时候吸收了这些想法,但是并不完全照搬,目前的设计是我经过长
单线程异步前面几个例子都是多线程实现的异步,但是异步显然不仅仅是多线程的。我们在之前的例子中使用了Sleep来实现时间的等待,每一个计时器都需要使用一个线程,会导致线程切换频繁,这个实现效率很低,平常是不会这样做的。一般游戏逻辑中会设计一个单线程的计时器,我们这里做一个简单的实现,用来讲解单线程异步。//example2_3classProgram{privatestaticintloopCount=0;privatestaticlongtime;privatestaticActionaction;staticvoidMain(string[]args){Console.WriteLine($