public virtual void Start() { _hitEffect = this.GetComponent <IHitEffect>(); _hitAction = this.GetComponent <IHitAction>(); _destroyAction = this.GetComponent <IDestroyAction>(); }
public void ReceiveDamage(Impact impact) { if (!isInvulnerable && !isOnDespawn) { impact.damagePoint = impact.damagePoint * damagesSensitivity[impact.damageNature]; life -= impact.damagePoint; damageStack += impact.damagePoint; onHit.Invoke(impact); // Life is over if (life <= 0 && !isOnDespawn) { // Hit if (hitEffects.Length > 0) { for (int i = 0; i < hitEffects.Length; i++) { GameObject tmpObj = PoolManager.Spawn(hitEffects[i], impact.hitPoint + hitEffectOffset, Quaternion.identity); IHitEffect effect = tmpObj.GetComponent <IHitEffect>(); if (effect != null) { effect.InitHitEffect(impact); } } onHit.Invoke(impact); } Kill(); // Score management if (impact.owner && impact.owner.CompareTag("Player")) { GameEntity playerEntity = impact.owner.GetComponent <GameEntity>(); if ((playerEntity && playerEntity.life > 0) || playerEntity == null) { GameManager.instance.Add2Score(scorePoint); } } } else { // Force if (impact.isPhysic && cachedRigidbody && addForceFromImpact) { if (impact.damageType == DamageType.Simple) { cachedRigidbody.AddForceAtPosition(impact.hitNormal * impact.force * -1 * damagesSensitivity[impact.damageNature], impact.hitPoint, impact.forceMode); } else { cachedRigidbody.AddExplosionForce(impact.force, impact.hitPoint, impact.damageRadius, 2f, impact.forceMode); } } // Hit Effect if (hitEffects.Length > 0 && damageStack >= damageThreshold) { for (int i = 0; i < hitEffects.Length; i++) { impact.damagePoint = damageStack; GameObject tmpObj = PoolManager.Spawn(hitEffects[i], impact.hitPoint + hitEffectOffset, Quaternion.identity); IHitEffect effect = tmpObj.GetComponent <IHitEffect>(); if (effect != null) { effect.InitHitEffect(impact); } } damageStack = 0; } } } }