Entitas 入门

本文介绍了如何使用Entitas在Unity中实现ECS(实体-组件-系统)架构,通过创建LogComponent、LogSystem、InitSystem和GameController等,实现了数据和逻辑的分离,提高了代码组织效率。同时,展示了ECS如何改善传统Monobehaviour的不足,使得代码更加模块化。
摘要由CSDN通过智能技术生成

####使用 Entitas 实现 Hello World!

Entitas的Github地址:传送门

下载后导入工程,点击Tools菜单栏打开设置:
设置主界面

实现 Hellow World 正常的代码:

public class NormalHellowWorld : MonoBehaviour
{
    public string message = "Hello World";
    void Start()
    {
        Debug.Log(this.message);
    }
}

问题:
1.未使用Monobehaviour继承下来的各种属性或方法。
2.数据和逻辑未分离,都卸载了一个类里。


使用ECS改进后:
1.先创建一个 LogComponent
Component 只包含数据,所以只需一个 message。

[Game] //通过Game上下文可找到此Component
public class LogComponent : IComponent
{
    public string message;
}

PS:每次写完Component都需要重新生成一边代码。

2.再创建一个 LogSystem
System 是处理 Component 的。

public class LogSystem : ReactiveSystem<GameEntity>//ReactiveSystem:只要Component的值一发生变化,其中的Execute就会执行
{
    public LogSystem(Contexts context) : base(context.game)
    {
    }
    protected override ICollector<GameEntity> GetTrigger(IContext<GameEntity> context)
    {
        //过滤获取存在LogComponent的Entity
        return context.CreateCollector(GameMatcher.HelloWorldLog);
    }
    protected override bool Filter(GameEntity entity)
    {
        //条件,若成功才执行
        return entity.hasHelloWorldLog;
    }
    protected override void Execute(List<GameEntity> entities)
    {
        //过滤剩下的Component统一执行
        foreach (GameEntity entity in entities)
        {
            Debug.Log(entity.helloWorldLog.message);
        }
    }
}

这样逻辑层的代码就OK了。

3.再创建一个 InitSystem
负责在Game上下文中添加一个带有LogComponent的Entity

public class InitSystem : IInitializeSystem
{
    private GameContext _gameContext;
    public InitSystem(Contexts contexts)
    {
        this._gameContext = contexts.game;
    }
    public void Initialize()
    {
        //在game上下文中创建一个Entity,添加一个LogComponent
        this._gameContext.CreateEntity().AddHelloWorldLog("Hello World !");
    }
}

这样实体对象也创建出来了。

4.再创建一个 AddGameSystems
需要把所有的系统添加到Game上下文中

public class AddGameSystems : Feature //Feature 负责执行各种System
{
    public AddGameSystems(Contexts contexts) : base("AddGameSystems")
    {
        this.Add(new LogSystem(contexts));
        this.Add(new InitSystem(contexts));
    }
}

Feature的作用是:编辑器内,场景中会生成一个System节点,可以查看当前创建的所有System以及其消耗的性能,并可以进行调试。
这样整个逻辑写完了。

5.最后创建一个 GameController
需要与Unity关联起来

public class GameController : MonoBehaviour
{
    //存放所有的系统
    private Systems _systems;

    void Start()
    {
        //创建系统集合,将所有系统添加进去
        this._systems = new Feature("Systems").Add(new AddGameSystems(Contexts.sharedInstance));
        //初始化,执行所有实现IInitialzeSystem的Initialize方法
        this._systems.Initialize();
    }

    void Update()
    {
        this._systems.Execute();
        this._systems.Cleanup();
    }
}

运行起来后就看到了输出:

并且在 Hierarchy 窗口看到了所有的 System 和 Component 和 Entity。

在Inspector窗口也能看到具体的实体对象,带有一个LogComponent

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值