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)
{
  float deltaTime = SystemAPI.Time.DeltaTime;

  foreach (var (transform, speed) in SystemAPI.Query<RefRW<LocalTransform>, RotationSpeed>())
    transform.ValueRW = transform.ValueRO.RotateY(speed.RadiansPerSecond * deltaTime);
}

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

public void OnUpdate(ref SystemState state)
{
  float deltaTime = SystemAPI.Time.DeltaTime;

  foreach (var (transform, speed, entity) in SystemAPI.Query<RefRW<LocalToWorld>, RefRO<RotationSpeed>>().WithEntityAccess())
  {
    // Do stuff;
  }
}

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


  尊敬的准VIP客户:

  我们Unity DOTS课程也正式发布了,我们课程经过9年多的更新与迭代,已经涵盖了Unity 开发中遇到的绝大部分问题,涵盖了Unity主程序进阶,升职加薪所需要的系统的知识体系,主流游戏类型的重点难点技术解决方案。我们的老师10:00~23:00提供实时解答与回复,包含但不限于客户端+服务端。相信我们提供的游戏开发技术服务能很好的帮助到您。选择我们的VIP课程,您肯定不会后悔!有兴趣请 + 企.鹅.裙 428 540 563


  下面是DOTS的VIP课程前18节视频,免费观看

Unity DOTS进阶与项目实战(B站18集)

第001课DOTS的环境安装与准备事项

第002课 DOTS的核心机制与概述

第003课DOTS的SubScene

第004课Component的概述与普通组件的Baker

第005课System与SystemGroup概述

第006课DOTS中的ECS核心概念总结

第007课Baking系列之Baking与Baker详解

第008课Baking系列之BakingSystem与BakingWorld详解

第009课FilterBakingOutput与PrefabsInBaking

第010课BlobAsset核心机制分析

第011课Aspect核心机制分析

第012课 StructChange核心机制详解

第013课Managed与Unmanaged Component详解与性能分析

第014课ShareComponent核心机制与性能分析

第015课CleanupComponent核心分析

第016课 Dynamic Buffer Component详解与分析

第017课Tag与Chunk Component详解与分析

第018课Enableable与Singleton组件详解与分析

相关推荐

  1. Unity DOTS系列IJobChunk来处理数据

    2024-03-28 13:08:02       48 阅读
  2. python

    2024-03-28 13:08:02       32 阅读
  3. 使用milvus-sdk-go的器导出数据

    2024-03-28 13:08:02       27 阅读
  4. 器的使用

    2024-03-28 13:08:02       28 阅读
  5. c++器与反向

    2024-03-28 13:08:02       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-28 13:08:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-28 13:08:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-28 13:08:02       82 阅读
  4. Python语言-面向对象

    2024-03-28 13:08:02       91 阅读

热门阅读

  1. 249. ver(i)真实

    2024-03-28 13:08:02       36 阅读
  2. 蓝桥杯刷题--python-32

    2024-03-28 13:08:02       47 阅读
  3. ubuntu不兼容腾讯会议wayland协议

    2024-03-28 13:08:02       42 阅读
  4. 深度学习入门指南:掌握人工智能的未来

    2024-03-28 13:08:02       46 阅读
  5. Doris 数据集成 Catalog

    2024-03-28 13:08:02       42 阅读
  6. unity防止ui点击事件被子物体拦截

    2024-03-28 13:08:02       43 阅读
  7. python asyncio websockets server

    2024-03-28 13:08:02       40 阅读