void FixedUpdate() { CurrentState.BeforeFixed(); //React to input. if (MovementKeyAxes.x != 0) { CurrentState = CurrentState; } CurrentState.Sideways(MovementKeyAxes.x); if (MovementKeyAxes.y == 0.0f) { LockVerticalControls = false; } if (!LockVerticalControls && MovementKeyAxes.y > 0.0f) { CurrentState.Up(); } if (!LockVerticalControls && MovementKeyAxes.y < 0.0f) { CurrentState.Down(); } //Accelerate. Velocity += (CurrentGravity + Propulsion) * Time.fixedDeltaTime / ActorProps.Mass; MostRecentPropulsion = Propulsion; Propulsion = Vector3.zero; CurrentState.AfterAccel(); //Constrain the velocity. CurrentState.BeforeConstrainVelocity(); Velocity.z = 0; if (Mathf.Abs(Velocity.x) > PlayerProps.MaxSpeeds.x) { Velocity.x = Sign(Velocity.x, WorldConstants.MinMovementSpeed) * PlayerProps.MaxSpeeds.x; } if (Mathf.Abs(Velocity.y) > PlayerProps.MaxSpeeds.y) { Velocity.y = Sign(Velocity.y, WorldConstants.MinMovementSpeed) * PlayerProps.MaxSpeeds.y; } CurrentState.AfterConstrainVelocity(); //Move. CurrentState.BeforeMove(); Velocity = CurrentState.ApplyFriction(Velocity); Vector3 old = transform.position; //Set velocity to zero if it's too small. if (Velocity.magnitude < WorldConstants.MinMovementSpeed) { Velocity = Vector3.zero; } //Move. if (Velocity != Vector3.zero) { collided = false; transform.position += Velocity * Time.fixedDeltaTime; } //Set the velocity to the displacement. if ((transform.position - old).magnitude / Time.fixedDeltaTime < WorldConstants.MinMovementSpeed) { Velocity = Vector3.zero; } if (!collided) { Velocity = (transform.position - old) / Time.fixedDeltaTime; } //Check for being outside the map. CheckOutside(); //Finish up. CurrentState.AfterMove(); ColManager.CheckWallBounds(); CurrentState.AfterFixed(); }