В 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. Учи мать часть по поводу корутин. Каждый запуск создает, независимый от предыдущего, объект.
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Имеется таблица DataGridViewКаждая ее строка должна быть уникальной, если же происходит попытка добавления уже существующей строки, то значение...
Есть задача удалить слишком длинные имена с пути, чтобы обойти exception:
Суть вопроса в следующем: как используя(или не используя) C# Facebook SDK получить ссылки на каждый пост определённого пользователя, а также количество...
Пытаюсь подружить MySql и Visual Studio 2017 (написать элементарную примитивную программу вывода данных из БД)Установил MYSQL for Visual Studio, Connector/Net 6