游戏开发论坛

 找回密码
 立即注册
搜索
查看: 24420|回复: 7

实体-组件-系统(ECS)实现数据驱动的游戏框架

[复制链接]

17

主题

44

帖子

271

积分

中级会员

Rank: 3Rank: 3

积分
271
发表于 2014-7-5 09:21:19 | 显示全部楼层 |阅读模式
一. 数据驱动/消息驱动?

            由于之前做的项目中游戏逻辑的架构都是以事件/消息驱动功能的方式实现,虽然结构清晰功能模块和游戏模块划分清晰但在做的过程中遇到过很多问题。直到最近项目中遇到一种游戏框架 ECS 以数据驱动逻辑的框架,才豁然开朗。

      以主角行走功能为例,只需找到主角组件修改其速度,方向及动作属性,在行走系统中根据速度方向移动主角对象,并根据当前动作属性播放行走动作。从而实现数据驱动逻辑。
      
二.实体-组件-系统(ECS)基本结构


                 实体是游戏中的基本单元包含多个组件,组件是一些属性的集合(一般组件没有方法),而系统则是针对某一属性集合的逻辑处理。

                 例如: 主角可以作为一个实体(Entity), 主角又包含很多组件 如移动相关组件MoveCompent包含了速度 朝向等属性, 渲染组件RenderCompent包含了avatar信息 缩放等信息。 而系统的作用则是针对每个组件的功能实现, 如对应移动有MoveSystem用来控制主角移动 RenderSystem用来控制渲染等。

                ECS 的基本思想就是数据与逻辑分离,数据的改变驱动逻辑的变化,实体组件中只存放数据属性,系统中仅仅针对所关心的组件们进行逻辑处理。


三.实体-组件-系统(ECS)结构



98

主题

784

帖子

4493

积分

版主

Rank: 7Rank: 7Rank: 7

积分
4493
发表于 2014-7-5 21:10:52 | 显示全部楼层
是Component吧……Entity System思路,System关心Component,作为司令部指挥事件。

21

主题

45

帖子

648

积分

高级会员

Rank: 4

积分
648
发表于 2014-7-5 22:00:09 | 显示全部楼层
文章太短,求详细

17

主题

44

帖子

271

积分

中级会员

Rank: 3Rank: 3

积分
271
 楼主| 发表于 2014-7-7 09:16:19 | 显示全部楼层
猴与花果山 发表于 2014-7-5 21:10
是Component吧……Entity System思路,System关心Component,作为司令部指挥事件。

对的 对的 多谢指正

31

主题

257

帖子

1752

积分

金牌会员

申城谍影

Rank: 6Rank: 6

积分
1752
QQ
发表于 2014-7-7 10:45:40 | 显示全部楼层
可否举些例子?

17

主题

44

帖子

271

积分

中级会员

Rank: 3Rank: 3

积分
271
 楼主| 发表于 2014-7-9 09:47:40 | 显示全部楼层
cndv3996 发表于 2014-7-7 10:45
可否举些例子?

比如 游戏中每一个玩家都是一个实体  这个实体有很多的组件组成 以管理移动的MoveComponent组件为例(该组件只包含移动相关数据 如 当前位置 朝向 速度 等) 每个组件都有一个对应的系统来处理相关逻辑 为此需要有个MoveSystem系统对游戏中所有包含MoveComponent组件的实体进行移动控制 当玩家移动时只需要更改某玩家实体中MoveComponent组件中的数据  移动逻辑在MoveSystem中处理 这就是数据驱动逻辑

31

主题

257

帖子

1752

积分

金牌会员

申城谍影

Rank: 6Rank: 6

积分
1752
QQ
发表于 2014-7-9 10:02:00 | 显示全部楼层
新撰组 发表于 2014-7-9 09:47
比如 游戏中每一个玩家都是一个实体  这个实体有很多的组件组成 以管理移动的MoveComponent组件为例(该 ...

具体在游戏中咋实现呢?

一个组件是一个类?共同继承自一个CBaseConmponent基类?
玩家类里,保存一个各种组件基类指针数组,

对于移动,另外搞一个移动组件manager类?
在主循环里,改变组件中的值?

玩家类显示时,读组件数组中移动组件的值?

17

主题

44

帖子

271

积分

中级会员

Rank: 3Rank: 3

积分
271
 楼主| 发表于 2014-7-10 10:09:50 | 显示全部楼层
cndv3996 发表于 2014-7-9 10:02
具体在游戏中咋实现呢?

一个组件是一个类?共同继承自一个CBaseConmponent基类?

对 每个组件就是一个类 或者说结构体  因为它本身是不包含任何方法的 只是数据 每种类型的组件有对应类型的system处理相关逻辑  组件值的改变可能是在主循环中 也可能是消息触发的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-26 02:21

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表