/// <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); } }
/// <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); } }
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); }
/// <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); }