2016-03-25 3 views
0

Я сделал этот скрипт для проверки коллизий между игроком и ловушкой и удаления игроков hp. Он работает отлично, но hp уменьшается почти мгновенно. Я пытался использовать сопрограммы, но я не знаю, как заставить его работать.Подождите несколько секунд в цикле после столкновения

using UnityEngine; 
using System.Collections; 
using System; 

public class hp_loss : MonoBehaviour 

{ 

public float loss_hp = 1; 


    void OnTriggerStay2D(Collider2D other) 
    { 
     GameObject gObj = other.gameObject; 

     if (gObj.CompareTag("enemy") && hajs.hp > 0) 
     { 
      hajs.hp = hajs.hp - loss_hp; 
     } 
    } 
} 

ответ

0

Я хотел бы пойти на что-то таким образом ответ

float timer = 0; 
bool timerCheck = false; 
float timerThreshold = 1000; // value you want to wait 

void Update() 
{ 
    if(timerCheck) 
    { 
     timer += Time.deltaTime; 
    } 
    if (timer > timerThreshold) 
    { 
     timer = 0; 
     GameObject gObj = ...; // get player game object using GameObject.FindWithTag for example 

     if (gObj.CompareTag("enemy") && hajs.hp > 0) 
     { 
      hajs.hp = hajs.hp - loss_hp; 
     } 
    } 
} 

void OnCollisionEnter2D(Collider2D col) 
{ 
    timerCheck = true; 
} 

void OnCollisionExit2D(Collider2D col) 
{ 
    timerCheck = false; 
} 
+0

Отлично работает. Я немного изменил это, но идея такая же. – MiszczTheMaste

0

http://docs.unity3d.com/Manual/Coroutines.html

Я сомневаюсь, что вы хотите OnTriggerStay2D, как это будет срабатывать несколько раз.

IEnumerator OnTriggerEnter2D(Collider2D other) 
    { 
     yield return new WaitForSeconds(2f); 

     GameObject gObj = other.gameObject; 

     if (gObj.CompareTag("enemy") && hajs.hp > 0) 
     { 
      hajs.hp = hajs.hp - loss_hp; 
     } 
    } 
+0

После того, как я поставил его во время цикла, он работал отлично, но hp уменьшился и после столкновения (я имею в виду, когда я ушел от ловушки). Без цикла он уменьшал hp один раз. Я попытался использовать функцию «OnTriggerStay2D», но затем hp были удалены мгновенно. – MiszczTheMaste

+0

@MiszczTheMaste это уменьшится после того, как вы уйдете от ловушки, потому что ждать 2 секунды, вероятно, слишком долго. Когда игрок вводит триггер, этот код срабатывает в основной части через 2 секунды независимо от того, уходит ли игрок из ловушки. Трудно сказать, чего вы хотите, если вы просто хотите использовать wait, потому что у ловушки есть анимация или что-то еще, тогда установите время равной равной длине анимации. Вам не нужен цикл while. Используйте другие ответы, если вы хотите, чтобы несколько каплей hp попали в ловушку. –

0

greendhsde должны делать свою работу, но только в-случае, если вы хотите, чтобы сделать все это в функции OnTriggerStay2D без дополнительных функций и меньше кода, этот код тоже должен быть прекрасным. Чем выше значение decreaseTime, тем меньше времени на его обновление. Если decreaseTime установлено на 2 секунды, он обновляется каждые 2 секунды.

float decreaseTime = 0.2f; 
float startCounter = 0f; 
public float loss_hp = 1; 

void OnTriggerStay2D(Collider2D other) 
{ 
    //Dont decrease if startCounter < decrease Time 
    if (startCounter < decreaseTime) 
    { 
    startCounter += Time.deltaTime; 
    return; 
    } 
    startCounter = 0; //Reset to 0 

    //Don't decrease if score is less or equals to 0 
    if (hajs.hp <=0) 
    { 
     return; 
    } 

    GameObject gObj = other.gameObject; 
    if (gObj.CompareTag("enemy")) 
    { 

     hajs.hp = hajs.hp - loss_hp; 
    } 
} 
+0

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

+0

Изменено. Перемещенный некоторый код вне compareTag, и у вас нет других проблем. – Programmer

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