private void DriftModeFlow() { var inputVec = new Vector2( Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); var acceleratePressed = Input.GetButtonDown("Accelerate"); var accelerateHeld = Input.GetButton("Accelerate"); var inputHeld = inputVec.sqrMagnitude > 0f; if (accelerateHeld && fuelInSeconds > 0f) { thruster.TryStartThrusting(); var inputPressed = Input.GetButtonDown("Up") || Input.GetButtonDown("Right") || Input.GetButtonDown("Left") || Input.GetButtonDown("Down"); // once reason for weirdness is that when this is pressed before accelerate removed, shit gets weird /*var inputPressed = Input.GetButtonDown("Up") || Input.GetButtonDown("Right") || Input.GetButtonDown("Left") || Input.GetButtonDown("Down") || || Input.GetButtonUp("Up") || Input.GetButtonUp("Right") || Input.GetButtonUp("Left") || Input.GetButtonUp("Down");*/ var unitDirection = inputHeld ? inputVec.normalized : new Vector2(mostRecentHorzX, 0f); if (acceleratePressed || inputPressed) { var dotProd = Vector2.Dot(unitDirection, currentPlayerDriftVelocity.Value.normalized); var driftSpeedToUse = Mathf.Approximately(dotProd, 1f) ? currentPlayerDriftVelocity.Value.magnitude : dotProd > 0f ? currentPlayerDriftVelocity.Value.magnitude * acuteDirectionRatio : Mathf.Approximately(dotProd, 0f) ? currentPlayerDriftVelocity.Value.magnitude * 0.5f : minDriftSpeed; currentPlayerDriftVelocity.Value = unitDirection * driftSpeedToUse; } // average turn is 0.25 seconds? // average acceleration turn might be change of 5 / 5 ... 1 second? var fuelToUse = Mathf.Min(fuelInSeconds.Value, Time.deltaTime); var changeInVelocity = unitDirection * driftAcceleration.Value * fuelToUse; currentPlayerDriftVelocity.Value = Vector2.ClampMagnitude( currentPlayerDriftVelocity + changeInVelocity, maxDriftSpeed); fuelInSeconds.Value = Mathf.Max(0f, fuelInSeconds.Value - fuelToUse); if (Mathf.Approximately(fuelInSeconds.Value, 0f)) { Debug.Log("fuel is gone"); fuelDepletedEvent.Raise(); } } else { thruster.TryStopThrusting(); } mostRecentHorzX = Mathf.Approximately(inputVec.x, 0f) ? mostRecentHorzX : inputVec.x; prevDirection = inputHeld ? inputVec : prevDirection; var displacement = currentPlayerDriftVelocity.Value * Time.deltaTime; transform.Translate(displacement); }