Exemplo n.º 1
0
 public virtual void Start()
 {
     _hitEffect     = this.GetComponent <IHitEffect>();
     _hitAction     = this.GetComponent <IHitAction>();
     _destroyAction = this.GetComponent <IDestroyAction>();
 }
Exemplo n.º 2
0
        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;
                    }
                }
            }
        }