Update bird pooper speed discrepancy
This commit is contained in:
@@ -15,12 +15,22 @@ namespace Minigames.BirdPooper
|
||||
public UnityEngine.Events.UnityEvent OnFlap;
|
||||
public UnityEngine.Events.UnityEvent OnPlayerDamaged;
|
||||
|
||||
[Header("Flap Cooldown")]
|
||||
[Tooltip("Minimum seconds between flaps to prevent multi-tap issues on mobile")]
|
||||
[SerializeField] private float flapCooldown = 0.15f;
|
||||
|
||||
private Rigidbody2D _rb;
|
||||
private IBirdPooperSettings _settings;
|
||||
private float _verticalVelocity;
|
||||
private bool _isDead;
|
||||
private float _fixedXPosition; // Store the initial X position from the scene
|
||||
private bool _isInitialized; // Flag to control when physics/input are active
|
||||
private float _lastFlapTime = -Mathf.Infinity; // Track last flap time for cooldown
|
||||
|
||||
// Diagnostic tracking
|
||||
private int _updateFrameCount = 0;
|
||||
private float _maxDeltaTime = 0f;
|
||||
private float _minDeltaTime = float.MaxValue;
|
||||
|
||||
internal override void OnManagedAwake()
|
||||
{
|
||||
@@ -86,17 +96,44 @@ namespace Minigames.BirdPooper
|
||||
}
|
||||
|
||||
_isInitialized = true;
|
||||
Debug.Log($"[BirdPlayerController] Initialized! Fixed X position: {_fixedXPosition}");
|
||||
|
||||
// DIAGNOSTIC: Log all critical values that might differ between platforms
|
||||
Debug.Log($"[BirdPlayerController] ===== INITIALIZATION DIAGNOSTICS =====");
|
||||
Debug.Log($"[BirdPlayerController] Fixed X position: {_fixedXPosition}");
|
||||
Debug.Log($"[BirdPlayerController] Time.timeScale: {Time.timeScale}");
|
||||
Debug.Log($"[BirdPlayerController] Application.targetFrameRate: {Application.targetFrameRate}");
|
||||
Debug.Log($"[BirdPlayerController] Settings.Gravity: {_settings.Gravity}");
|
||||
Debug.Log($"[BirdPlayerController] Settings.FlapForce: {_settings.FlapForce}");
|
||||
Debug.Log($"[BirdPlayerController] Settings.MaxFallSpeed: {_settings.MaxFallSpeed}");
|
||||
Debug.Log($"[BirdPlayerController] Settings.MinY: {_settings.MinY}");
|
||||
Debug.Log($"[BirdPlayerController] Settings.MaxY: {_settings.MaxY}");
|
||||
Debug.Log($"[BirdPlayerController] ==========================================");
|
||||
}
|
||||
|
||||
private void Update()
|
||||
/// <summary>
|
||||
/// Using FixedUpdate for physics to ensure frame-rate independence.
|
||||
/// FixedUpdate runs at a fixed timestep (default 0.02s = 50fps) regardless of actual frame rate.
|
||||
/// </summary>
|
||||
private void FixedUpdate()
|
||||
{
|
||||
// Only run physics/movement if initialized
|
||||
if (!_isInitialized || _isDead || _settings == null || _rb == null)
|
||||
return;
|
||||
|
||||
// Apply manual gravity
|
||||
_verticalVelocity -= _settings.Gravity * Time.deltaTime;
|
||||
// DIAGNOSTIC: Track fixedDeltaTime (should be consistent)
|
||||
_updateFrameCount++;
|
||||
float dt = Time.fixedDeltaTime;
|
||||
if (dt > _maxDeltaTime) _maxDeltaTime = dt;
|
||||
if (dt < _minDeltaTime) _minDeltaTime = dt;
|
||||
|
||||
// Log diagnostics every 50 fixed frames (every second at 50fps fixed timestep)
|
||||
if (_updateFrameCount % 50 == 0)
|
||||
{
|
||||
Debug.Log($"[BirdPlayerController] FixedFrame {_updateFrameCount}: fixedDeltaTime={dt:F4}, min={_minDeltaTime:F4}, max={_maxDeltaTime:F4}, velocity={_verticalVelocity:F2}, pos.y={_rb.position.y:F2}");
|
||||
}
|
||||
|
||||
// Apply manual gravity using fixedDeltaTime for consistent physics
|
||||
_verticalVelocity -= _settings.Gravity * dt;
|
||||
|
||||
// Cap fall speed (terminal velocity)
|
||||
if (_verticalVelocity < -_settings.MaxFallSpeed)
|
||||
@@ -104,15 +141,26 @@ namespace Minigames.BirdPooper
|
||||
|
||||
// Update position manually
|
||||
Vector2 newPosition = _rb.position;
|
||||
newPosition.y += _verticalVelocity * Time.deltaTime;
|
||||
newPosition.y += _verticalVelocity * dt;
|
||||
newPosition.x = _fixedXPosition; // Keep X fixed at scene-configured position
|
||||
|
||||
// Clamp Y position to bounds
|
||||
newPosition.y = Mathf.Clamp(newPosition.y, _settings.MinY, _settings.MaxY);
|
||||
|
||||
_rb.MovePosition(newPosition);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update runs at actual frame rate for smooth visual updates like rotation.
|
||||
/// Physics calculations moved to FixedUpdate for frame-rate independence.
|
||||
/// </summary>
|
||||
private void Update()
|
||||
{
|
||||
// Only update visuals if initialized
|
||||
if (!_isInitialized || _isDead || _settings == null)
|
||||
return;
|
||||
|
||||
// Update rotation based on velocity
|
||||
// Update rotation based on velocity (visual only, runs at frame rate for smoothness)
|
||||
UpdateRotation();
|
||||
}
|
||||
|
||||
@@ -138,14 +186,25 @@ namespace Minigames.BirdPooper
|
||||
/// <summary>
|
||||
/// Makes the bird flap, applying upward velocity.
|
||||
/// Can be called by input system or externally (e.g., for first tap).
|
||||
/// Includes cooldown to prevent multi-tap issues on mobile devices.
|
||||
/// </summary>
|
||||
public void Flap()
|
||||
{
|
||||
if (!_isInitialized || _isDead || _settings == null)
|
||||
return;
|
||||
|
||||
// Cooldown check to prevent multi-tap issues (especially on mobile touchscreens)
|
||||
if (Time.time < _lastFlapTime + flapCooldown)
|
||||
{
|
||||
Debug.Log($"[BirdPlayerController] Flap rejected - on cooldown ({Time.time - _lastFlapTime:F3}s since last flap)");
|
||||
return;
|
||||
}
|
||||
|
||||
_verticalVelocity = _settings.FlapForce;
|
||||
Debug.Log($"[BirdPlayerController] Flap! velocity = {_verticalVelocity}");
|
||||
_lastFlapTime = Time.time;
|
||||
|
||||
// DIAGNOSTIC: Log flap details including time values
|
||||
Debug.Log($"[BirdPlayerController] FLAP! velocity={_verticalVelocity}, Time.time={Time.time}, Time.deltaTime={Time.deltaTime}, Time.timeScale={Time.timeScale}");
|
||||
|
||||
// Emit flap event
|
||||
OnFlap?.Invoke();
|
||||
|
||||
Reference in New Issue
Block a user