示例#1
0
    private void OnTriggerEnter2D(Collider2D collider)
    {
        ShipPart   shipPart   = collider.GetComponent <ShipPart>();
        Projectile projectile = collider.GetComponent <Projectile>();
        Shields    shields    = collider.GetComponent <Shields>();
        bool       hitShields = collider is CircleCollider2D && shields != null;

        if (hitShields)
        {
            if (shields.active && !alreadyDamaged)
            {
                SpawnImpact(collider);
                shields.TakeDamage(damage);
                Vector2 toProjectile = (transform.position - shields.transform.position).normalized;
                rb.velocity      = toProjectile * rb.velocity.magnitude;
                transform.up     = toProjectile;
                gameObject.layer = LayerMask.NameToLayer(LayerMask.LayerToName(gameObject.layer) == "Friendly" ? "Hostile" : "Friendly");
                if (target != null)
                {
                    Transform tmp = target;
                    target     = originator;
                    originator = tmp;
                }
                return;
            }
        }
        if (shipPart != null)
        {
            if (!alreadyDamaged && !hitShields)
            {
                shipPart.TakeDamage(damage);
                alreadyDamaged = true;
                Die(collider);
            }
        }
        else if (projectile != null)
        {
            if (target != null)
            {
                Die(collider); // Missiles get killed by projectiles
            }
        }
        else
        {
            Debug.Log("I don't know what this projectile just hit: " + collider.gameObject);
        }
    }
示例#2
0
    public void TakeDamage(GameObject other)
    {
        if (_hasShields)
        {
            _shields.TakeDamage();
            if (_shields.HasShieldDepleted())
            {
                ActivateShields(false);
                _hasShields = false;
            }
        }
        else
        {
            Destroy(other.gameObject);
            SetAsDestroyed();

            _player.IncreaseScore(10);
        }
    }
示例#3
0
    public void TakeDamage(float damage)
    {
        if (!_isImmune)
        {
            StartCoroutine(nameof(ShakeCameraRoutine));
            if (_isShieldsUpActive)
            {
                if (_shields != null)
                {
                    _shields.TakeDamage();
                    if (_shields.HasShieldDepleted())
                    {
                        ActivateShields(false);
                    }
                }
            }
            else
            {
                _lives--;
                if (_uiManager)
                {
                    _uiManager.UpdateLives(_lives);
                }
                if (_lives < 1)
                {
                    GameOver();
                }
                else
                {
                    print($"Remaining Lives {_lives}");
                    DamageAnEngine();
                }
            }

            StartCoroutine(StartImmunityRoutine());
        }
    }