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

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

时间:2023-12-05 10:00:59浏览次数:38  
标签: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/bycw/p/17876571.html

相关文章

  • xv6 file system
    xv6filesystem在我看来文件系统某种程度上是最复杂的一部分(单从页数也足以说明了),而且我对文件系统的了解其实很少,因此这部分仔细看了一下。xv6文件系统提供类似unix的文件、目录和路径名,并将其数据存储在virtio磁盘上以实现持久化。文件系统解决了几个挑战:文件系统需要......
  • 最简明扼要的 Systemd 教程,只需十分钟
    systemctl常用命令介绍~~~  Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。Systemd是一个系统管理守护进程、工具和库的集合,用于取代SystemV初始进程。Systemd的功能是用于集中管理和配置类UNIX系统。  启动及服务    大多数主流发行版要么......
  • C++/Filesystem 文件类型
    #include<iostream>#include<filesystem>#include<string>namespacefs=std::filesystem;voiddemo_status(constfs::path&p,fs::file_statuss){std::cout<<p;switch(s.type()){casefs::file_type::none:......
  • 最新Unity DOTS教程之BlobAsset核心机制分析
    最近DOTS发布了正式的版本,我们来分享一下DOTS里面BlobAsset机制,方便大家上手学习掌握UnityDOTS开发。BlobAsset 概叙DOTS提供了BlobAsset机制来把数据生成高效的二进制数据。BlobAsset的数据是不可变的。BlobAsset只支持非托管类型数据。支持Burst编译器编译出来的类型。同......
  • 最新Unity DOTS系列之Aspect核心机制分析
    最近DOTS发布了正式的版本,我们来分享一下DOTS里面Aspect机制,方便大家上手学习掌握UnityDOTS开发。Aspect 机制概述当我们使用ECS开发的时候,编写某个功能可能需要某个entity的一些组件,如果我们一个个组件的查询出来,可能参数会写很长。如果我们编写某个功能的时候,需要entity的......
  • Unity DOTS系列之Struct Change核心机制分析
    最近DOTS发布了正式的版本,我们来分享一下DOTS里面StructChange机制,方便大家上手学习掌握UnityDOTS开发。基于ArchType与Chunk的Entity管理机制我们回顾以下ECS的内存管理核心机制,基于ArchType+Chunk的Entity管理模式。每个Entity不直接存放数据,数据全部存放到ComponentData......
  • 【pwn】puts or system? --格式化字符串漏洞泄露libc基址
    还是先看一下保护情况开了canary,接着看主函数逻辑看到这里的代码逻辑,我一开始是想通过printf泄露出canary的值,然后再用ret2libc来打,但是我发现这个libc不好泄露,一般的泄露的思路都是构造ROP,通过puts函数泄露出puts的got表内容,但是我在寻找rdi这个gadget的时候,是找不到的这也......
  • CentOS7 无法执行systemctl status ntpd的原因及解决方法
    在CentOS7中,NTP的服务名为ntpd.service,如果出现Unitntpd.servicecouldnotbefound的错误,可能是由于NTP没有安装或未正确启动所致。你可以尝试以下步骤来解决此问题:首先,检查系统是否已经安装NTP。可以运行以下命令:rpm-qntp如果返回packagentpisnotinstall......
  • 内核文档翻译 —— Overview of the Linux Virtual File System
    原文:https://www.kernel.org/doc/html/latest/filesystems/vfs.html#overview-of-the-linux-virtual-file-systemIntroductionTheVirtualFileSystem(alsoknownastheVirtualFilesystemSwitch)isthesoftwarelayerinthekernelthatprovidesthefilesystemin......
  • 关于 SAP ABAP System Change Option 的设置
    在传输组织器(事务SE09)中,选择导航路径的起点转到下一步导航步骤传输组织器工具导航路径的终点。这将带我们进入TransportOrganizerTools概述。转到管理并启动程序设置系统更改选项。全局设置选项允许确定存储库或独立于客户端的定制中的对象是否可以全局修改。只有将全......