Unityclient框架笔记二(组件实体开发模式的思考)

Unity的Entity-Component-System实现的很美丽,很灵活。许多文章也对这样的组件实体的开发模式倍加推崇。由于它契合这么一条规则:优先使用组合而不是继承。

可是实际开发过程中,限制于我的个人能力。想实现一个相同美丽的基于组件的MMO框架是很困难的一件事情。

这篇文章是个人开发过程中的一些思考,实际上。所谓美丽的框架是因人而异的。而且不一定是必须的,可以用自己熟悉的方式高速的完毕项目的开发就足够了。仅仅要开发过程不会感觉别扭,代码也不会把自己或其它人恶心到,策划改动需求的时候不会骂娘。后期不会出现各种难以调试的Bug。那么就是美丽的框架。

从理论上说,所谓ECS就是一个Entity,持有一组Component。然后通过一系列的System来维护调度组件之间的逻辑。组件之间是相对独立的,最理想的方式是通过Event来进行消息传递。从这点来说Unity已经实现的很美丽了,GameObject能够绑定随意的MonoBehaviour,脚本组件有统一的入口,而且能够通过SendMessage发送消息。也能够通过GetComponent来获取一个详细的组件。直接调用其函数。

我反编译了一大堆线上手游的源码。差点儿没有全然依赖组件模式进行开发的,很多其它的还是依赖一套继承体系来完毕。这里我自己的感觉就是偏底层或者逻辑独立性很强的功能适合组件模式,而逻辑交互很复杂的情况,过分依赖组件模式想要达到“理想”的效果,反而会适得其反。

比方,理论上ECS中。Entity应该像GameObject一样,仅仅维护组件。不包括不论什么其它逻辑或者代码,全部须要调度的逻辑都应该放在System中,它会关注它负责的Component。 然而,在我看来,这样反而分割了逻辑。在实际项目中。要么非常难做到这种分离,要么会让代码变得非常散,难以维护。当查Bug的时候,不会由于这种代码分离变得轻松。反而会由于结构的散乱造成无从着手的情况。

再说组件之间的消息通信。当游戏所有以组件方式来实现,而且组件之间通过消息来完毕调用或者參数传递。这种代码非常难写,而且非常难维护。事件从哪里抛出的,谁应该接受这个事件,持有哪些參数,这些都非常不直观。尽管达到了灵活的效果,可是副作用也非常明显,代码中充斥着各种各样的Event。非常难通过简单的查看、跟踪、调试理清楚游戏的脉络。

《Domination》是这样实现的,一个EntityController,里面包括所有的组件,而且提供相应的接口。它能够通过相应的配置文件决定创建哪个组件。而外部仅仅维护一个EntityController,不管是Soldier还是Building,它都是一个Entity。仅仅只是一个挂接的是SoldierAttackComponent。一个挂接的是BuildingUpgradeComponent。从而产生不同的行为。

这样的实现方式给我一定的启示。由于它某种程度上说是符合ECS的。可是不得不说这样的实现方式也非常奇葩。EntityController非常庞大,尽管它没有维护详细的逻辑,可是单单是维护Component的接口就让它的代码达到几千行,更不要说它概念上的庞大了。

《永恒战士3》的实现相对正统,是现阶段我能够接受的组件模式。只是严格说来这已经不是组件模式,而是组合代替继承的一种实现方式。它有一个ActionController。里面持有各种各样的Agent,如AIAgent  AttackAgent  MoveAgent等等,外部主要与ActionController进行交互。而内部则通过这些Agent分散代码和功能。

Unity官方出的游戏《大天使》在我看来非常的Low。

宣传视频非常酷,可是实际游戏玩起来非常渣,不管是画面表现。还是游戏可玩性。

不得不说,专业做游戏的和专业做引擎的确实不是一个工种。就其代码来说,它作为Unity官方出品的游戏。居然没有体现Unity最先进的生产力,这实在是Low爆了。它的寻路是A* Path Finding Pro,界面是NGUI,动画是老的动画系统Animation。代码组织上强烈依赖接口设计,一个Actor继承自IBuffable  IHealthable  ITakeDamage等等接口,非常正统。可是也没有什么亮点。

一些日韩排行榜霸榜的游戏。如《白猫》《钢铁骑士团》,事实上代码结构一点也不美丽,一个StageObj有几千行。

从这点来说过分关注结构反而是没有意义的,那么多畅销游戏。事实上实现的一点儿也不灵活。

自己习惯,好用,就足够了。

其它还有非常多游戏,只是基本上大同小异。除去一些奇葩的实现外,基本上都是通过继承体系完毕基础的对象抽象,然后通过组件将对象中比較大或者独立的功能抽离出来。如状态机组件、AI组件、动画组件、角色属性组件等等。

另外,有一点是很统一的,就是有限状态机的使用,基本上全部的游戏都是通过FSM来完毕角色的状态流转的。ARPG尤其如此。少部分的游戏的AI部分可能用到行为树。差点儿没有见过仅仅通过行为树,而不依赖状态机控制角色的。

在我想来,行为树每次都要进行整棵树的遍历,不管是从设计上说。还是效率上说都不适合游戏角色的行为描写叙述。而行为树所擅长的AI方面。一般简单的游戏通过状态机来维护就足够了。

时间: 2024-10-11 20:51:45

Unityclient框架笔记二(组件实体开发模式的思考)的相关文章

Unity客户端框架笔记二(组件实体开发模式的思考)

