2016-09-02 2 views
0

Игра, в которой я участвую, имеет характер и врага. Когда персонаж получает удар, он закрывает здоровье. Если персонаж может избежать попадания в течение 10 секунд, он восстанавливает 5 очков здоровья. Если пройдет еще 10 секунд, и он все равно не получает удар, он получает еще 5 очков, и это продолжается, пока персонаж не достигнет полного здоровья. Если персонаж получает хиты до завершения 10 секунд, он теряет здоровье, и время начинается.UnityScript: обновление функции работоспособности

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

public Slider healthBar; 
public float HitResetTimer; //Resetsthetimerto0whenihavebeenhitwithinthe10seconds; 
bool beenHit; //Return true or false if ihave been hit 
float hitTimer; //keeps track of time from 0 to 10 if i have not been hit 

void Awake() 
{ 
    beenHit=false; //player has not been hit so= false 
    hitTimer=0.0f; //Set to 0 because i have not been hit yet so no time needs to be registered 
} 

void OnTriggerEnter(Collider other) 
{ 
    healthBar.value-=10;//If enemy hits character loses 10 points 
    beenHit= true; //Is set to true because i have been hit 
    hitTimer= HitResetTimer;//If cube hits something hitTimer is no longer time that has occured but reset to 0 

} 

void RestoreHealth() 
{ 
    if(!beenHit&& healthBar.value<100) 
     healthBar.value+=2; 
} 

//Usethisfor initialization 
void Start() { 

} 

//Updateiscalledonceper frame 
void Update() { 

    if(beenHit) 
    { 
     hitTimer -=Time.deltaTime; 

     if(hitTimer<0) 
     { 
      beenHit = false; 
      RestoreHealth(); 
     } 
    } 

} 
+0

'healthBar.value- = 100; // Если противник попадает персонаж теряет 10 points' Вы комментировал теряет 10 HP, но вычесть 100. –

+0

OPPS извините моя ошибка – NBera

+0

восстанавливает 5 очков здоровья:' healthBar.value + = 2' :) –

ответ

0

В вашем методе Update:

if(hitTimer<0) 
{ 
    beenHit = false; 
    RestoreHealth(); 
} 

RestoreHealth(); Возьмите из всех if с.

void Update() { 

    if(beenHit) 
    { 
     hitTimer -=Time.deltaTime; 

     if(hitTimer<0) 
     { 
      beenHit = false; 
     } 
    } 
RestoreHealth(); 
} 

Дело в том, вы проверяете beenHit для того, чтобы уменьшить hitTimer. После hitTimer < 0 вы установили beenHit = false и сделали RestoreHealth();. После этого у вас есть beenHit = false и метод Update, имеющий все внутри if(beenHit), который всегда получает статус false. Таким образом, ваш код никогда не достигает RestoreHealth();, пока вы не установите beenHit = true в OnTriggerEnter(), который, в свою очередь, сбрасывает таймер, и вы ждете снова 10 секунд.


Что касается проверки разницы во времени между текущим временем и временем, которое получил последний удар персонажа.

float lastHit; // Holds last time character got hit 

void Awake() 
{ 
    lastHit = Time.time; 
} 

void OnTriggerEnter(Collider other) 
{ 
    healthBar.value -= 100;//If enemy hits character loses 10 points 
    lastHit = Time.time; 
} 

void RestoreHealth() 
{ 
    if(healthBar.value<100) 
     healthBar.value+=2; 
} 

//Updateiscalledonceper frame 
void Update() { 

    if (Time.time - lastHit > 10) // 10 seconds 
    { 
     RestoreHealth(); 
    } 
} 

Примечание: Вы должны изменить RestoreHealth() метод, чтобы дать здоровье с определенной задержкой (скажем, 1 секунду), не на каждом кадре. Так как Update будет вызывать его каждый кадр после соответствия вашим условиям.

+0

cool я сделал это полностью, и теперь он работает Спасибо – NBera