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); }
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()); } } }
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); } }