private void CreatePools()
        {
            this.kinematicPool = new ObjectPoolMono <Projectile>(this.kinematicPrefab, this.kinematicPoolSize, this.transform)
            {
                isExpandable = this.isKinematicPoolExpandable
            };

            this.blasterPool = new ObjectPoolMono <Projectile>(this.blasterPrefab, this.blasterPoolSize, this.transform)
            {
                isExpandable = this.isBlasterPoolExpandable
            };
        }
        private IEnumerator FireGun(IWeaponInteractor interactor, ObjectPoolMono <Projectile> pool)
        {
            interactor.InitializeWeapon();
            while (true)
            {
                var projectile = pool.GetFreeElement();
                projectile.gameObject.transform.position = this.firePoint.transform.position;
                projectile.gameObject.GetComponent <Rigidbody>().velocity = Vector3.up * interactor.Velocity;

                projectile.damageOnHit = interactor.DamageOnHit;

                projectile.gameObject.layer = LayerMask.NameToLayer("PlayerProjectile");
                yield return(new WaitForSeconds(1 / interactor.FireRate));
            }
        }
        public void OpenFire(IWeaponInteractor interactor, ObjectPoolMono <Projectile> kinematicPool, ObjectPoolMono <Projectile> blasterPool)
        {
            Debug.Log($"Opening fire with {interactor.WeaponType}");
            switch (interactor.WeaponType)
            {
            case WeaponType.Kinematic:
                this.StartCoroutine(FireGun(interactor, kinematicPool));
                break;

            case WeaponType.Blaster:
                this.StartCoroutine(FireGun(interactor, blasterPool));
                break;

            case WeaponType.Laser:
                this.laser.SetActive(true);
                break;

            default:
                Debug.LogError("No weapon selected");
                break;
            }
        }