转发自:https://blog.csdn.net/u010019717/article/details/80378385
Normal Mode - 传统的Untiy OOP
Unity的GameObject和Component, 通过给GameObject 提供MonoBehaviour 来定义行为。有一种情况是使用一个Manager,并指示他们移动的功能
此外, 会有移动角色的组件。
例如,当一个名为Move的组件移动时,Move组件是通过GetComponent访问Transform得到并移动该对象
ECSmode-- ecs的oop
实体Entity:像容器一样
组件数据Component Data:要存储在实体中的数据(不包括处理逻辑,只存储数据)
组件系统ComponentSystem: 实现方法 类似实现处理函数
组Group:组件系统运行所需的ComponentData列表
MonoBehaviour有1:1的数据和处理,但在ECS中它处理的是 ComponentData的组合。
例如,ComponentData有Transform和 Move作为一组,并通过Group请求系统进行移动 。
处理时,称为变换和移动的组件信息直接传递到系统。
像这样,调用什么样的处理由System(和Group)的组合来决定,实体是在所有系统来匹配批处理。
如下表所示,可能很容易理解哪种处理将起作用。
无论如何,ECS被定义为ComponentData的组合…
流程
首先是实体,这是从EntityManager生成的。建议从头开始使用ComponentData生成实体,但您可以稍后添加它。
实体在游戏中有很多像GameObject一样的东西。在某种意义上,实体≈游戏对象。
.系统为每个实体执行处理。像下图所示 。
在两个系统的情况下,如果组匹配,都会工作。这可能在一个线程中运行,有时由C# Job System并行化。
例子1,
让我们考虑一个实体,它具有在碰到障碍物时简单的前向右转的功能。
考虑到表示此实体所需的ComponentData,它如下所示。
坐标
前方障碍的距离
运动方向
顺便说一句,如果你想用这个参数来实现运动,可以考虑下面的实现。
1、从“坐标coordinates”和“运动方向direction”中查找“到前方障碍物的距离distance and obstacle ”
2、如果“前方障碍物Obstacles in front of”小于某个值,则更改“移动方向direction of movement”
3、沿“移动方向movement”方向移动“坐标coordinate”
我把它们放入系统中。
系统负责实现 检查距离,更新方向, 更新坐标。 因为这些都是逻辑行为实现
例子2
那么,这次你想让一个实体像“朝指定坐标方向移动”那样?
这个实体似乎有以下ComponentData。
坐标
指定坐标
运动方向
系统看起来像。
1、从指定坐标和坐标中寻找移动方向
2、在移动方向的方向上移动坐标
那么,这是第二个系统,使用与例1中完全相同的东西。 由于请求组是相同的。
如果你很好地理解系统,系统在很大范围内是很好的,但是它也使得实现更加麻烦。似乎有必要考虑这里的平衡。
ComponentData组合的补充
它是ComponentData的组合,但实际上可以设置多个组。
例如,创建GameObjectEntity(只有一个)和Unit Entity(有很多)的组合,你可以期待的十日或一次全部停止根据游戏管理的情况下该股的操作。
另外,ComponentData不包含任何特别的内容,它有时指定ComponentData仅作为组的定义, 作为一个熊。
例如,如果你想有一个特殊处理,“熊猫”和“熊”是熊,需要PandaComponentData出现。
您可以对ComponentData进行添加,删除,设置(覆盖?)操作。也有点像游戏对象
谁调用了ComponentSystem?
到目前为止,有一点有趣的是“谁调用系统?”
定义后自动调用!!!!!应该是世界在调用吧1
但是调用顺序,你也可以控制。
实体之间的消息传递
实体之间的消息交换是不可能的。
**如果要将消息发送到特定实体,然后用实体内容覆盖ComponentData,则系统处于处理中。
补充
ECS并不是面向对象的,所以不能很好地理解,并试图在OOP的背景下去理解(经验
“不知何故FOWA!好像不可能理解”,你可能期待着面向数据的设计,而且可能会更好。
观察者模式,可以被用于在系统间发送事件。
策略模式,算是ECS模式的基石。
其它链接 可以更好的了解:
实践:
包括安装新版本的Unity,最好是最新的或是beta版。可能需要在Package Manager里+一个URL:com.unity.entities 然后刷新后下载Entity,以及com.unity.rendering.hybrid。
EntityArchetype archetype = entityManager.CreateArchetype( typeof(Translation), typeof(Rotation), typeof(RenderMesh), typeof(RenderBounds), typeof(LocalToWorld))
Entity entity = entityManager.CreateEntity(archetype);