Unity DOTS系列之System中如何使用SystemAPI.Query迭代数据

最近DOTS发布了正式的版本, 我们来分享一下System中如何基于SystemAPI.Query来迭代World中的数据,方便大家上手学习掌握Unity DOTS开发。

SystemAPI.Query的使用

System有两种,一种是Unmanaged 的ISystem,一种是managed 的SystemBase,这两种System都可以通过SystemAPI.Query来迭代与遍历,可以获取World里面的组件与Entity。SystemAPI.Query是运行在main thread的主线程上,SystemAPI.Query与C# 传统的foreach语句结合起来,让我们遍历数据非常的方便。当我们要遍历一个World里面的entity数据的时候,我们需要根据数据类型来筛选出对应的组件与Entity。函数SystemAPI.Query<T1,T2…>(),其中t1, t2就是我们需要的component data的类型,查询的时候,会遍历World 里面有这些组件的Entity,获取组件的引用。Query中的类型T1,T2,可以是以下7中类型:

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

IAspect
IComponentData
ISharedComponentData
DynamicBuffer<T>
RefRO<T>
RefRW<T>
EnabledRefRO<T> where T : IEnableableComponent, IComponentData
EnabledRefRW<T> where T : IEnableableComponent, IComponentData

以下是给的一个代码示例,从World里面筛选出来有LocalTransform与RotationSpeed组件的Entity,并把它们的数据通过foreach来处理。示例代码如下:

 public partial struct MyRotationSpeedSystem : ISystem{[BurstCompile]public void OnUpdate(ref SystemState state){float deltaTime = SystemAPI.Time.DeltaTime;foreach (var (transform, speed) in SystemAPI.Query<RefRW<LocalTransform>, RefRO<RotationSpeed>>())transform.ValueRW = transform.ValueRO.RotateY(speed.ValueRO.RadiansPerSecond * deltaTime);}}
RefRW<T>.ValueRW获取组件的可读写权限的组件引用, RefRW<T>.ValueRO只读属性的组件应用, RefRO<T>.ValueRO组件的只读引用。如果你只要一个只读之间,我们就可以单纯的用组件的名字来Query就可以了。public void OnUpdate(ref SystemState state){#region query-data-altfloat deltaTime = SystemAPI.Time.DeltaTime;foreach (var (transform, speed) in SystemAPI.Query<RefRW<LocalTransform>, RotationSpeed>())transform.ValueRW = transform.ValueRO.RotateY(speed.RadiansPerSecond * deltaTime);#endregion}

其中RotaionSpeed为只读的组件实例的引用。如果我们在system里面迭代数据的时候,需要组件对应的Entity,我们使用API函数WithEntityAcess,示例代码如下:

 public void OnUpdate(ref SystemState state){float deltaTime = SystemAPI.Time.DeltaTime;#region entity-accessforeach (var (transform, speed, entity) in SystemAPI.Query<RefRW<LocalToWorld>, RefRO<RotationSpeed>>().WithEntityAccess()){// Do stuff;}#endregion}

SystemAPI.Query的内部实现

当我们在System代码里面调用foreach+SystemAPI.Query的时候,我们的自动代码生成器会根据Query调用的时候传递的参数的类型来生成EntityQuery字段到当前的System类里面(正因如此,我们在定义一个System类型的时候都要加partial)。同时替换掉SystemAPI.Query代码。这样运行的时候使用EntityQuery字段来帮我们找到对应的组件来进行迭代处理。SystemAPI.Query也有它的一些局限性,使用SystemAPI.Query API的时候我们无法对Dynamic Buffer组件来做只读的访问权限,只能获得可读写的访问权限。我们不能够保存foreach的结果,因为foreach是自动代码生成的时候,根据foreach在编译的时候自动生成的EntityQuery,没有办法去缓存EntityQuery的结果。

今天的 SystemAPI.Query如何使用,就到这里了,更多的DOTS系列,关注我们,持续更新!

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

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

相关文章

LeetCode106. Construct Binary Tree from Inorder and Postorder Traversal

文章目录 一、题目二、题解 一、题目 Given two integer arrays inorder and postorder where inorder is the inorder traversal of a binary tree and postorder is the postorder traversal of the same tree, construct and return the binary tree. Example 1: Input: …

段的概念_重定位的引入

段的概念 代码段、只读数据段、可读可写数据段、BSS段。 char g_Char A; //可读可写&#xff0c;不能放在ROM上&#xff0c;应该放在RAM里 const char g_Char2 B; //只读变量&#xff0c;可以放在ROM上 int g_A 0; //初始值为0&#xff0c;没有必要浪费空间 int g_B; //没…

力扣-66. 加一

文章目录 解题思路代码 解题思路 根据题目可以得出此题一共有3种需要特殊判断的地方。1.数组元素的最后一个元素是否为9&#xff0c;如果是那就将此处元素置0&#xff0c;如果不是那就此处元素加1。按照这个逻辑将digits数组重新赋值。2.判断重新赋值的digits数组的首元素是否…

Python爬虫从基础到入门:找数据接口

Python爬虫从基础到入门:找数据接口 1. 怎样判断抓取的数据是动态生成的2. 用requests模块访问,然后用解析模块解析数据3. 总结1. 怎样判断抓取的数据是动态生成的 请参考文章:Python爬虫从基础到入门:认识爬虫 第3点所讲。 这里用我的CSDN个人主页举例。 可以说这部分下的…

EukCC2评估真核生物MGAs质量

文章目录 简介和原理Install配置数据库使用单个bin包含bins的目录Bin merging示例数据集自测数据更多参数 参考 简介和原理 EukCC2是一个基于python编写的用于评估真核生物MAGs完整度和污染度的软件。可以评估binning后的单个bin或者bins目录。 其原理是基于动态变化的单拷贝标…

第4关:非递归实现二叉树左右子树交换

任务描述相关知识 栈的基本操作二叉树后序遍历编程要求测试说明 任务描述 本关任务&#xff1a;给定一棵二叉树&#xff0c;使用非递归的方式实现二叉树左右子树交换&#xff0c;并输出后序遍历结果。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.栈的基…

bug:Junit5报错,@SpringBootTest没有运行

1、首先解决Junit5报错 java.lang.NoClassDefFoundError: org/junit/platform/launcher/core/LauncherFactory 添加依赖 implementation org.junit.platform:junit-platform-launcher:1.8.2java.lang.IllegalArgumentException: Error: test loader org.eclipse.jdt.internal.…

springboot集成kafka详解

文章目录 1、kafka部署&#xff1a;&#xff08;1&#xff09;先创建一个网络&#xff1a;&#xff08;2&#xff09;安装zookeeper&#xff0c;kafka依赖zookeeper所以需要先安装zookeeper&#xff1a;&#xff08;3&#xff09;安装Kafka&#xff1a;参数解释&#xff1a; &a…

c++ jthread 使用详解

c jthread 使用详解 std::jthread c20 头文件 #include <thread>。对 std::thread 的改进&#xff0c;旨在提供更好的线程管理和异常处理&#xff0c;除了拥有和 std::thread 完全相同的功能以及 API 之外&#xff0c;还增加了以下功能&#xff1a; 可停止&#xff1a;…

无人地磅称重系统|自助过磅 料仓联动 自助卸料

上海思伟无人地磅系统 自助过磅、 自助卸料 、料仓联动 智能、省人、安全 无人监管过磅 对地磅及其相关的所有硬件进行配置和管理&#xff1b; 支持红外、道闸、车牌识别、AI分析、拍照存档、LED语音播报一体机等设备&#xff1b; 实现稳定可靠的无人监管称重功能&#xf…

云服务器哪家强?阿里云双十一2核2G配置3M带宽仅99元/年!

阿里云作为国内知名的云计算服务提供商&#xff0c;每年的双11都会推出各种优惠活动和促销策略。在今年的双11期间&#xff0c;阿里云推出了多种选择的云服务器&#xff0c;其中两款备受用户关注&#xff1a;轻量服务器2核2G3M带宽优惠价87元一年和经济型e实例2核2G配置3M带宽9…

Vue3 ref函数和reactive函数

一、ref函数 我们在setup函数中导出的属性和方法虽然能够在模板上展示出来&#xff0c;但是并没有给属性添加响应式&#xff0c;因此&#xff0c;我们需要使用ref函数来为我们的数据提供响应式。 &#xff08;一&#xff09;引入ref函数 import { ref } from "vue"…

数据结构:红黑树的原理和实现

文章目录 红黑树的概念红黑树的性质红黑树的模拟实现红黑树的平衡问题 整体实现和测试 本篇用于进行红黑树的拆解和模拟实现&#xff0c;为之后的map和set的封装奠定基础 红黑树的概念 红黑树也是一种二叉搜索树&#xff0c;但是在每一个节点的内部新增了一个用以表示该节点颜…

IDEA的优化配置教程

前言 IDEA 全称 IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以…

Day 项目介绍与 SSM 环境搭建

介绍一个使用Java语言开发的项目&#xff0c;演示并如何搭建一个基于SSM&#xff08;SpringSpring MVCMyBatis&#xff09;框架的开发环境。SSM是一种常用的Java Web开发框架&#xff0c;它集成了Spring、Spring MVC和MyBatis&#xff0c;提供了一套完整的开发架构&#xff0c;…

OOM汇总

1. 堆内存溢出 堆内存溢出通常是由于创建了过多的对象&#xff0c;而导致堆内存耗尽而发生的。以下是导致堆内存溢出的一些常见情况&#xff1a; 内存泄漏&#xff1a; 如果程序中存在内存泄漏&#xff0c;即一些对象不再被引用&#xff0c;但仍然存活于堆内存中&#xff0c;…

thinkphp5 连接多个服务器数据库

如果你的database.php 是这样&#xff0c; 这是默认的db连接配置 如果还想连接其他服务器&#xff0c;或数据库 在config.php中追加数据库配置&#xff0c; 在使用的地方调用&#xff1a; use think\Db;public function test(){$db3Db::connect(config(db3));$result $db3…

使用gitflow时如何合并hotfix

前言 在使用 git flow 流程时, 对于项目型的部署项目经常会遇到一个问题, 就是现场项目在使用历史版本时发现的一些问题需要修复, 但升级可能会有很大的风险或客户不愿意升级, 这时就要求基于历史版本进行 hotfix 修复. 基于历史发布版本的缺陷修复方式不同于最新发布版本的补…

CSS 实现文字两端对齐效果

直接上代码&#xff1a; .text{text-align: justify;text-align-last: justify;// 兼容ie (未测试)text-justify: distribute-all-lines; }注意&#xff1a; text-align-last: justify; 只对中文文字起效果。数字和英文字母则需要使用空格间隔开&#xff0c;然后使用上述方法即…

自然语言处理实战项目21-两段文本的查重功能,返回最相似的文本字符串,可应用于文本查重与论文查重

大家好,我是微学AI,今天给大家介绍一下自然语言处理实战项目21-两段文本的查重功能,返回最相似的文本字符串,可应用于论文查重。本文想实现一种文本查重功能,通过输入两段文本,从中找出这两段文本中最相似的句子。这项技术有助于检测抄袭、抄袭的论文和文章,提高知识创新…