首页 > 其他分享 >Unity DOTS系列之System中如何使用SystemAPI.Query迭代数据

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

时间:2023-11-10 10:35:23浏览次数:40  
标签:DOTS System transform SystemAPI foreach 组件 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-alt

            float 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-access

            foreach (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系列,关注我们,持续更新!

  

 

标签:DOTS,System,transform,SystemAPI,foreach,组件,Query
From: https://www.cnblogs.com/rainy1unity/p/17823525.html

相关文章

  • v$parameter v$system_parameter v$spparameter v$parameter2 v$system_parameter2
    v$parameter当前会话生效参数(showparameter)altersessionsetxxxxx;显示的内容会变化altersystemsetxxxxxx;显示的内容会变化v$system_parameter表示实例级别的参数信息,在没有在线修改参数的情况下showparameter与之相同,每开启一个新会话的时候,会话使用所有的参数都......
  • The following perl modules required by RepeatModeler are missing from your syste
     001、问题  RepeatModeler编译安装报错如下: 002、尝试逐个安装确实的perl模块;也是各种问题;最后不想折腾,就大力出奇迹,全安装,可一次解决所有报错;(base)[[email protected]]#yum-yinstallperl* 003、编译,测试效果:(base)[root@pc1RepeatMo......
  • octal number system
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intbin(intn){ if(n<8) returnn; else returnbin(n/8)*10+n%8;}intmain(){ inti,t; scanf("%d",&t); for(i=1;i<=t;i++) { inta; scanf("%d......
  • 用System.Net.Mail发送邮件时错误信息
     用System.Net.Mail发送邮件时错误信息 配置示例如下:<appSettings><addkey="EmailFrom"value="[email protected]"/><addkey="EmailTo"value="[email protected]"/><addkey="Smtp......
  • 无涯教程-批处理 - SYSTEMINFO函数
    此批处理命令显示计算机及其操作系统的配置。SYSTEMINFO-语法systeminfoSYSTEMINFO-示例@echooffsysteminfo上面的命令将显示当前系统上的系统信息。以下是输出的子集。HostName:WIN-50GP30FGO75OSName:MicrosoftWindowsSer......
  • 异常详细信息: System.Web.HttpException: 服务器太忙
    HTTP双连接限制HTTP规范表明,一个HTTP客户端与任一服务器最多可以同时建立两个TCP连接。这可以防止单个浏览器在浏览某个页面(例如,具有120个嵌入的缩略图)时,由于连接请求过多而使服务器负载过重。此时,浏览器将仅创建2个连接,然后通过这两个管道开始发送120个HTTP请求,而......
  • IBM System x3400 怎么启动到可以安装?
    IBM服务器安装Windows操作系统的前提条件:IBMServerGuide光盘和Windows光盘。 IBMSystemX3400理论上不支持WindowsServer2000任何一个版本的安装(主要是因为ServerGuide光盘里面没有相关的驱动,在系统安装初始阶段无法加载阵列卡控制器的驱动)。但是你可以使用一个外置的USB......
  • 编译安装nginx-systemctl
    实验:1cd/opt2wgethttp://nginx.org/download/nginx-1.18.0.tar.gz#通过网络地址下载nginx的安装包,下载到opt目录下 1tarxf  nginx-1.18.0.tar.gz#将安装包解压 #通过网络源下载依赖包 #安装完成后,在该目录下递归创建“/apps/nginx” #指明安装路......
  • Unity DOTS中ECS核心架构详解
    最近DOTS终于发布了正式的版本, 我们来分享一下DOTS中ECS的几个关键概念与结构,方便大家上手学习掌握Unity DOTS开发。 ECS中的World  Unity DOTS ECS架构中所有的Entity都是被放到了World对象里面,每个Entity在World里面都有唯一的Id号。Unity DOTS 可以同时支持很多个......
  • Unity ECS最新DOTS环境搭建教程
    最近DOTS终于发布了正式的版本, 今天我们来基于Unity2023.1.6来搭建DOTS1.0.16的开发环境与注意事项。 1获取DOTS的在线文档   UnityDOTS的权威资料比较少,我们主要的都是基于DOTS的官方文档来进行学习和使用。UnityDOTS的官方文档的下载地址:https://docs.unity3d.c......