/// <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; } } } }
/// <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; } }
/// <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); }
/// <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); }
/// <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; }