Задать вопрос
@KiR_Ka
Кароч я шкальник. Но к делам подхожу серьёзно.

Как сделать чтобы число каждую секунду убавлялось в C# под unity?

Я делаю скрипт сытости персонажа и мне нужно чтобы через какое-то время убавлялось число на один а в конце, когда число ровно 0, выполнялись какие-то действия. Кому не жалко времени подскажите пожалуйста как это сделать.
  • Вопрос задан
  • 11558 просмотров
Подписаться Оценить Комментировать
Решения вопроса 2
GavriKos
@GavriKos Куратор тега Unity
1) Почитать книгу по C#, что то для начинающих
2) Понять что такое Update, TIme.deltaTime любым доступным способом, например по туториалам юнити
3) Расписать алгоритм того что вам нужно с оглядкой на п.2
4) Реализовать алгоритм.

Вопрос мало того что примитивен, так еще и является заданием. Если вы не можете реализовать такое - то вам крайне рано в геймдев
Ответ написан
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Вариант первый: внутри Update уменьшаете число с определённой скоростью и постоянно проверяете перешагнуло ли значение порог.
using UnityEngine;

public class Test : MonoBehaviour
{
    public float value = 100;
    public float speed = 5;

    private void Update()
    {
        value -= Time.deltaTime*speed;
        if (value < 0)
        {
            Debug.Log("Zero");
        }
    }
}

Такой вариант удобен, если не нужна точность, интервал времени небольшой, а после достижения значения скрипт уничтожается либо перезапускается. Время достижения цели вычисляется делением value на speed, либо наоборот из времени можно вычислять скорость. На плохом FPS значение будет плавать, синхронизировать несколько таймеров будет проблемно.

Второй вариант: вычислять время, когда переменная должна принять определённое значение, текущее значение вычислять когда надо.
using UnityEngine;

public class Test : MonoBehaviour
{
    public float maxValue = 100;
    public float interval = 20;
    public float currentValue;

    private float zeroTime;

    private void Awake()
    {
        zeroTime = Time.time + interval;
    }

    private void Update()
    {
        if (Time.time >= zeroTime)
        {
            Debug.Log("Zero");
        }
        else
        {
            float currentNormalizedTime = 1 - (zeroTime - Time.time)/interval;
            currentValue = Mathf.Lerp(maxValue, 0, currentNormalizedTime);
        }
    }
}

Точность в таком случае будет лучше. Если хочется, то можно запоминать только время старта изменения переменной, либо и то и другое. Опираясь на время проще сделать нелинейное изменение значения, вместо лерпа можно подставить любую функцию.

Третий вариант такой же как и второй, только вместо Time.time нужно использовать DateTime.Now. DateTime не завязан на сессию приложения, его можно сериализовать и сохранять локально либо на сервере. Например, вы делаете тамагочи и хотите, чтобы питомец подыхал, если за ним долго не ухаживать. С помощью сохранённого времени вы можете уменьшать здоровье в реальном времени и ретроспективно при запуске приложения.

Если хочется совсем харкора, то можно пользоваться не Update, а отдельным тредом, в котором будет жить ваш таймер, но такое бывает нужно лишь в исключительных случаях.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Defren
Ленивец, спидранер, 3d любитель.
Да чего тут непонятного, делишь Time.deltaTime на Time.deltaTime получаешь время.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы