首页 > 其他分享 >(转)我所理解的Entitas——System(四)

(转)我所理解的Entitas——System(四)

时间:2023-07-15 19:47:53浏览次数:30  
标签:Entitas List System Add 理解 Systems public

这章我们将介绍ECS的三大基本概念中的System。

System 系统
System是一个单纯得逻辑处理类,在特定得时间执行系统内部的逻辑,这些逻辑中可以改变Entity上得Component得数据和状态, 原则上来说应该是只有逻辑没有数据。
Entitas给我们提供了五种系统类型,之后我将每种类型分成一个章节结果代码实例讲解方便理解。

IInitializeSystem
IExecuteSystem
ICleanupSystem
ITearDownSystem
ReactiveSystem
一般来说一个System只会用来处理一种逻辑,每个System之间相互也不需要相互调用(独立减少耦合)。完全是通过框架外部或者Entity上Component的数据来驱动。

Systems
上面我们说到了一个System一般只用来处理一种逻辑,游戏中就会有很多个System。那么就需要用到Systems来管理这些System。

Systems内部维护了4个不同的List来保存不同类型的System。

public Systems() {
        //初始化各个List
        _initializeSystems = new List<IInitializeSystem>();
        _executeSystems = new List<IExecuteSystem>();
        _cleanupSystems = new List<ICleanupSystem>();
        _tearDownSystems = new List<ITearDownSystem>();
    }

我们需要通过Add(ISystem system)将System添加到Systems中。但是不用管System会被添加到那个List中,Entitas会自动帮我们处理。

//将不同的System添加到对应的列表中
    public virtual Systems Add(ISystem system) {
        var initializeSystem = system as IInitializeSystem;
        if (initializeSystem != null) {
            _initializeSystems.Add(initializeSystem);
        }
        
        var executeSystem = system as IExecuteSystem;
        if (executeSystem != null) {
            _executeSystems.Add(executeSystem);
        }
        
        var cleanupSystem = system as ICleanupSystem;
        if (cleanupSystem != null) {
            _cleanupSystems.Add(cleanupSystem);
        }
        
        var tearDownSystem = system as ITearDownSystem;
        if (tearDownSystem != null) {
            _tearDownSystems.Add(tearDownSystem);
        }
        
        return this;
    }

Systems继承了IInitializeSystem, IExecuteSystem, ICleanupSystem, ITearDownSystem,并在内部实现了Cleanup(),Execute(),Initialize(),TearDown()等接口用来执行4个List中的System。所以我们需要只要再外部调用Systems的这4个接口即可调用了内部的所有System。

//驱动初始化系统执行Initialize()方法
public virtual void Initialize() {
    for (int i = 0; i < _initializeSystems.Count; i++) {
        _initializeSystems[i].Initialize();
    }
}

//驱动每帧执行的系统执行Execute()方法
public virtual void Execute() {
   for (int i = 0; i < _executeSystems.Count; i++) {
       _executeSystems[i].Execute();
   }
}

//驱动清理系统执行Cleanup()方法
public virtual void Cleanup() {
    for (int i = 0; i < _cleanupSystems.Count; i++) {
        _cleanupSystems[i].Cleanup();
    }
}

//驱动结束系统执行TearDown()方法
public virtual void TearDown() {
   for (int i = 0; i < _tearDownSystems.Count; i++) {
       _tearDownSystems[i].TearDown();
   }
}
为什么这里是4个List,而前面说到了Entitas提供了五种类型的System。这个问题将会在后面章节说到。

Feature
在实际开发过程中我们可能需要知道当前正在运行的有哪些System等调试信息,Entitas会为我们自动生成Feature这个类来帮我们调试。
Feature主要用于在编辑器模式下开启visual debugging时收集各个系统的数据,同时在Unity中展示。所以在开启visual debugging时Feature继承自DebugSystems,而DebugSystems又是继承自Systems,并在内部做一些数据收集的工作与展示的工作。当关闭visual debugging时Feature会直接继承自Systems。
visual debugging的开关在 菜单栏Tools->Entitas->Preferences:

 

总结:
上一章说了Component和Entity的关系,咱们接着前面的总结来说。
一个士兵(Entity)有了开飞机(Component_3)的技能也不可能一直开着飞机在天上飘,还得指挥部让你上天你才上天,让你往哪飞你才能往哪飞。那么这个指挥部就可以理解为System。例如陆军指挥部(System_1),海军指挥部(System_2),空军指挥部(System_3)。而System就是这个军区总指挥部。

原文地址:https://blog.csdn.net/u010020342/article/details/109898636?spm=1001.2014.3001.5502

 

标签:Entitas,List,System,Add,理解,Systems,public
From: https://www.cnblogs.com/wodehao0808/p/17556761.html

相关文章

  • (转)我所理解的Entitas——Matcher Collector(五)
    图中可以看到一个Context具有多个Entity,每个Entity可能会被N个Group所关心。Group一个Context中可能会同时存在很多个Entity,但是有些时候我们只需要处理某些Entity,那么我们可以通过Group来快速访问,每个Context内部维护一个Group对象集合,调用GetGroup()方法可以拿到Group,相同得M......
  • (转)我所理解的Entitas——IInitializeSystem(六)
    从这章这开始我们以一个小案例分章介绍Entitas为我们提供的五种类型的System。案例的主要功能比较简单,大致的流程如下:在游戏启动时在屏幕上创建一个站立的小熊,点击键盘上的左右按键时将小熊切换成一个对应方向的Sprite,朝对应方向移动并实时打印位置信息。松开左右按键时切换回站......
  • typescript 中严格字面量类型检查的理解
    个人关于TS中Strictobjectliteralassignmentchecking的理解StrictobjectliteralassignmentcheckingStrictobjectliteralassignmentcheckingbyahejlsberg·PullRequest#3823·microsoft/TypeScript案例interfaceIStudent{name:stringid:strin......
  • 【全流程管理解决方案】奥威BI金蝶云星空SaaS版:重新定义企业管控
    金蝶云星空是一套全面覆盖供应链、采购、生产、销售、财务等业务流程,实现了全链条的闭环管理的综合性管理软件。但在云时代,仅仅覆盖业务流程还不够,还需要有一套全流程管理解决方案,实现对全业务流程数据的深度挖掘,为运营决策提供支持。奥威BI金蝶云星空SaaS版,一套覆盖全流程业务管理......
  • 大模型入门(七)—— RLHF中的PPO算法理解
    本文主要是结合PPO在大模型中RLHF微调中的应用来理解PPO算法。一、强化学习介绍1.1、基本要素环境的状态S:t时刻环境的状态$S_{t}$是环境状态集中某一个状态,以RLHF中为例,序列$w1,w2,w3$是当前的状态。个体的动作A:t时刻个体采取的动作$A_{t}$,给定序列$w1,w2,w3$,此时......
  • ubuntu20.04 配置编译安装nginx的systemctl启动命令
    vim/usr/lib/systemd/system/nginx.service[Unit]Description=nginx-highperformancewebserverAfter=network.targetremote-fs.targetnss-lookup.target[Service]Type=forkin......
  • 关于Java类加载器的一些理解
    Java中,每个类都可以获得对应自己类的Class对象,这是因为Object类中有publicfinalnativegetClass()方法,Class对象是由类加载器根据类字节码生成的,是反射机制必不可少的部分。类加载器中,主要的方法有protectedClassloadClass(Stringname,booleanresolve)和protectedClassf......
  • Netty 原理解析与开发实战(一)
    Netty原理解析与开发实战一、Netty概述1.1Java网络编程进化史1.1.1JavaOIO早期java提供了java.net包用于开发网络应用,这类API被称为阻塞JavaOIO(阻塞IO)。服务端主要实例代码:ServerSocketserverSocket=newServerSocket(port);SocketclientSocket=serverSocket.......
  • 添加systemd服务学习
    cd/usr/lib/systemd/systemvioscardb.service[Unit]Description=oscarAfter=network.target[Service]Type=forkingExecStart=/opt/ShenTong/admin/oscardb_OSRDBdstartExecReload=/opt/ShenTong/admin/oscardb_OSRDBdreloadExecStop=/opt/ShenTong/admin/oscardb_OSRDB......
  • 从需求去理解 Linux dbus与基于dbus协议的无agent软件管理
    从需求去理解Linuxdbus与基于dbus协议的无agent软件管理 转载 WhatisIPCIPC[Inter-ProcessCommunication] 进程间通信,指至少两个进程或线程间传送数据或信号的一些技术或方法。在Linux/Unix中,提供了许多IPC。Unix七大IPC:Pipe:无名管道,最基本的IPC,单向通信,仅在......