Ejemplo n.º 1
0
    void FixedUpdate()
    {
        // Get player controller position in worldspace
        playerPos = player.transform.TransformPoint(playerController.center);

        // Check if the target is in sight range
        targetInSightRange = Vector3.Distance(transform.position, playerPos) <= sightRange;

        // Check if target is in attack range
        targetInAttackRange = Vector3.Distance(transform.position, playerPos) <= attackRange;

        // If in sight range, check if the target is obscured
        if (targetInSightRange || targetInAttackRange)
        {
            RaycastHit raycastHit;
            if (Physics.SphereCast(transform.position + transform.up, 0.5f, (playerPos - (transform.position + transform.up)), out raycastHit, 100f, sightBlockingMask))
            {
                // Debug.Log("Can see: "+raycastHit.transform.gameObject);
                canSeeTarget = raycastHit.transform.gameObject.tag == "Player";
            }
        }

        // Set animation variable(s)
        anim.SetBool("Moving", walking);

        // Set combat state
        if (!inCombat && targetInSightRange && canSeeTarget)
        {
            inCombat = true;
        }

        // Detect any spells in the area
        SpellData spellInArea = DetectSpells();

        // Check if the spells in the area will hit me
        bool willGetHit = (spellInArea != null) && spellInArea.WillHitObject(gameObject);

        // if (spellInArea != null) Debug.Log("Will I get hit by the incoming spell: "+willGetHit);

        // Check if waiting
        if (waitTime > 0f && !currentlyAttacking && !blocking && !takingDamage)
        {
            waitTime -= Time.deltaTime;
            // Debug.Log("Waiting...");
        }
        bool waiting = waitTime > 0f;

        // Thinking Logic
        if (health > 0f && willGetHit)
        {
            Block(spellInArea);
        }
        else if (health > 0f && inCombat && !waiting)
        {
            if ((!targetInAttackRange || (targetInAttackRange && !canSeeTarget)) && !currentlyAttacking && !blocking && !takingDamage)
            {
                ChaseTarget();
            }
            else
            {
                AttackTarget();
            }
        }
    }