Unity的Entity-Component-System实现的非常漂亮,非常灵活.很多文章也对这种组件实体的开发模式倍加推崇.因为它契合这么一条规则:优先使用组合而不是继承. 但是实际开发过程中,限制于我的个人能力,想实现一个同样漂亮的基于组件的MMO框架是非常困难的一件事情. 这篇文章是个人开发过程中的一些思考,实际上,所谓漂亮的框架是因人而异的,并且不一定是必须的,能够用自己熟悉的方式快速的完成项目的开发就足够了.只要开发过程不会感觉别扭,代码也不会把自己或其他人恶心到,策划修改需求的时候

如何理解Unity组件化开发模式

Unity的开发模式核心:节点和组件,组件可以加载到任何节点上,每个组件都有 gameobject 属性,可以通过这个属性获取到该节点,即游戏物体. 也就是说游戏物体由节点和组件构成,每个组件表示物体的一种特性(能力). 可以按照三条线路去理解Unity的组件化开发模式: 1.场景树. 场景树由节点构成,使用了整体与局部的思想,如父亲节点移动,孩子节点会跟随移动,不用每个都去移动. Transform组件是每个节点必备的节点,并且记录了父亲节点与孩子节点之间的关系. 2.渲染关系 Mesh组件:

组件化开发的一些思考

看了limboy和Casa的文章,关于组件化开发,整理了一下思路. 1.为什么要进行组件化开发? 一个产品,在最开始的时候,由于业务简单,一般是直接在一个工程里开发.这种方式,在产品起步阶段,是没有问题的,也能够有效的保证开发效率.但随着业务的不断发展,代码量不断增多,开发团队不断壮大,最后的模块间关系会发展成如下图所示: 从上图中可以看到,这种单一工程开发模式存在一些弊端: 模块间耦合严重(模块是指较大粒度的业务功能.比如说微信,我们根据首页Tab,可以分为四大模块:会话.通讯录.发现.我).

关于前端组件化开发的一点思考

前端开发与其他程序开发的共性在于,同样要求“高内聚,低耦合,易读写,可复用”. “高内聚”是指将在逻辑上可以归类为一个单元的代码封装在一起,尽量保障一块代码集合主要解决一个需求,在前端开发中,最常见的便是将一个逻辑单元的代码使用IIFE函数进行封装. 可以说,保障代码高内聚即在一定程度上满足了代码“低耦合”的要求,因为低耦合即是要求一个逻辑单元的代码块在改动时,不会造成其他逻辑单元代码块的变动,在前端开发中,即是要求各代码块不要过多共享某变量或对象,在不得以的情况下,一定要清晰注释. “易读写”

ReactJS学习笔记(二)-组件嵌套与组件复用

我们终要远行,最终告别稚嫩的自己. 使用React来构建web应用,每个页面都将是多个组件组成,并且相互嵌套来构成的,接下来就学习下组件的嵌套. 一.组件嵌套: 背景交代: 1.创建一个html,包含引用的相关js.需要被渲染的div: 2.创建一个有label与input标签组成的简单组件 - IvanInput,并可以通过传入数组来渲染多组label与input标签,拥有不同的label名称.inputType.inputRef.inputName及input的onChange事件: 3.创

关于软件公司开发模式的思考

做了多年j2ee方向软件产品研发,看着周围的同事换了一拨又一拨,于是忍不住反思:对于软件公司来说最最重要的莫过于人,而人员变动无论是对于产品还是项目损伤都很大,为什么仍然不能引起公司领导的高度关注呢? 不可否认每个人都有每个人需要面对的现实情况,例如需要回家娶妻生子,等等诸多原因.而只要细细想法挖掘我们就不难发现问题的根源出现在随着房租物价等生活成本的逐渐上升,而薪资却总是迟迟不动亦或者缓慢上行.在付出和回报引起员工心理失衡时,那么结局就显而易见. 毕竟大家出来混,说理想没有错,说抱负也是对的,

慕课网实战—《用组件方式开发 Web App全站 》笔记二

运用HTML5.CSS3.JS流行技术,采用组件式开发模式,开发Web App全站!技术大牛带你统统拿下不同类型的HTML5动态数据报告! <用组件方式开发 Web App全站 > 项目JS类开发 静态页思路验证 jQuery全屏滚动插件fullPage.js ??使用参考:Fullpage入门指南 组件切换,入场,出场动画 ???? DOM事件循环传播-无限循环 ??使用return false;或者triggerHander()方法阻止事件向上传播. 相关代码 HTML <body&

慕课网实战—《用组件方式开发 Web App全站 》笔记七-饼图和环图组件开发

运用HTML5.CSS3.JS流行技术,采用组件式开发模式,开发Web App全站!技术大牛带你统统拿下不同类型的HTML5动态数据报告! <用组件方式开发 Web App全站 > 饼图开发(绘制饼图准备) 饼图实现原理 饼图开发(绘制饼图) 代码 /* 饼图组件对象 */ var H5ComponentPie =function ( name, cfg ) { var component = new H5ComponentBase( name ,cfg ); // 绘制网格线 - 背景层 v

慕课网实战—《用组件方式开发 Web App全站 》笔记五-折线图组件开发

运用HTML5.CSS3.JS流行技术,采用组件式开发模式,开发Web App全站!技术大牛带你统统拿下不同类型的HTML5动态数据报告! <用组件方式开发 Web App全站 > 折现图绘制大致步骤 折线图画布 JavaScript CSS 折线图绘制网格线 // 水平网格线 100份 -> 10份 var step = 10; ctx.beginPath(); ctx.lineWidth = 1; ctx.strokeStyle = '#AAAAAA'; window.ctx = c