My Contributions in Space Shooter

private void FixedUpdate() 
{
    if(!GameManager.Instance.IsGamePlaying)
    {
        return;
    }
    Move(_moveInput);   
}

public void Move(Vector2 moveInput)
{
    _playerRB.AddForce(moveInput * moveSpeed,ForceMode.Impulse);
    Quaternion targetRotation = Quaternion.AngleAxis(moveInput.y * rotateAngle,Vector3.right);
    _playerRB.MoveRotation(Quaternion.Slerp(_playerRB.rotation,targetRotation,rotationSpeed * Time.fixedDeltaTime));    
}
public class Pool
{
    private Queue<PoolObject> _pooledObjects;

    public Pool(PoolObjectData poolObjectData,Transform parentTransform = null)
    {
        _pooledObjects = new Queue<PoolObject>();
        GameObject poolObjectsContainer = new GameObject(poolObjectData.actualObject.name + " Pool");
        if(parentTransform != null)
        {
            poolObjectsContainer.transform.parent = parentTransform;
        }
        for(int i = 0; i < poolObjectData.count; i++)
        {
            PoolObject poolObject = GameObject.Instantiate<PoolObject>(poolObjectData.actualObject);
            poolObject.Pool = this;
            poolObject.transform.parent = poolObjectsContainer.transform;
            poolObject.gameObject.SetActive(false);
            _pooledObjects.Enqueue(poolObject);    
        }
    }
    

    public PoolObject ReuseObject(Vector3 position,Quaternion rotation)
    {
        if(_pooledObjects.Count == 0)
        {
            return null;
        }
        PoolObject poolObject = _pooledObjects.Dequeue();
        poolObject.transform.position = position;
        poolObject.transform.rotation = rotation;
        poolObject.gameObject.SetActive(true);
        poolObject.Reuse();
        return poolObject;
    }

    public void ReturnObjectToPool(PoolObject poolObject)
    {
        if(poolObject == null)
        {
            Debug.LogError("Null object cannot be returned to pool!!");
            return;
        }

        if(!poolObject.Pool.Equals(this))
        {
            Debug.LogError(poolObject.name + " Pool not found!!");
            return;
        }

        _pooledObjects.Enqueue(poolObject);
    }
}
//Weapon powerup data scriptable object
[CreateAssetMenu(menuName = "Scriptable Objects/Weapon Powerup Data", fileName = "Weapon Powerup Data")]
public class WeaponPowerupData : ScriptableObject
{
    [Min(0f)]
    public float PowerUpActiveTime = 4.0f;

    public WeaponType WeaponType;
}

//Powerup class
public abstract class Powerup : MonoBehaviour
{
    [Min(0f)]
    [SerializeField]private float rotatingSpeed = 10f;

    [Min(0f)]
    [SerializeField]private float movingSpeed = 20f;

    [Min(0f)]
    [SerializeField]private float destroyTime = 3f;

    private float _currentTime;

    private void Start() {
        _currentTime = 0f;
    }
    private void Update() 
    {
        if(_currentTime >= destroyTime)
        {
            Destroy(gameObject);
            return;
        }

        _currentTime += Time.deltaTime;
    }
    private void FixedUpdate() 
    {
        transform.Translate(Vector3.right * -movingSpeed * Time.fixedDeltaTime,Space.World);
        transform.Rotate(Vector3.up * rotatingSpeed * Time.fixedDeltaTime,Space.World);
    }

    public abstract void Pickup(GameObject target);
}

//In BaseEnemy class
public virtual void TakeDamage(float amount)
{
    _health.OnHealthDamaged?.Invoke(amount);
    if(_health.CurrentAmount <= 0)
    {
        playerScoreData.IncreaseScore(amount);
        float probability = Random.Range(0f,1f);
        if(probability >= powerupSpawnProbability && powerup != null)
        {
            Instantiate(powerup,transform.position,Quaternion.identity);
        }
        SoundManager.Instance.PlayAtPoint(SoundType.ExplosionSound,transform.position);
        ExplosionManager.Instance?.GenerateExplosionEffect(transform.position,Quaternion.identity);
        base.Destroy();
    }
}