守望先锋 就是用的这个逻辑
大佬文章要多读 贴几篇写的不错的讲解ecs的文章 可以先看看。
《守望先锋》架构设计与网络同步
https://blog.csdn.net/u010019717/article/details/80378385
这个两篇也很不错
Getting Started
inDetail
unity的一个esc的项目 github
https://github.com/sschmid/Entitas-CSharp
一篇 翻译不错的ecs文档
洞明 Unity ECS 基础概念
Entity-Component-System 登场
Entity-Component-System 是一种编写代码的方式,简称ECS,近年因OW被广泛熟知,ECS主要关注开发中一个很基本的问题:如何组建并处理游戏中的数据和行为。
在ECS模型中,Component(组件)只包含数据。
ComponentSystem 则包含行为,一个 ComponentSystem 更新所有与之组件类型匹配的GameObject。
ComponentSystem -迈入新纪元的一步
using Unity.Entities;
using UnityEngine;
// 数据:可以在Inspector窗口中编辑的旋转速度值
class Rotator : MonoBehaviour
{
public float Speed;
}
// 行为:继承自ComponentSystem来处理旋转操作
class RotatorSystem : ComponentSystem
{
struct Group
{
// 定义该ComponentSystem需要获取哪些components
public Transform Transform;
public Rotator Rotator;
}
override protected void OnUpdate()
{
// 这里可以看第一个优化点:
// 我们知道所有Rotator所经过的deltaTime是一样的,
// 因此可以将deltaTime先保存至一个局部变量中供后续使用,
// 这样避免了每次调用Time.deltaTime的开销。
float deltaTime = Time.deltaTime;
// ComponentSystem.GetEntities<Group>可以高效的遍历所有符合匹配条件的GameObject
// 匹配条件:即包含Transform又包含Rotator组件(在上面struct Group中定义)
foreach (var e in GetEntities<Group>())
{
e.Transform.rotation *= Quaternion.AngleAxis(e.Rotator.Speed * deltaTime, Vector3.up);
}
}
}
Entity
是对所有ComponentData的一个集合,但是这个对格式有强要求
所有的数据都是struct类型不是是托管了(class),他们的数据存在是在内存块中(chunk)是连续的一个存储所以读取数据速度很快
这个涉及到 EntityManager 是对所有Entity的一个管理,
EntityManager拥有EntityData、EntityArchetypes、 SharedComponentData和ComponentGroup。
所有的Entity 实例化都是通过这个 有很多API 需要尽量使用,因为速度会快很多。