protected override JobHandle OnUpdate(JobHandle inputDeps) { var handle = Entities.ForEach((ref MovementOrder movementOrder, in InterceptTarget interceptTarget, in Position position, in Movement movement, in MovementCapabilities movementCapabilities) => { var intercept = PhysicsUtils.AccelerationToIntercept( new PhysicalState { Position = position.Value, Velocity = movement.Velocity, Acceleration = movement.Acceleration, }, new PhysicalState { Position = interceptTarget.Position, Velocity = interceptTarget.Velocity, Acceleration = interceptTarget.Acceleration, }, PhysicsUtils.GeesToMs2(movementCapabilities.MaxAccelerationMagnitude) ); movementOrder.Heading = math.normalize(intercept.Acceleration); movementOrder.AccelerationMagnitude = movementCapabilities.MaxAccelerationMagnitude; }).Schedule(inputDeps);
void Update() { if (Input.GetKeyDown(KeyCode.KeypadPlus)) { var maxSteps = closestApproaches.Count + 1; var ca = PhysicsUtils.ClosestApproach( new PhysicalState { Position = fromVector3(Subject.position), Velocity = subjectVelocity, Acceleration = subjectAcceleration }, new PhysicalState { Position = fromVector3(Target.position), Velocity = targetVelocity, Acceleration = targetAcceleration }, 1.0f, maxSteps ); var dist = ca.x; var tti = ca.y; var fSubject = PhysicsUtils.PredictFutureState(new PhysicalState() { Position = Subject.position, Velocity = subjectVelocity, Acceleration = subjectAcceleration }, tti).Position; var fTarget = PhysicsUtils.PredictFutureState(new PhysicalState() { Position = Target.position, Velocity = targetVelocity, Acceleration = targetAcceleration }, tti).Position; var diffDist = math.distance(fSubject, fTarget); closestApproaches.Add(new ClosestApproachResult() { distance = dist, tti = tti, subjectPosition = fSubject, targetPosition = fTarget, distCheck = diffDist }); Text.text += "\nCD: " + dist + " / DD: " + diffDist; } if (Input.GetKeyDown(KeyCode.Space)) { var lastTti = -1f; for (var maxSteps = 1; maxSteps < 10; maxSteps++) { var intercept = PhysicsUtils.AccelerationToIntercept( new PhysicalState { Position = fromVector3(Subject.position), Velocity = subjectVelocity, Acceleration = subjectAcceleration }, new PhysicalState { Position = fromVector3(Target.position), Velocity = targetVelocity, Acceleration = targetAcceleration }, maxAccMag, 1.0f, maxSteps ); // if (intercept.TimeToIntercept - lastTti < float.Epsilon) break; lastTti = intercept.TimeToIntercept; intercepts.Add(intercept); } } if (Input.GetKeyDown(KeyCode.Return)) { intercepts.Clear(); closestApproaches.Clear(); Text.text = ""; } }