Ejemplo n.º 1
0
 /// <summary>
 /// Do the actual hit.
 /// </summary>
 /// <param name="other">Other.</param>
 virtual protected void DoHit(Collider2D other)
 {
     // If we are a one shot and have already fired we can't cause damage any more, if not continue
     if (!oneShot || !hasFired)
     {
         if (damageCharacters)
         {
             CharacterHurtBox hurtBox = other.gameObject.GetComponent <CharacterHurtBox>();
             if (hurtBox != null)
             {
                 damageInfo.Direction  = transform.position - other.transform.position;
                 damageInfo.DamageType = damageType;
                 damageInfo.Amount     = damageAmount;
                 hurtBox.Damage(damageInfo);
                 hasFired = true;
             }
         }
         if (damageEnemies)
         {
             EnemyHurtBox enemyHurtBox = other.gameObject.GetComponent <EnemyHurtBox>();
             if (enemyHurtBox != null)
             {
                 damageInfo.Direction  = transform.position - other.transform.position;
                 damageInfo.DamageType = damageType;
                 damageInfo.Amount     = damageAmount;
                 enemyHurtBox.Damage(damageInfo);
                 hasFired = true;
             }
         }
     }
 }
Ejemplo n.º 2
0
        /// <summary>
        /// Do the actual hit.
        /// </summary>
        /// <param name="other">Other.</param>
        override protected void DoHit(Collider2D other)
        {
            CharacterHurtBox hurtBox = other.gameObject.GetComponent <CharacterHurtBox>();

            // Don't trigger hazards from a dead enemy
            if (hurtBox != null && deferredHit == null && (enemy.State != EnemyState.DEAD) && !oneShot)
            {
                deferredHit = hurtBox;
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Decide the next move
        /// </summary>
        override public EnemyState Decide()
        {
            RaycastHit2D hit = Physics2D.Raycast(myTransform.position, new Vector3(enemy.LastFacedDirection, 0, 0), enemyDistance, characterLayer);

            if (hit.collider != null)
            {
                CharacterHurtBox hurtBox = hit.collider.gameObject.GetComponent <CharacterHurtBox>();
                if (hurtBox != null)
                {
                    return(EnemyState.ATTACKING);
                }
            }
            return(EnemyState.PATROL);
        }
        /// <summary>
        /// Initialise this instance.
        /// </summary>
        override public Movement Init(Character character)
        {
            AssignReferences(character);

            if (shrinkHurtBox)
            {
                CharacterHurtBox chb = character.GetComponentInChildren <CharacterHurtBox>();
                if (chb != null)
                {
                    hurtBoxCollider = chb.GetComponent <Collider2D>();
                }
                if (hurtBoxCollider == null)
                {
                    Debug.LogError("Crouch will try to shrink hurt box collider, but no hurt box collider could be found.");
                }
            }

            if (shrinkHeadAndSides)
            {
                // Make sure the original head extent array is large enough to store each head collider height.
                // And initialise the new extents so we don't need to create anything later.
                int headCount = 0;
                for (int i = 0; i < character.Colliders.Length; i++)
                {
                    if (character.Colliders[i].RaycastType == RaycastType.HEAD)
                    {
                        headCount++;
                    }
                }
                originalHeadExtents = new Vector2[headCount];
                newHeadExtents      = new Vector2[headCount];
                headCount           = 0;
                for (int i = 0; i < character.Colliders.Length; i++)
                {
                    if (character.Colliders[i].RaycastType == RaycastType.HEAD)
                    {
                        originalHeadExtents[headCount] = character.Colliders[i].Extent;
                        newHeadExtents[headCount]      = new Vector2(character.Colliders[i].Extent.x, newHeadHeight);
                        headCount++;
                    }
                }
            }
            return(this);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Do the actual hit.
        /// </summary>
        /// <param name="other">Other.</param>
        override protected void DoHit(Collider2D other)
        {
            CharacterHurtBox hurtBox = other.gameObject.GetComponent <CharacterHurtBox>();

            // Don't trigger hazards from a dead enemy
            if (hurtBox != null && (enemy.State != EnemyState.DEAD) && (!hasFired))
            {
                damageInfo.Direction    = transform.position - other.transform.position;
                damageInfo.DamageType   = damageType;
                damageInfo.Amount       = damageAmount;
                damageInfo.DamageCauser = enemy;
                // Tell enemy we hit character - we need to do invulnerable check before we call Damage else the character may become invulnerable
                if (enemy != null && !hurtBox.IsInvulnerable)
                {
                    enemy.HitCharacter(hurtBox.Character, damageInfo);
                }
                hurtBox.Damage(damageInfo);
                hasFired = true;
            }
        }
        /// <summary>
        /// Decide the next move
        /// </summary>
        override public EnemyState Decide()
        {
            RaycastHit2D hit = Physics2D.Raycast(myTransform.position, new Vector3(enemy.LastFacedDirection, 0, 0), chargeDistance, characterLayer);

            if (hit.collider != null)
            {
                CharacterHurtBox hurtBox = hit.collider.gameObject.GetComponent <CharacterHurtBox>();
                if (hurtBox != null)
                {
                    // Work around becasue cahrge movement isn't great (to be updated soon)
                    GetComponent <EnemyMovement_Charge>().SetDirection(new Vector2(-Mathf.Sign(hurtBox.transform.position.x - myTransform.position.x), 0));
                    if (hit.distance <= attackDistance)
                    {
                        return(EnemyState.ATTACKING);
                    }
                    return(EnemyState.CHARGING);
                }
            }
            return(EnemyState.PATROL);
        }
Ejemplo n.º 7
0
 /// <summary>
 /// Unity late update hook.
 /// </summary>
 void LateUpdate()
 {
     // We process hits at the end of the frame so if physics calls multiple hitboxes we process character damage last
     // In other words if the cahracter both kills and gets killed by the enemy... the character "wins"
     if (deferredHit != null)
     {
         if ((enemy.State != EnemyState.DEAD) && (!oneShot || !hasFired))
         {
             damageInfo.Direction    = transform.position - deferredHit.Character.transform.position;
             damageInfo.DamageType   = damageType;
             damageInfo.Amount       = damageAmount;
             damageInfo.DamageCauser = enemy;
             // Tell enemy we hit character - we need to do invulnerable check before we call Damage else the character may become invulnerable
             if (enemy != null && !deferredHit.IsInvulnerable)
             {
                 enemy.HitCharacter(deferredHit.Character, damageInfo);
             }
             deferredHit.Damage(damageInfo);
             hasFired = true;
         }
     }
     deferredHit = null;
 }