wordpress网站百度数据,大连开发区做网站,北京别墅装修公司前十名,山东诚铭建设机械有限公司网站最近DOTS发布了正式的版本, 我们来分享一下System中如何基于SystemAPI.Query来迭代World中的数据#xff0c;方便大家上手学习掌握Unity DOTS开发。
SystemAPI.Query的使用
System有两种#xff0c;一种是Unmanaged 的ISystem,一种是managed 的SystemBase,这两种System都可…最近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.QueryT1,T2…(),其中t1, t2就是我们需要的component data的类型,查询的时候会遍历World 里面有这些组件的Entity,获取组件的引用。Query中的类型T1,T2,可以是以下7中类型:
对啦这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白也有一些正在从事游戏开发的技术大佬欢迎你来交流学习。
IAspect
IComponentData
ISharedComponentData
DynamicBufferT
RefROT
RefRWT
EnabledRefROT where T : IEnableableComponent, IComponentData
EnabledRefRWT 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.QueryRefRWLocalTransform, RefRORotationSpeed())transform.ValueRW transform.ValueRO.RotateY(speed.ValueRO.RadiansPerSecond * deltaTime);}}
RefRWT.ValueRW获取组件的可读写权限的组件引用, RefRWT.ValueRO只读属性的组件应用, RefROT.ValueRO组件的只读引用。如果你只要一个只读之间我们就可以单纯的用组件的名字来Query就可以了。public void OnUpdate(ref SystemState state){#region query-data-altfloat deltaTime SystemAPI.Time.DeltaTime;foreach (var (transform, speed) in SystemAPI.QueryRefRWLocalTransform, 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.QueryRefRWLocalToWorld, RefRORotationSpeed().WithEntityAccess()){// Do stuff;}#endregion}
SystemAPI.Query的内部实现
当我们在System代码里面调用foreachSystemAPI.Query的时候,我们的自动代码生成器会根据Query调用的时候传递的参数的类型来生成EntityQuery字段到当前的System类里面(正因如此,我们在定义一个System类型的时候都要加partial)。同时替换掉SystemAPI.Query代码。这样运行的时候使用EntityQuery字段来帮我们找到对应的组件来进行迭代处理。SystemAPI.Query也有它的一些局限性,使用SystemAPI.Query API的时候我们无法对Dynamic Buffer组件来做只读的访问权限只能获得可读写的访问权限。我们不能够保存foreach的结果因为foreach是自动代码生成的时候根据foreach在编译的时候自动生成的EntityQuery,没有办法去缓存EntityQuery的结果。
今天的 SystemAPI.Query如何使用,就到这里了,更多的DOTS系列关注我们,持续更新