【Unity3D】ECS入门学习(九)SystemBase

news2025/1/3 11:10:01

SystemBase:支持主线程或多线程执行筛选实体任务。
主要介绍是内部成员:Entities的各种筛选方法,其内部成员还有EntityManager

ForEach方法筛选,传递一个有参委托函数进去,参数ref xxx组件类(可填多个)代表筛选条件。

WithAll:&& 形式筛选组件
WithAny: || 形式筛选组件
WithNone: 筛选出不带某组件的
WithChangeFilter:监听组件数据变化时触发筛选
WithSharedComponentFilter:筛选共享组件(指定特定数据)
WithStoreEntityQueryInField(ref EntityQuery对象):存储筛选结果
WithEntityQueryOptions(EntityQueryOptions):
        EntityQueryOptions.FilterWriteGroup:筛选带[WriteGroup(typeof(xxx))特性的组件
        EntityQueryOptions.IncludeDisabled:具有Disabled(已禁用)组件的实体
        EntityQueryOptions.IncludePrefab:具有Prefab组件的实体
WithoutBurst:不使用Burst编译
WithBurst:使用Burst编译

Run:主线程(单线程执行)
Schedule:多线程并发
ScheduleParallel:多线程并行

using System.Collections;
using System.Collections.Generic;
using Unity.Collections;
using Unity.Entities;
using Unity.Mathematics;
using Unity.Transforms;
using UnityEngine;
/// <summary>
/// 可操作主线程或多线程; ComponentSystem单线程 JobComponentSystem多线程
/// </summary>
public class MySystemBase : SystemBase
{
    EntityQuery query;
    //以下方法从上到下按顺序执行
    protected override void OnCreate()
    {
        Debug.Log("OnCreate");
    }

    protected override void OnStartRunning()
    {
        Debug.Log("OnStartRunning");
    }

    protected override void OnUpdate()
    {
        Debug.Log("OnUpdate");

        //使用内部成员Entities遍历所有实体筛选出Translation组件的实体进行修改
        Entities.ForEach((ref Translation trans) =>
        {
            trans.Value = new Unity.Mathematics.float3(0, 5, 0);
        }).Run();


        //使用WithAll增加筛选条件,必须带有PrintTestComponentData组件的
        //使用Run()代表是主线程执行
        Entities.ForEach((ref Translation trans) =>
        {
            trans.Value = new Unity.Mathematics.float3(0, 5, 0);
        }).WithAll<PrintTestComponentData>().Run();

        //WithAny 只要带任意一个即可满足筛选
        Entities.ForEach((ref Translation trans) =>
        {
            trans.Value = new Unity.Mathematics.float3(0, 5, 0);
        }).WithAny<PrintTestComponentData>().Run();

        //WithNone 不包含xxx的
        Entities.ForEach((ref Translation trans) =>
        {
            trans.Value = new Unity.Mathematics.float3(0, 5, 0);
        }).WithNone<PrintTestComponentData>().Run();

        //WithChangeFilter 监听组件值变化时才触发方法体,参数必须带上ref PrintTestComponentData  否则会报错
        Entities.ForEach((ref Translation trans, ref PrintTestComponentData data) =>
        {
            trans.Value = new Unity.Mathematics.float3(0, 5, 0);
        }).WithChangeFilter<PrintTestComponentData>().Run();

        //WithSharedComponentFilter 筛选共享组件 特定值为2的
        Entities.ForEach((ref Translation trans) =>
        {
            trans.Value = new Unity.Mathematics.float3(0, 5, 0);
        }).WithSharedComponentFilter(new MyShareComponentData() { data = 2 }).Run();

        //存储筛选结果        
        Entities.ForEach((ref Translation trans) =>
        {
            trans.Value = new Unity.Mathematics.float3(0, 5, 0);
        }).WithStoreEntityQueryInField(ref query).Run();

        NativeArray<Entity> array = query.ToEntityArray(Unity.Collections.Allocator.TempJob);
        foreach (var v in array)
        {
            //do something
        }

        //过滤出带[WriteGroup]特性的组件实体  [WriteGroup(typeof(PrintTestComponentData))] 查询会根据查询中指定的组件的WriteGroupAttribute属性筛选所选实体
        Entities.ForEach((ref Translation trans) =>
        {
            trans.Value = new Unity.Mathematics.float3(0, 5, 0);
        }).WithEntityQueryOptions(EntityQueryOptions.FilterWriteGroup).Run();

        //过滤出带[DisableAutoCreation]特性的组件实体  该查询不会隐式的排除具有Disabled(已禁用)组件的实体
        Entities.ForEach((ref Translation trans) =>
        {
            trans.Value = new Unity.Mathematics.float3(0, 5, 0);
        }).WithEntityQueryOptions(EntityQueryOptions.IncludeDisabled).Run();

        //过滤出预制体实体  [DisableAutoCreation]  该查询不会隐式的排除具有Prefab组件的实体
        Entities.ForEach((ref Translation trans) =>
        {
            trans.Value = new Unity.Mathematics.float3(0, 5, 0);
        }).WithEntityQueryOptions(EntityQueryOptions.IncludePrefab).Run();

        //Schedule 多线程并发执行 ; WithoutBurst 不使用Burst编译
        Entities.ForEach((ref Translation trans) =>
        {
            trans.Value = new Unity.Mathematics.float3(0, 5, 0);
        }).WithoutBurst().Schedule();

        //ScheduleParallel 配合Job 多线程并行执行 WithBurst 使用Burst编译
        Entities.ForEach((ref Translation trans) =>
        {
            trans.Value = new Unity.Mathematics.float3(0, 5, 0);
        }).WithBurst().ScheduleParallel();

        query.Dispose();
        array.Dispose();
    }

    protected override void OnStopRunning()
    {
        Debug.Log("OnStopRunning");
    }

    protected override void OnDestroy()
    {
        Debug.Log("OnDestroy");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

环,域,体,整区,理想,极大理想,

环&#xff1a; 定义&#xff1a; 加法交换群 乘法半群 分配律 域的定义&#xff1a; 加法交换群 乘法群&#xff08;去掉0元是交换群&#xff09; 分配律 Eg:比如整数集合不是域&#xff0c;因为对于乘法来说&#xff0c;去掉0后没有单位元了&#xff0c;但是是环 Eg…

Idea创建JDK17的maven项目失败

Idea创建JDK17的maven项目失败 Error occurred during initialization of VM Could not find agent library instrument on the library path, with error: Can’t find dependent libraries Possible solution: Check your maven runner VM options. Open Maven Runner setti…

基于MPPT算法的光伏并网发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MPPT算法的光伏并网发电系统simulink建模与仿真&#xff0c;包括PV光伏发电模块&#xff0c;并网电路&#xff0c;MPPT&#xff0c;PWM等模块。 2.系统仿真结果 3.核心程…

NAT 技术如何解决 IP 地址短缺问题?

NAT 技术如何解决 IP 地址短缺问题&#xff1f; 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 随着互联网的普及和发展&#xff0c;IP 地址的需求量迅速增加。尤其是 IPv4 地址&…

KOI技术-事件驱动编程(Sping后端)

1 “你日渐平庸&#xff0c;甘于平庸&#xff0c;将继续平庸。”——《以自己喜欢的方式过一生》 2. “总是有人要赢的&#xff0c;那为什么不能是我呢?”——科比布莱恩特 3. “你那么憎恨那些人&#xff0c;和他们斗了那么久&#xff0c;最终却要变得和他们一样&#xff0c;…

java: JDK isn‘t specified for module ‘product-service‘问题解决

目录 问题 解决方法 1.打开File->Project Structure... 2.将Project SDK修改为17 Oracle OpenJDK 17.0.12&#xff0c;并Apply&#xff0c;OK 问题 添加module后报错&#xff1a;java: JDK isnt specified for module product-service 查看pom.xml文件也添加了对应的JDK…

慧集通iPaaS低代码平台培训-基础篇

训练使用素材&#xff1a; 1.数据源&#xff1a; 单号业务日期工厂仓库物料单位数量批次0100012022-5-1210031001030001kg500202304150100012022-5-1210031001030001kg122202304150100012022-5-1210031001030001kg1250202304150100012022-5-1210031001030002kg130202304110100…

CMS漏洞靶场攻略

DeDeCMS 环境搭建 傻瓜式安装 漏洞一&#xff1a;通过文件管理器上传WebShel 步骤⼀:访问目标靶场其思路为 dedecms 后台可以直接上传任意文件&#xff0c;可以通过⽂件管理器上传php文件获取webshell 登陆网站后台 步骤二&#xff1a;登陆到后台点击 【核心】 --》 【文件式…

计算机网络 (12)物理层下面的传输媒体

前言 计算机网络物理层下面的传输媒体是计算机网络设备之间的物理通路&#xff0c;也称为传输介质或传输媒介&#xff0c;并不包含在计算机网络体系结构中&#xff0c;而是处于物理层之下。 一、传输媒体的分类 导向型媒体&#xff1a;电磁波被导引沿着固体媒体传播。常见的导向…

光储充一体化解决方案详解。

一、光储充介绍 1、什么是光储充 “光储充”一体化&#xff0c;顾名思义&#xff0c;是由光伏发电、储能、充电集成一体、互相协调支撑的绿色充电模式。其工作原理是利用光伏发电&#xff0c;余电由储能设备存储&#xff0c;共同承担供电充电任务。在用电高峰&#xff0c;光储…

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算 一、简介 在MATLAB中计算Sobol二阶效应指数通常涉及到全局敏感性分析&#xff08;Global Sensitivity Analysis, GSA&#xff09;&#xff0c;其中Sobol方法是一种流行的技术&#xff0c;用于评估模型输入…

RK3568 bsp 9 - USB调试记录

文章目录 1、环境介绍2、RK3568 USB资源介绍3、配置目标4、dts配置4.1、USB3.0 OTG4.2、USB2.0 Host 2 和 USB2.0 Host 3 5、kernel配置5.1、USB PHY CONFIG5.2、USB Host CONFIG5.3、USB OTG CONFIG5.4、USB外设CONFIG5.4.1、Mass Storage Class CONFIG5.4.2、USB HID CONFIG …

挖空的解决思路

用RagFlow解析完文档后怎么对某些实体的某些参数进行遮挡&#xff0c;给他设置预设好的可选项&#xff0c;并最终整合成文档模版&#xff0c;给我详细讲解怎么实现 解析–实体抽取&#xff08;Open NRE、UIE&#xff09;–遮挡–插入可选项–保存模版1–微调训练得模版2

【AI日记】24.12.30 kaggle 比赛 2-18

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加&#xff1a;kaggle 比赛 Regression with an Insurance Dataset时间&#xff1a;8 小时 读书 1 书名&#xff1a;教育的本质时间&#xff1a;0.5 小时评估&#xff1a;快速读完&#xff0c;收获不…

javaweb 04 springmvc

0.1 在上一次的课程中&#xff0c;我们开发了springbootweb的入门程序。 基于SpringBoot的方式开发一个web应用&#xff0c;浏览器发起请求 /hello 后 &#xff0c;给浏览器返回字符串 “Hello World ~”。 其实呢&#xff0c;是我们在浏览器发起请求&#xff0c;请求了我们…

【C++】九九乘法表编程题详解与多角度对比分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目概述题目描述 &#x1f4af;老师的实现方法代码解析优点不足 &#x1f4af;我的实现方法代码解析优点不足 &#x1f4af;实现方法对比&#x1f4af;优化与扩展代码优化…

保险公司开辟新模式:智能ai搭建咨询帮助中心

随着保险行业的快速发展&#xff0c;消费者对保险服务的期望也在不断提高。从传统的电话咨询到在线客服&#xff0c;服务模式的不断升级旨在提供更加便捷、高效的客户服务。然而&#xff0c;面对日益复杂的保险产品和多样化的客户需求&#xff0c;传统的人工客服体系逐渐显露出…

雷电模拟器安装LSPosed

雷电模拟器最新版支持LSPosed。记录一下安装过程 首先到官网下载并安装最新版&#xff0c;我安装的时候最新版是9.1.34.0&#xff0c;64位 然后开启root和系统文件读写 然后下载magisk-delta-6并安装 ,这个是吾爱破解论坛提供的&#xff0c;号称适配安卓7以上所有机型&#x…

使用uWSGI将Flask应用部署到生产环境

使用uWSGI将Flask应用部署到生产环境&#xff1a; 1、安装uWSGI conda install -c conda-forge uwsgi&#xff08;pip install uwsgi会报错&#xff09; 2、配置uWSGI 在python程序的同一文件夹下创建 uwsgi.ini文件&#xff0c;文件内容如下表。 需要按照实际情况修改文件名称…

计算机网络 (15)宽带接入技术

前言 计算机网络宽带接入技术是指通过高速、大容量的通信信道或网络&#xff0c;实现用户与互联网或其他通信网络之间的高速连接。 一、宽带接入技术的定义与特点 定义&#xff1a;宽带接入技术是指能够传输大量数据的通信信道或网络&#xff0c;其传输速度通常较高&#xff0c…