コード例 #1
0
    // 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
        }
    }
コード例 #2
0
    // 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)
    {
        enemy  = animator.gameObject.GetComponentInParent <MELEE_enemy>();
        target = enemy.target;



        waitedTime = 0;

        //Hacer que el enemigo mire hacia su objetivo
        enemy.transform.LookAt(target.transform.position);
        enemy.isVulnerable = false; //Hacerlo invulnerable durante la ventana de tiempo en la que 'anuncia' su ataque.

        //Detener en seco al enemigo
        enemy.agent.isStopped = true;
        enemy.agent.velocity  = Vector3.zero;

        //DECISIÓN DE ATAQUE
        //Una vez preparadas las condiciones para atacar, el enemigo decidirá cómo atacar (ataque simple o ataque WP) en base a su condición actual:

        if (enemy.willpower > enemy.tripleChargeCost) //Si el enemigo tiene la posibilidad de ejecutar el ataque WP, lo
        {
            //Lo ejecutará
            doesTripleCharge = true;

            //Y el aviso para hacerlo durará más tiempo que con un ataque normal:
            attackWaitTime = specialAttackWaitTime;

            //Anuncia ataque con un bark/popup visual !!!1
            var     canvas           = GameObject.FindGameObjectWithTag("InferiorCanvas");
            Vector3 viewportPosition = Camera.main.WorldToScreenPoint(new Vector3(enemy.transform.position.x, enemy.transform.position.y + 2, enemy.transform.position.z));

            bark = Instantiate(barkAttackPrefab, viewportPosition, Quaternion.identity);
            bark.GetComponentInChildren <Text>().text = specialAttackName;
            bark.transform.SetParent(canvas.transform, false);
            bark.transform.position = new Vector3(viewportPosition.x, viewportPosition.y, viewportPosition.z);
        }
        else //En caso de que no sea posible para él ejecutarlo,
        {
            //Ataca de forma básica,
            doesTripleCharge = false;
        }
    }