Ejemplo n.º 1
0
            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();
            }
Ejemplo n.º 2
0
        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();