В 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;
}
}
Так и есть(получилось как в update). У тебя в Update кидается raycast, потом проверяется stGive() на тэг, и запускается корутина. Так вот у тебя этих корутин запускается каждый кадр, в котором срабатывает проверка на тэг(то есть допустим за 1 секунду 60 кадров, 50 их них райкаст попадает и тэг подходит, запускается 50 корутин). За первые 10 корутин твой враг умирает(а это меньше секунды).
p.s. Учи мать часть по поводу корутин. Каждый запуск создает, независимый от предыдущего, объект.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости