protected override void OnUpdate()
        {
            var commandBuffer = barrier.CreateCommandBuffer().AsParallelWriter();

            var physicsWorld = buildPhysicsWorld.PhysicsWorld;

            var localToWorldFromEntity = GetComponentDataFromEntity <LocalToWorld>(true);

            Dependency = JobHandle.CombineDependencies(Dependency, buildPhysicsWorld.GetOutputDependency());

            Entities
            .WithAll <LocalToWorld>()
            .WithReadOnly(localToWorldFromEntity)
            .WithReadOnly(physicsWorld)
            .ForEach((Entity entity, int entityInQueryIndex, ref Sticky sticky) =>
            {
                if (sticky.StickAttempts-- <= 0)
                {
                    commandBuffer.RemoveComponent <Sticky>(entityInQueryIndex, entity);
                    commandBuffer.AddComponent <StickyFailed>(entityInQueryIndex, entity);
                    return;
                }

                var worldPosition = localToWorldFromEntity[entity].Position;

                var collider = SphereCollider.Create(
                    new SphereGeometry()
                {
                    Center = worldPosition,
                    Radius = sticky.Radius
                },
                    sticky.Filter
                    );

                unsafe
                {
                    var castInput = new ColliderCastInput()
                    {
                        Collider    = (Collider *)collider.GetUnsafePtr(),
                        Orientation = quaternion.LookRotationSafe(sticky.WorldDirection, math.up())
                    };

                    if (!physicsWorld.CastCollider(castInput, out ColliderCastHit hit))
                    {
                        return;
                    }

                    commandBuffer.AddComponent(entityInQueryIndex, entity, new Parent
                    {
                        Value = hit.Entity
                    });

                    commandBuffer.RemoveComponent <Sticky>(entityInQueryIndex, entity);
                }
            })
            .WithName("StickyJob")
            .ScheduleParallel();

            barrier.AddJobHandleForProducer(Dependency);
        }
示例#2
0
            public void Execute()
            {
                var colliderCastInput = new ColliderCastInput
                {
                    Collider    = (Collider *)collider.GetUnsafePtr(),
                    Start       = origin + new float3(0f, 1f, 0f),
                    End         = origin,
                    Orientation = quaternion.identity
                };

                if (!hits.IsCreated)
                {
                    hits = new NativeList <ColliderCastHit>(Allocator.TempJob);
                }
                hasHit = physicsWorld.CastCollider(colliderCastInput, ref hits);
            }
        unsafe public void Execute(int index)
        {
            var center = math.lerp(upperRightPosition, lowerLeftPosition, 0.5f);
            var size   = new float3(startPosition.x - endPosition.x,
                                    startPosition.y - endPosition.y,
                                    1);
            var filter = new CollisionFilter()
            {
                BelongsTo    = ~0u,
                CollidesWith = ~0u, // all 1s, so all layers, collide with everything
                GroupIndex   = 0
            };

            BoxGeometry boxGeometry = new BoxGeometry()
            {
                Center = new float3(0, 0, 0) - new float3(startPosition.x - endPosition.x,
                                                          startPosition.y - endPosition.y,
                                                          1) / 2,
                Size        = (size * math.sign(size)) + new float3(1, 1, 1),
                Orientation = quaternion.identity,
                BevelRadius = 0,
            };
            BlobAssetReference <Unity.Physics.Collider> boxColliser = Unity.Physics.BoxCollider.Create(boxGeometry, filter);
            ColliderCastInput input = new ColliderCastInput()
            {
                Collider    = (Unity.Physics.Collider *)boxColliser.GetUnsafePtr(),
                Orientation = quaternion.identity,
                Start       = startPosition,
                End         = startPosition
            };
            NativeList <ColliderCastHit> allHits = new NativeList <ColliderCastHit> (500, Allocator.Temp);
            bool haveHit = collisionWorld.CastCollider(input, ref allHits);

            if (haveHit)
            {
                for (int i = 0; i < allHits.Length; i++)
                {
                    var    hit = allHits[i];
                    Entity e   = physicsWorld.Bodies[hit.RigidBodyIndex].Entity;
                    entityCommandBuffer.AddComponent(index, e, new SelectedTag());
                }
            }
        }
示例#4
0
        public void Execute(ArchetypeChunk chunk, int chunkIndex, int firstEntityIndex)
        {
            ColliderCastInput colliderCastInput = new ColliderCastInput
            {
                Collider    = Collider,
                Orientation = Orientation,
                Start       = Start,
                End         = End
            };

            if (CollectAllHits)
            {
                World.CastCollider(colliderCastInput, ref ColliderCastHits);
            }
            else if (World.CastCollider(colliderCastInput, out ColliderCastHit hit))
            {
                ColliderCastHits.Add(hit);
            }
        }