Истощать заданное значение каждую X секунду в методе обновления - PullRequest
0 голосов
/ 09 января 2019

Я бы хотел истощать значение здоровья от заданного значения каждую 1 секунду в методе обновления. Я написал код, но кажется, что он истощается быстрее, чем за 1 секунду.

В методе Update я вызываю:

if (Hunger <= 0.0f)
{
    userHealth -= HealthDepletionValue * Time.deltaTime;
}

Что должно истощить установленное значение HealthDepletionValue каждую секунду Time.deltaTime .

Когда я запускаю игру, она истощает HealthDepletionValue каждые 0,1 секунды или что-то в этом духе. Но, конечно, не каждую 1 секунду, как я хочу.

Я что-то пропустил?

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Другой вариант InvokeRepeating - создать собственный таймер.

float timer = 0;

Update()
{
  if (Hunger <= 0.0f)
  {
    timer += time.deltaTime;
    if (timer > 1f){
        userHealth -= HealthDepletionValue;
        timer = 0; //reset timer
    }
  }
}
0 голосов
/ 09 января 2019

В качестве альтернативы вы можете использовать сопрограмму и WaitForSeconds класс.

public void Start () {
    StartCoroutine(DepleteHealth(TimeSpan.FromSeconds(1), 5));
}

public IEnumerator DepleteHealth (TimeSpan frequency, int loss) {
   var wait = new WaitForSeconds((float)frequency.TotalSeconds());
   while(true) {
        userHealth -= loss;
        yield return wait;
   }
}

Это может быть остановлено и начато довольно легко.

0 голосов
/ 09 января 2019

Как указано в в этом сообщении , Update () запускается один раз за кадр. Поэтому, если ваша игра работает на 30 кадрах в секунду, тогда Update () будет выполняться 30 раз в секунду.

Чтобы указать функцию, которая будет выполняться каждые x секунд, вы можете использовать InvokeRepeating . Для этого поместите логику, которую вы хотите выполнять каждую секунду, в свой собственный метод:

void DepleteHealth()
{
    if (Hunger <= 0.0f)
    {
        userHealth -= HealthDepletionValue * Time.deltaTime;
    }
}

А затем в методе Start() вызовите InvokeRepeating, передав имя вашего метода и количество секунд между выполнением указанного метода:

void Start()
{
    InvokeRepeating("DepleteHealth", 1.0f, 1.0f);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...