private void InitDamageables() { Damageable playerDamageable = new Damageable(null, "Health"); playerDamageable.MaxHealth = 100; playerDamageable.BaseResistance = new Damageable.Resistances(1, 1, 1); Damageables.Add("PlayerDamageable", playerDamageable); }
protected override IEnumerator Attack() { WaitForSeconds Wait = new WaitForSeconds(AttackDelay); yield return(Wait); while (Damageables.Count > 0) { for (int i = 0; i < Damageables.Count; i++) { if (HasLineOfSightTo(Damageables[i].GetTransform())) { targetDamageable = Damageables[i]; OnAttack?.Invoke(Damageables[i]); Agent.enabled = false; break; } } if (targetDamageable != null) { PoolableObject poolableObject = BulletPool.GetObject(); if (poolableObject != null) { bullet = poolableObject.GetComponent <Bullet>(); bullet.Damage = Damage; bullet.transform.position = transform.position + BulletSpawnOffset; bullet.transform.rotation = Agent.transform.rotation; bullet.Rigidbody.AddForce(Agent.transform.forward * BulletPrefab.MoveSpeed, ForceMode.VelocityChange); } } else { Agent.enabled = true; // no target in line of sight, keep trying to get closer } yield return(Wait); if (targetDamageable == null || !HasLineOfSightTo(targetDamageable.GetTransform())) { Agent.enabled = true; } Damageables.RemoveAll(DisabledDamageables); } Agent.enabled = true; AttackCoroutine = null; }