EntitiesSample_9. CrossQuery

该示例主要的内容:

1.URPMaterialPropertyBaseColor:Unity.Rendering空间下的材质组件,该结构体拥有一个float4颜色的变量,赋值和其他的组件一样

2.EntityQuery转数组

boxQuery.ToComponentDataArray<LocalTransform>(Allocator.Temp);

3.IJobChunk的使用

复制代码
  new CollisionJob
            {
                //获取LocalTransform组件的句柄
                LocalTransformTypeHandle = SystemAPI.GetComponentTypeHandle<LocalTransform>(true),
                //获取DefaultColor组件的句柄
                DefaultColorTypeHandle = SystemAPI.GetComponentTypeHandle<DefaultColor>(true),
                //获取URPMaterialPropertyBaseColor组件的句柄
                BaseColorTypeHandle = SystemAPI.GetComponentTypeHandle<URPMaterialPropertyBaseColor>(),
                //获取实体类型的句柄
                EntityTypeHandle = SystemAPI.GetEntityTypeHandle(),
                //实体查询对象转化为数组句柄
                OtherChunks = boxQuery.ToArchetypeChunkArray(state.WorldUpdateAllocator)
                //作业调度,   Complete():需要全部完成,然后执行下一次 
            }.ScheduleParallel(boxQuery, state.Dependency).Complete();

特别注意的是IJobChunk接口中的句柄变量,都需要 [ReadOnly]标签修饰,例如:

ReadOnly\] public ComponentTypeHandle\ LocalTransformTypeHandle; 在Chunk作业中,需要使用ArchetypeChunk chunk获取当前要操作的变量值,示例代码是这样的没什么好解释的,就是双循环判断距离 [BurstCompile] public struct CollisionJob : IJobChunk { [ReadOnly] public ComponentTypeHandle LocalTransformTypeHandle; [ReadOnly] public ComponentTypeHandle DefaultColorTypeHandle; public ComponentTypeHandle BaseColorTypeHandle; [ReadOnly] public EntityTypeHandle EntityTypeHandle; [ReadOnly] public NativeArray OtherChunks; public void Execute(in ArchetypeChunk chunk, int unfilteredChunkIndex, bool useEnabledMask, in v128 chunkEnabledMask) { var transforms = chunk.GetNativeArray(ref LocalTransformTypeHandle); var defaultColors = chunk.GetNativeArray(ref DefaultColorTypeHandle); var baseColors = chunk.GetNativeArray(ref BaseColorTypeHandle); var entities = chunk.GetNativeArray(EntityTypeHandle); for (int i = 0; i < transforms.Length; i++) { var transform = transforms[i]; var baseColor = baseColors[i]; var entity = entities[i]; // reset to default color baseColor.Value = defaultColors[i].Value; for (int j = 0; j < OtherChunks.Length; j++) { var otherChunk = OtherChunks[j]; var otherTranslations = otherChunk.GetNativeArray(ref LocalTransformTypeHandle); var otherEntities = otherChunk.GetNativeArray(EntityTypeHandle); for (int k = 0; k < otherChunk.Count; k++) { var otherTranslation = otherTranslations[k]; var otherEntity = otherEntities[k]; if (entity != otherEntity && math.distancesq(transform.Position, otherTranslation.Position) < 1) { baseColor.Value.y = 0.5f; // set green channel break; } } } baseColors[i] = baseColor; } } }

相关推荐
Zik----1 小时前
简单的Unity漫游场景搭建
unity·游戏引擎
在路上看风景12 小时前
4.5 顶点和片元
unity
在路上看风景1 天前
31. Unity 异步加载的底层细节
unity
天人合一peng1 天前
Unity中做表头时像work中整个调整宽窄
unity
小李也疯狂2 天前
Unity 中的立方体贴图(Cubemaps)
unity·游戏引擎·贴图·cubemap
牛掰是怎么形成的2 天前
Unity材质贴图引用陷阱:包体暴涨真相
unity·材质·贴图
呆呆敲代码的小Y2 天前
【Unity工具篇】| 超实用工具LuBan,快速上手使用
游戏·unity·游戏引擎·unity插件·luban·免费游戏·游戏配置表
EQ-雪梨蛋花汤2 天前
【Unity优化】Unity多场景加载优化与资源释放完整指南:解决Additive加载卡顿、预热、卸载与内存释放问题
unity·游戏引擎
我的offer在哪里2 天前
用 Unity 从 0 做一个「可以玩的」游戏,需要哪些步骤和流程
游戏·unity·游戏引擎
泡泡茶壶ᐇ2 天前
Unity游戏开发入门指南:从零开始理解游戏引擎核心概念
unity·游戏引擎