Coroutine updates WIP

This commit is contained in:
Michal Pikulski
2025-09-18 14:29:10 +02:00
parent 3f52de9e1e
commit c5ce2ae1af
3 changed files with 249 additions and 40 deletions

View File

@@ -1,4 +1,5 @@
using UnityEngine;
using System.Collections;
using Pooling;
namespace Minigames.DivingForPictures
@@ -7,6 +8,7 @@ namespace Minigames.DivingForPictures
/// Complete floating obstacle component that handles movement and pooling.
/// Obstacles move upward toward the surface. Collision detection is handled by the player.
/// Once an obstacle hits the player, its collider is disabled to prevent further collisions.
/// Uses coroutines for better performance instead of Update() calls.
/// </summary>
public class FloatingObstacle : MonoBehaviour, IPoolable
{
@@ -42,6 +44,8 @@ namespace Minigames.DivingForPictures
private Collider2D _collider;
private Camera _mainCamera;
private float _screenTop;
private Coroutine _movementCoroutine;
private Coroutine _offScreenCheckCoroutine;
private void Awake()
{
@@ -60,22 +64,77 @@ namespace Minigames.DivingForPictures
_mainCamera = Camera.main;
}
private void Update()
private void OnEnable()
{
if (enableMovement)
{
HandleMovement();
}
CheckIfOffScreen();
StartObstacleBehavior();
}
private void OnDisable()
{
StopObstacleBehavior();
}
/// <summary>
/// Moves the obstacle upward based on its speed
/// Starts the obstacle behavior coroutines
/// </summary>
private void HandleMovement()
private void StartObstacleBehavior()
{
transform.position += Vector3.up * (moveSpeed * Time.deltaTime);
if (enableMovement)
{
_movementCoroutine = StartCoroutine(MovementCoroutine());
}
_offScreenCheckCoroutine = StartCoroutine(OffScreenCheckCoroutine());
}
/// <summary>
/// Stops all obstacle behavior coroutines
/// </summary>
private void StopObstacleBehavior()
{
if (_movementCoroutine != null)
{
StopCoroutine(_movementCoroutine);
_movementCoroutine = null;
}
if (_offScreenCheckCoroutine != null)
{
StopCoroutine(_offScreenCheckCoroutine);
_offScreenCheckCoroutine = null;
}
}
/// <summary>
/// Coroutine that handles obstacle movement
/// </summary>
private IEnumerator MovementCoroutine()
{
while (enabled && gameObject.activeInHierarchy)
{
// Move the obstacle upward
transform.position += Vector3.up * (moveSpeed * Time.deltaTime);
// Wait for next frame
yield return null;
}
}
/// <summary>
/// Coroutine that checks if obstacle has moved off-screen
/// Runs at a lower frequency than movement for better performance
/// </summary>
private IEnumerator OffScreenCheckCoroutine()
{
const float checkInterval = 0.2f; // Check every 200ms instead of every frame
while (enabled && gameObject.activeInHierarchy)
{
CheckIfOffScreen();
// Wait for the check interval
yield return new WaitForSeconds(checkInterval);
}
}
/// <summary>
@@ -177,5 +236,22 @@ namespace Minigames.DivingForPictures
{
ReturnToPool();
}
/// <summary>
/// Public method to enable/disable movement at runtime
/// </summary>
public void SetMovementEnabled(bool enabled)
{
if (enableMovement == enabled) return;
enableMovement = enabled;
// Restart coroutines to apply movement change
if (gameObject.activeInHierarchy)
{
StopObstacleBehavior();
StartObstacleBehavior();
}
}
}
}