// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { //REFERENCIAS enemy = animator.gameObject.GetComponentInParent <RANGED_enemy>(); target = enemy.target; forceApplier = animator.gameObject.GetComponentInParent <ForceApplier>(); enemy.transform.LookAt(target.transform.position); enemy.isVulnerable = false; //-ATTACK SETUP- //Ignora la colisión entre el enemigo y el objetivo del ataque para que no obstaculice la embestida Physics.IgnoreCollision(target.GetComponent <CharacterController>(), enemy.GetComponent <CharacterController>(), true); //Acto seguido, activa el trigger que es el que se encargará de gestionar si el ataque ha golpeado, su daño, knockback, etc. //enemy.attackCollider.enabled = true; //Y finalmente reemplazamos el daño 'default' por el daño de este ataque en concreto. enemy.damage = attackDamage; //-ATTACK ACTION- Instantiate(enemy.projectile, new Vector3(enemy.transform.position.x, enemy.transform.position.y + 1.2f, enemy.transform.position.z), enemy.transform.rotation); //Una vez se han establecido las condiciones para el ataque, se impulsa al enemigo en dirección a su objetivo, con una fuerza igual a 'attackImpulse' Vector3 attackDir = (target.transform.position - enemy.transform.position).normalized; forceApplier.AddImpact(new Vector3(-attackDir.x, 0, -attackDir.z), recoilImpulse); }
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { //REFERENCIAS enemy = animator.gameObject.GetComponentInParent <MELEE_enemy>(); target = enemy.target; forceApplier = animator.gameObject.GetComponentInParent <ForceApplier>(); //-ATTACK SETUP- enemy.transform.LookAt(target.transform.position); //Ignora la colisión entre el enemigo y el objetivo del ataque para que no obstaculice la embestida Physics.IgnoreCollision(target.GetComponent <CharacterController>(), enemy.GetComponent <CharacterController>(), true); //Acto seguido, activa el trigger que es el que se encargará de gestionar si el ataque ha golpeado, su daño, knockback, etc. enemy.attackCollider.enabled = true; //Y finalmente reemplazamos el daño 'default' por el daño de este ataque en concreto. enemy.damage = attackDamage; enemy.isVulnerable = false; //-ATTACK ACTION- //Una vez se han establecido las condiciones para el ataque, se impulsa al enemigo en dirección a su objetivo, con una fuerza igual a 'attackImpulse' forceApplier.AddImpact(new Vector3(enemy.transform.forward.x, 0, enemy.transform.forward.z), attackImpulse); if (enemy.weapon != null) { enemy.weapon.GetComponentInChildren <EnemyMeleeWeapon>().damage = attackDamage; enemy.weapon.transform.LookAt(target.transform.position); enemy.weapon.GetComponentInChildren <Animator>().SetTrigger("Attack"); //ESTO ESTA FEO Y HAY QUE HACERLO MAS BONITO } }
public void OnAttack() { print("evento recibido"); print(canAttack); if (canAttack) { //AUDIO AudioManager.engine.OnAttack(); // noOfTaps++; //En cada paso del combo, si se puede atacar, acumula un "tap" print("aumentando noOfTaps"); //Hacemos que el jugador se oriente hacia su enemigo fijado, para que los combos sean fluidos y comodos de ejecutar. if (lockedEnemy != null) { transform.LookAt(new Vector3(lockedEnemy.transform.position.x, transform.position.y, lockedEnemy.transform.position.z)); } //if (playerInput.currentControlScheme == "Keyboard + mouse") //Si se está usando ratón y teclado, apunta el ataque en la dirección del ratón. // playerTransform.LookAt(new Vector3(attackPointer.position.x, playerTransform.position.y, attackPointer.position.z)); } if (noOfTaps == 1) //Si el número de taps es exactamente 1, PRIMER GOLPE DEL COMBO { //Activa el trigger del animador para que reproduzca la animación correspondiente. animator.SetTrigger("Attack"); //Al comenzar el combo, bloqueamos el movimiento y el dash del jugador, que no podrá volver a moverse libremente hasta que decida terminar el combo. movementController.canMove = false; movementController.canDash = false; weaponAnimator.SetInteger("Animation", 1); forceApplier.AddImpact(playerTransform.forward, attackImpulse);//AÑADIR IMPULSO } }
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { //REFERENCIAS enemy = animator.gameObject.GetComponentInParent <RANGED_enemy>(); target = enemy.target; forceApplier = animator.gameObject.GetComponentInParent <ForceApplier>(); enemy.transform.LookAt(target.transform.position); //Mira a su objetivo //-ATTACK ACTION- GameObject animaKiller = Instantiate(animaKillerPrefab, new Vector3(enemy.transform.position.x, enemy.transform.position.y + 1.2f, enemy.transform.position.z), enemy.transform.rotation); animaKiller.GetComponent <ProjectileController>().target = target.transform; //Una vez se han establecido las condiciones para el ataque, se impulsa al enemigo en dirección a su objetivo, con una fuerza igual a 'attackImpulse' Vector3 attackDir = (target.transform.position - enemy.transform.position).normalized; forceApplier.AddImpact(new Vector3(-attackDir.x, 0, -attackDir.z), recoilImpulse); }
public void takeDamage(int damage, float knockbackForce, Vector3 knockbackDir, GameObject other) { if (isVulnerable) //Si el enemigo es vulnerable, { currentHealth -= damage; //Play hurt animation animator.SetTrigger("Hurt"); //Look at the one who attacked transform.LookAt(new Vector3(other.transform.position.x, transform.position.y, other.transform.position.z)); //Apply knockback received from the 'other' who attacks if (knockbackForce != 0) { forceApplier.AddImpact(new Vector3(knockbackDir.x, 0, knockbackDir.z), knockbackForce); } if (currentHealth <= 0) { Die(); //Si el HP se reduce por debajo de 0, el enemigo muere. } } }