/// <summary>
        /// Return projectile with sent data
        /// </summary>
        /// <param name="data">Data</param>
        /// <returns>Projectile</returns>
        public AbstractProjectile GetProjectile(AbstractProjectileData data)
        {
            if (CheckData(data) == false)
            {
                AbstractProjectile projectile = CreateProjectile(data);

                if (isInitPreferedPoolSize)
                {
                    coroutines.Add(StartCoroutine(InitPoolCoroutine(data)));
                }

                return(projectile);
            }

            AbstractProjectile foundedProjectile = dictionary[data.Id].List.Where(p => p && p.IsActive == false).FirstOrDefault();

            if (foundedProjectile)
            {
                return(foundedProjectile);
            }

            if (isInitPreferedPoolSize)
            {
                coroutines.Add(StartCoroutine(AddProjectilesCoroutine(data, data.PreferedPoolSize - 1)));
            }

            return(CreateProjectile(data));
        }
        /// <summary>
        /// Delete inactive projectiles with sent data from pool until reached minimal size
        /// </summary>
        /// <param name="data">Data</param>
        /// <param name="customMinimalSize">Size of pool will be equal or bigger</param>
        public void Shrink(AbstractProjectileData data, uint customMinimalSize = 0)
        {
            uint size = customMinimalSize == 0 ? data.PreferedPoolSize : customMinimalSize;

            CheckData(data);

            RemoveInactiveProjectiles(dictionary[data.Id]);
        }
        public override void Init(ShootData shootData, AbstractProjectileData projectileData)
        {
            SimpleProjectileData downCastedProjectileData = projectileData as SimpleProjectileData;

            InitTransform(shootData);

            speed = downCastedProjectileData.Speed;

            IsActive = true;
        }
        private AbstractProjectile CreateProjectile(AbstractProjectileData data)
        {
            AbstractProjectile createdProjectile
                = Instantiate(data.Prefab, dictionary[data.Id].Pool).GetComponent <AbstractProjectile>();

            createdProjectile.IsActive = false;

            dictionary[data.Id].List.Add(createdProjectile);

            return(createdProjectile);
        }
        /// <summary>
        /// Instantiate pool with projectiles with sent data until reached minimal size
        /// </summary>
        /// <param name="data">Data</param>
        /// <param name="customMinimalSize">Size of pool will be equal or bigger</param>
        public void InitPool(AbstractProjectileData data, uint customMinimalSize = 0)
        {
            uint size = customMinimalSize == 0 ? data.PreferedPoolSize : customMinimalSize;

            CheckData(data);

            while (dictionary[data.Id].List.Count < size)
            {
                CreateProjectile(data);
            }
        }
Example #6
0
        /// <summary>
        /// Cast projectile
        /// </summary>
        /// <param name="position">Position</param>
        /// <param name="direction">Direction</param>
        /// <param name="data">Data</param>
        public void Cast(ShootData shootData, AbstractProjectileData projectileData)
        {
            AbstractProjectile projectile = projectilePool.GetProjectile(projectileData);

            if (projectile == false)
            {
                Debug.LogError("projectile == null");

                return;
            }

            projectile.Init(shootData, projectileData);
        }
        /// <summary>
        /// Add projectiles
        /// </summary>
        /// <param name="data"></param>
        /// <param name="amount"></param>
        /// <returns></returns>
        public IEnumerator AddProjectilesCoroutine(AbstractProjectileData data, uint amount = 0)
        {
            uint size = amount == 0 ? data.PreferedPoolSize : amount;

            CheckData(data);

            for (int i = 0; i < size; ++i)
            {
                CreateProjectile(data);

                yield return(null);
            }
        }
        /// <summary>
        /// Instantiate pool with projectiles with sent data until reached minimal size
        /// </summary>
        /// <param name="data">Data</param>
        /// <param name="customMinimalSize">Size of pool will be equal or bigger</param>
        public IEnumerator InitPoolCoroutine(AbstractProjectileData data, uint customMinimalSize = 0)
        {
            uint size = customMinimalSize == 0 ? data.PreferedPoolSize : customMinimalSize;

            CheckData(data);

            while (dictionary[data.Id].List.Count < size)
            {
                CreateProjectile(data);

                yield return(null);
            }
        }
Example #9
0
        public override void Init(ShootData shootData, AbstractProjectileData projectileData)
        {
            RigidbodyProjectileData downCastedProjectileData = projectileData as RigidbodyProjectileData;

            InitTransform(shootData);

            startForce = downCastedProjectileData.StartForce;

            previousPosition = transform.position;

            IsActive = true;

            body.velocity        = Vector3.zero;
            body.angularVelocity = Vector3.zero;
            body.AddForce(transform.forward * startForce, ForceMode.Impulse);
        }
        private bool CheckData(AbstractProjectileData data)
        {
            if (dictionary is null)
            {
                dictionary = new IdProjectilePoolDictionary();
            }

            if (dictionary.ContainsKey(data.Id) == false)
            {
                GameObject pool = new GameObject(data.Id + " Pool");
                pool.transform.parent = transform;

                dictionary.Add(data.Id, new SpecificProjectilePool(pool.transform, new List <AbstractProjectile>()));

                return(false);
            }

            return(true);
        }
Example #11
0
 /// <summary>
 /// Init projectile
 /// </summary>
 /// <param name="position">Position</param>
 /// <param name="direction">Direction</param>
 /// <param name="data">Data</param>
 public virtual void Init(ShootData shootData, AbstractProjectileData projectileData)
 {
     InitTransform(shootData);
 }