public void Execute(int idx) { NativeArray <HashResult>?slice = Results.CopyValuesForKey(idx); if (slice == null) { Output[idx] = 0; return; } var results = slice.Value; results.Sort(); var hashes = new NativeArray <Hash>(results.Length, Allocator.Temp, NativeArrayOptions.UninitializedMemory); for (var j = 0; j < hashes.Length; j++) { hashes[j] = results[j].Hash; } Output[idx] = hashes.XXHash64(); }
protected unsafe override void OnUpdate() { PhysicsWorld physicsWorld = _worldBuildSystem.PhysicsWorld; NativeMultiHashMap <Entity, HitboxCollision> collisions = _collisions; collisions.Clear(); var collisionWriter = collisions.AsParallelWriter(); Entities .WithName("QueryHitboxCollisons") .WithReadOnly(physicsWorld) .ForEach((Entity entity, ref Hitbox hitbox, ref HitboxState state, in LocalToWorld transform) => { if (!state.Enabled) { return; } BlobAssetReference <Collider> collider = SphereCollider.Create(new SphereGeometry { Center = float3.zero, Radius = hitbox.Radius }, new CollisionFilter { BelongsTo = (uint)PhysicsLayers.HITBOX, CollidesWith = (uint)PhysicsLayers.HITBOX, }); float3 position = math.transform(transform.Value, float3.zero); var hits = new NativeList <ColliderCastHit>(Allocator.Temp); physicsWorld.CastCollider(new ColliderCastInput { Collider = (Collider *)collider.GetUnsafePtr(), Start = state.PreviousPosition ?? position, End = position, Orientation = float4.zero }, ref hits); collider.Dispose(); state.PreviousPosition = position; for (var i = 0; i < hits.Length; i++) { var hit = hits[i]; if (!HasComponent <Hurtbox>(hit.Entity)) { continue; } var hurtbox = GetComponent <Hurtbox>(hit.Entity); if (!hurtbox.Enabled || hurtbox.Player == Entity.Null || hurtbox.Player == state.Player) { continue; } collisionWriter.Add(hurtbox.Player, new HitboxCollision { OriginPlayer = entity, Hitbox = hitbox, Hurtbox = hurtbox, }); } }).ScheduleParallel(); Entities .WithName("ApplyCollisions") .WithReadOnly(collisions) .ForEach((Entity entity, ref PlayerComponent player, in PlayerConfig config, in CharacterFrame frame) => { NativeArray <HitboxCollision>?playerCollisions = collisions.CopyValuesForKey(entity); if (playerCollisions == null) { return; } // Sort collisions playerCollisions.Value.Sort(); }).Schedule();