Пример #1
0
    IEnumerator DefendingAttack(GameObject attackTarget)
    {
        target = attackTarget.GetComponent <AttackTarget>();

        while (target.GetHealth() > 0)
        {
            Vector3 closestToTarget = GetComponent <Collider>().ClosestPoint(attackTarget.transform.position);
            Vector3 closestToThis   = attackTarget.GetComponent <Collider>().ClosestPoint(transform.position);

            if (Vector3.Distance(closestToThis, closestToTarget) < 50 && Vector3.Distance(closestToThis, closestToTarget) > weapon.GetRange())
            {
                animator.SetBool("Attacking", false);

                if (gameObject.GetComponent <IndividualMovement>().moving == false)
                {
                    GetComponent <IndividualMovement>().MoveTo(new Destination(attackTarget), null, true);
                }

                yield return(new WaitForSeconds(0.05f));
            }

            else if (Vector3.Distance(closestToThis, closestToTarget) > 50)
            {
                ChangeState(AttackUnitState.DEFENDING);
            }

            else
            {
                animator.SetBool("Attacking", true);
                target.TakeDamage(weapon.GetDamage());

                Vector3 dir = (attackTarget.transform.position - transform.position).normalized;

                transform.rotation = Quaternion.LookRotation(new Vector3(dir.x, 0, dir.z), Vector3.up);

                if (target.GetHealth() <= 0)
                {
                    ChangeState(AttackUnitState.DEFENDING);
                }

                yield return(new WaitForSeconds(1.0f / weapon.GetFiringRate()));
            }
        }
        ChangeState(AttackUnitState.DEFENDING);
        yield return(null);
    }
Пример #2
0
    new public void Update()
    {
        //base.Update();
        if (hp <= 0)
        {
            //Удалить все эффекты
            fightController.enemies.Remove(this);
            DestroyHalo(halo);
            Death();
        }
        HB.GetComponentInChildren <TextMeshProUGUI>().text = $"{Mathf.Ceil(hp)}/{Mathf.Ceil(maxhp)}";
        if (time > 0)
        {
            time -= Time.deltaTime;
        }
        else
        {
            time = cooldown;
            float r = Random.Range(0, 2);
            switch (r)
            {
            case 0:
                SetTargetRandom();
                StartCoroutine(AtakeAnim());
                AttackTimeout = AttackCooldown;
                float dam = Random.Range(DamageMin, DamageMax) * (1 + power / 100);
                AttackTarget.TakeDamage(dam);
                TakeHeal(dam);
                StartCoroutine(AttackTarget.TakingDamageAnim());
                break;

            case 1:
                foreach (var x in fightController.friends)
                {
                    var st = Instantiate(vulnerability, x.transform);
                    st.Name      = "Уязвимость";
                    st.lifetime  = 8;
                    st.koef      = Information.GetEffectStates("Уязвимость", 1, 0)[0];
                    st.character = x;
                    x.TakeDamage(3);
                }
                break;
            }
        }
    }
Пример #3
0
    IEnumerator EnemyAttack(GameObject attackTarget)
    {
        AttackTarget target = attackTarget.GetComponent <AttackTarget>();

        while (target.GetHealth() > 0)
        {
            Vector3 closestToTarget = GetComponent <Collider>().ClosestPoint(attackTarget.transform.position);
            Vector3 closestToThis   = attackTarget.GetComponent <Collider>().ClosestPoint(transform.position);

            if (Vector3.Distance(closestToThis, closestToTarget) > attackRange)
            {
                animator.SetBool("Attacking", false);

                if (gameObject.GetComponent <IndividualMovement>().moving == false)
                {
                    GetComponent <IndividualMovement>().MoveTo(new Destination(attackTarget), null, true);
                }

                yield return(new WaitForSeconds(0.05f));
            }
            else
            {
                animator.SetBool("Attacking", true);
                target.TakeDamage(attackDamage);

                if (target.GetHealth() <= 0)
                {
                    ChangeEnemyState(EnemyState.RANDOM_MOVING);
                }

                Vector3 dir = (attackTarget.transform.position - transform.position).normalized;

                transform.rotation = Quaternion.LookRotation(new Vector3(dir.x, 0, dir.z), Vector3.up);

                yield return(new WaitForSeconds(1.0f / attackRate));
            }
        }
        ChangeEnemyState(EnemyState.RANDOM_MOVING);
        yield return(null);
    }
Пример #4
0
    new public void Update()
    {
        allTime += Time.deltaTime;
        //base.Update();
        if (hp <= 0)
        {
            //Удалить все эффекты
            fightController.enemies.Remove(this);
            DestroyHalo(halo);
            Death();
        }
        HB.GetComponentInChildren <TextMeshProUGUI>().text = $"{Mathf.Ceil(hp)}/{Mathf.Ceil(maxhp)}";
        if (time > 0)
        {
            time -= Time.deltaTime;
        }
        else
        {
            time = cooldown;
            float r = Random.Range(0, 3);
            switch (r)
            {
            case 0:
                foreach (var x in fightController.friends)
                {
                    var st = Instantiate(weak, x.transform);
                    st.Name      = "Ослабление";
                    st.lifetime  = 8;
                    st.percent   = Information.GetEffectStates("Ослабление", 0, -50)[0];
                    st.power     = -20;
                    st.character = x;
                    x.TakeDamage(damage);
                }
                break;

            case 1:
                SetTargetRandom();
                StartCoroutine(AtakeAnim());
                AttackTimeout = AttackCooldown;
                AttackTarget.TakeDamage(Random.Range(DamageMin, DamageMax) * (1 + power / 100));
                StartCoroutine(AttackTarget.TakingDamageAnim());
                break;

            case 2:
                foreach (var x in fightController.friends)
                {
                    var st = Instantiate(poison, x.transform);
                    st.Name      = "Отравление";
                    st.lifetime  = 8;
                    st.period    = 1;
                    st.damage    = 1;
                    st.character = x;
                    //x.TakeDamage(damage);
                }
                break;
            }
        }

        if (razmes && allTime > 12)
        {
            SetTargetRandom();
            StartCoroutine(AtakeAnim());
            StartCoroutine(AttackTarget.TakingDamageAnim());
        }
    }