Убивает мгновенно врага

208
05 декабря 2017, 18:07

В IEnumerator"е я написал метод перехода анимации удара главного персонажа. Врагу наносится урон тогда, когда враг попадает в трехметровый луч от персонажа и когда проигрывается анимация удара(триггеров не использую). Дело в том, что анимация как и должна работает с перерывами(Она получилась автоматическая при попадании врага в луч). Но метод, который отнимает хп у врага, странно работает. Я задал, чтобы он отнимал по 10 хп при каждом проигрыше анимации. Но врага, у которого 100 хп он убивает меньше чем за секунду, словно этот метод работает в методе Update.

Скрипт игрока:
public class PlayerController : MonoBehaviour {
    float maxhp = 100;
    public float curHp;
    Animator swordAnim;
    EnemyStates state;
    RaycastHit hit;

    // Use this for initialization
    void Start () {
        curHp = maxhp;
        swordAnim = GameObject.FindWithTag("Sword").GetComponent<Animator>();
    }
    // Update is called once per frame
    void Update () {
        Ray ray = new Ray(transform.position, transform.forward);
        Debug.DrawRay(ray.origin, ray.direction * 3f, Color.green);
        if (Physics.Raycast(ray, out hit, 3))
        {            
                stGive();
                state = hit.collider.gameObject.GetComponent<EnemyStates>();
                Debug.Log(hit.collider.name);            
        }
    }
    public void stGive()
    {
        if (hit.collider.gameObject.tag == ("Enemy"))
            StartCoroutine(GiveAt());
    }

      IEnumerator  GiveAt()
    {
        swordAnim.SetBool("attack", true);       
        swordAnim.SetBool("idle", false);
        state.GetDamage(10f);
        yield return new WaitForSeconds(0.5f);
        swordAnim.SetBool("idle", true);
        swordAnim.SetBool("attack", false);
    }
}

скрипт врага :

public class EnemyStates : MonoBehaviour {
    float EnemyLife = 100;
    public float curEnemyLife;
    float damage;

    void Start () {
        curEnemyLife = EnemyLife;
    }
    // Update is called once per frame
    void Update () {
        if(curEnemyLife <=0)
        {
            Destroy(gameObject);
        }
    }
    public void GetDamage(float dmg)
    {        
        curEnemyLife -= dmg;
    }
}
Answer 1

Так и есть(получилось как в update). У тебя в Update кидается raycast, потом проверяется stGive() на тэг, и запускается корутина. Так вот у тебя этих корутин запускается каждый кадр, в котором срабатывает проверка на тэг(то есть допустим за 1 секунду 60 кадров, 50 их них райкаст попадает и тэг подходит, запускается 50 корутин). За первые 10 корутин твой враг умирает(а это меньше секунды).

p.s. Учи мать часть по поводу корутин. Каждый запуск создает, независимый от предыдущего, объект.

READ ALSO
Как увеличить на 1 значение в DataGridView?

Как увеличить на 1 значение в DataGridView?

Имеется таблица DataGridViewКаждая ее строка должна быть уникальной, если же происходит попытка добавления уже существующей строки, то значение...

284
Удалить очень длинные имена с Filepath

Удалить очень длинные имена с Filepath

Есть задача удалить слишком длинные имена с пути, чтобы обойти exception:

248
Чтение данных аккаунта Facebook

Чтение данных аккаунта Facebook

Суть вопроса в следующем: как используя(или не используя) C# Facebook SDK получить ссылки на каждый пост определённого пользователя, а также количество...

282
MySQL и Visual Studio 2017

MySQL и Visual Studio 2017

Пытаюсь подружить MySql и Visual Studio 2017 (написать элементарную примитивную программу вывода данных из БД)Установил MYSQL for Visual Studio, Connector/Net 6

377