2016-10-15 5 views
0

У меня есть две функции, я хочу, чтобы harmPlayer() вызывался через каждые 5 секунд из функции Update(). Но он выполняется несколько сотен раз из функций update(). Я понимаю Update() функция получения выполняется на каждом кадре и звонит каждый раз в harmPlayer(), то как я могу реализовать ожидание в течение 5 секундCoroutine не ждет секунд

IEnumerator HarmPlayer() 
    { 
     Debug.Log("Inside Harm Player"); 
     yield return new WaitForSeconds(5); 
     Debug.Log("Player Health is the issue"); 

    } 

Вот мой Update() функция

void Update() { 

     transform.LookAt(target); 
     float step = speed * Time.deltaTime; 
     distance = (transform.position - target.position).magnitude; 
     if (distance < 3.5) 
     { 
      animator.SetFloat("Attack", 0.2f); 
      StartCoroutine("HarmPlayer"); 
     }  
    } 
+0

Это связано с тем, что ваша сопрограмма вызывается на каждое обновление, ожидая 5 секунд, а затем обрабатывая сопрограмму на все время ее вызова. Попробуйте использовать InvokeRepeating –

ответ

0

Ваши функции coroutine работают правильно. Проблема в том, что вы вызываете ее из функции Update, и ее вызывают много раз в секунду. Вы можете использовать переменную boolean, чтобы проверить, работает ли функция сопрограммы. Если он запущен, не атакуйте и не запускайте новую сопрограмму. Если это не так, вы можете запустить сопрограмму.

В конце функции coroutine установите эту переменную на false. Есть и другие способы сделать это, но это, пожалуй, самый простой способ.

bool isAttackingPlayer = false; 
IEnumerator HarmPlayer() 
{ 
    Debug.Log("Inside Harm Player"); 
    yield return new WaitForSeconds(5); 
    Debug.Log("Player Health is the issue"); 
    isAttackingPlayer = false; //Done attacking. Set to false 
} 

void Update() 
{ 

    transform.LookAt(target); 
    float step = speed * Time.deltaTime; 
    distance = (transform.position - target.position).magnitude; 
    if (distance < 3.5) 
    { 
     if (isAttackingPlayer == false) 
     { 
      isAttackingPlayer = true; //Is attacking to true 
      animator.SetFloat("Attack", 0.2f); 
      StartCoroutine("HarmPlayer"); 
     } 
    } 
} 
+1

Спасибо Программисту, Великий Великий, хороший .. Спасибо u :-) –

+0

Добро пожаловать! – Programmer

Смежные вопросы