public void Update(GenericMotionConfig config, Rigidbody body) { UpdateCurrentState(config, body); // Flat land control var current = Velocity - Vector3.Project(Velocity, config.Up(body)); var target = Direction.AsVector(body, config) * config.MaxSpeed * SpeedMultiplier * Direction.Magnitude(); var fallingAccelerationMultiplier = Falling ? 0.0f : 1.0f; var delta = (target - current).normalized * config.Acceleration * fallingAccelerationMultiplier * Time.deltaTime; Velocity += delta; // Convery velocity into force to apply. current = body.velocity - Vector3.Project(body.velocity, config.Up(body)); target = Velocity - current; Force = target.magnitude * target.magnitude * target.normalized * body.mass; // Jumping DetectGround(config, body); if (Jumping) { if (Grounded && !Falling) { if (_elapsedSinceLastJump > config.MinJumpInterval) { Impulse = config.Up(body) * Direction.Jump * config.JumpSpeed * body.mass; Jumping = false; _elapsedSinceLastJump = 0f; } } } _elapsedSinceLastJump += Time.deltaTime; HaltMinimumVelocities(); }
private void DetectGround(GenericMotionConfig config, Rigidbody body) { if (!config.EnableGroundDetection) { return; } var root = config.GroundDetectionPoint != null ? config.GroundDetectionPoint : body.gameObject; var hits = Physics.RaycastAll(root.transform.position, -config.Up(body), config.GroundDetectionDistance, config.GroundCollisionMask); Grounded = hits.Any(i => i.collider.gameObject != body.gameObject); }
private void UpdateCurrentState(GenericMotionConfig config, Rigidbody body) { if (Grounded) { Falling = false; } else { Falling = body.velocity.y < config.JumpFallingThreshold; } if (Falling) { Jumping = false; } }
public Vector3 AsVector(object body, GenericMotionConfig config) { var rb = body as Rigidbody; if (rb != null) { return((config.Forward(rb) * Vertical + config.Right(rb) * Horizontal).normalized); } var rb2d = body as Rigidbody2D; if (rb2d != null) { return((config.Forward(rb2d) * Vertical + config.Right(rb2d) * Horizontal).normalized); } return(Vector3.zero); }
private void Process(object body, GenericMotionConfig config) { var sendEvent = false; var state = _motion.GetState(); var direction = state.GetDirection(); var isJumping = state.GetJumping(); var isFalling = state.GetFalling(); // Check if we need to send an event? if ((_isFalling && !isFalling) || (!_isFalling && isFalling)) { sendEvent = true; _isFalling = isFalling; } else if ((_isJumping && !isJumping) || (!_isJumping && isJumping)) { sendEvent = true; _isJumping = isJumping; } else { var v = SignOf(direction.Vertical); var vo = SignOf(_direction.Vertical); var h = SignOf(direction.Horizontal); var ho = SignOf(_direction.Horizontal); if ((v != vo) || (h != ho)) { sendEvent = true; _direction = direction.Clone(); } } // Send event if (sendEvent) { _eventHandler.Trigger(new GenericMotionEvent() { IsFalling = isFalling, IsJumping = isJumping, Direction = direction.AsVector(body, config) }); } }
public Vector3 AsVector(Rigidbody2D body, GenericMotionConfig config) { return((config.Right(body) * Horizontal).normalized); }
public Vector3 AsVector(Rigidbody body, GenericMotionConfig config) { return((config.Forward(body) * Vertical + config.Right(body) * Horizontal).normalized); }
public void Update(Rigidbody body, GenericMotionConfig config) { Process(body, config); }