Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
18 / 11 / 8
Регистрация: 26.11.2021
Сообщений: 131
Записей в блоге: 1

Как добавлять к переменной число каждую секунду?

11.12.2021, 20:47. Показов 7542. Ответов 19

Студворк — интернет-сервис помощи студентам
Короче, делаю что-то типо кликера и сейчас начал делать бустеры. Сделал первый и когда нажимаю на кнопку к которой привязн этот бустер то у меня Unity просто встаёт и отказывается подчиняться любым приказом. Приходится закрывать через диспетчер задач. У меня слабый комп и может из-за этого или ошибка в коде? Вот полный код для полноты картины:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System;
using System.Threading;
using Timer = System.Timers.Timer;
public class ClickScript : MonoBehaviour
{
    Timer time = new Timer(1000);
 
    // Text:
    public Text Stext;
    public Text ClickText;
    // Переменные:
    static int score = 0;
    static int f;
    static int PClick;
    static int n = 0;
 
    // Code:
 
    // Покупка улучшения 1:
    public void ClickButton()
    {
        if (score >= 10)
        {
            f += 1;
            n += 5;
            score -= 10;
        }
        else
        {
            Debug.Log("No Money");
        }
    }
 
    // Нажатие на основную кнопку
    public void Click()
    {
        score += 1 + n;
        PClick = f * 5 + 1;
        Stext.text = score.ToString();
 
    }
//
//
//
//ВОТ ТУТ ВОЗМОЖНО ОШИБКА
    static int BusterOne = 0;
    public void Buster1()
    {
        BusterOne += 1;
        while (BusterOne > 0)
        {
            score++;
            Thread.Sleep(1000);
 
        }
 
    }
 
 
 
 
    void Update() // Вывод текста на экран
    {
        if (score <= 999)
        {
            Stext.text = score.ToString() + " $";
        }
        if (score >= 1000 && score <= 9999)
        {
            Stext.text = score.ToString("0 000") + " $";
 
        }
        if (score >= 10000 && score <= 99999)
        {
            Stext.text = score.ToString("00 000") + " $";
 
        }
        if (score >= 100000 && score <= 999999)
        {
            Stext.text = score.ToString("000 000") + " $";
 
        }
        if (score >= 1000000 && score <= 9999999)
        {
            Stext.text = score.ToString("0 000 000") + " $";
 
        }
 
 
        PClick = f * 5 + 1;
        ClickText.text = "click(" + PClick.ToString() + ")";
    }
 
}
Добавлено через 5 минут
Код бустера начинается на 49 строке
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.12.2021, 20:47
Ответы с готовыми решениями:

Увеличение переменной каждую секунду
Как реализовать в c++ несколько переменных, которые будут увеличиваться на 1 каждую секунду, при этом будет работать код и эти переменные...

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

Каждую секунду присвоить значение переменной равное элементу массива?
Необходимо переменной a каждую секунду присваивать значение из массива arr (в бесконечном цикле). По сути нужно перебирать массив методом...

19
19 / 12 / 7
Регистрация: 06.12.2019
Сообщений: 181
11.12.2021, 21:29
Не уверен что можно делать условие в while
0
19 / 12 / 7
Регистрация: 06.12.2019
Сообщений: 181
11.12.2021, 21:39
Не уверен что можно делать условие в while
0
18 / 11 / 8
Регистрация: 26.11.2021
Сообщений: 131
Записей в блоге: 1
11.12.2021, 23:15  [ТС]
Евгений15, я тоже не уверен, но мне в голову больше идеи не приходят как можно сделать бустер
0
19 / 12 / 7
Регистрация: 06.12.2019
Сообщений: 181
12.12.2021, 20:01
а через просто if сделать ? или нужно каждую секунду если больше нуля ?
0
46 / 35 / 12
Регистрация: 15.11.2011
Сообщений: 204
12.12.2021, 20:57
Слабый комп - нет, это простейший алгоритм, а вот цикл вайл... Курсовые делали в 98 винде в турбоборланде, так вот с тех времен я стараюсь избегать использование конструкций типа while/while do/do while вообще Использование его сопряжен с риском уводить программу в вечный цикл. Я решал недавно похожую задачу, мне надо было наращивать скорость по нажатию клавиши вперед и сбавлять скорость по нажатию клавиши назад. Только у вас переменная score

У меня просто на клавише метод был, отслеживающий клик, если клавиша UI отжата, плюсует/минусует скорость, чуть сложнее там, потому что при мощности движка >80% наращивания замедляется и куча еще всяких условий:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void Update()
    {
        //меняем огненный след в зависимости от текущей скорости
        var ps = fireEngine.GetComponent<ParticleSystem>();
        var main = ps.main;
        main.startSpeed = GlobalScript.speedVisual * 6;
 
 
        ImageBar.fillAmount = Player.speed / GlobalScript.PlayerMaxSpeed; //отношение скорости текущей к максимальной на спидометре
        //Если клавиша нажата и удерживается нажатой
        if (!KeySpeedUP)
        {
            //эффект замедления набора скорости если она больше 80%
            if (Player.speed < (GlobalScript.PlayerMaxSpeed * 0.8f))
                Player.speed = Player.speed + Time.deltaTime * 0.5f; //пока скорость игрока меньше 80% от максимальной скорости
            else
                Player.speed = Player.speed + Time.deltaTime * 0.2f; //если скорость близка к максимальной, скорость набирается медленее
 
            Ship.SpeedUp = true; //скорость прибавляется, камера отстает от корабля
        }
        else
            Ship.SpeedUp = false; //скорость перестала прибавляться, камера наезжает на корабль
 
 
    }
Т.е. ваше нажатие по клавише может просто менять некую переменную тригер тру-фэлс (нажата-отжата) и уже в методе апдейт переменная скор при условии что кнопка нажата - будет расти.
1
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
12.12.2021, 21:19
Fill Simpson, В вашем коде запускается "вечный цикл" while. Условие завершения цикла while(BusterOne > 0) - Означает ПОКА переменная BusterOne больше 0 выполнять цикл... А так как в коде вы стазу же присваиваете переменной BusterOne += 1 то оно всегда у вас больше 0. По этому всё и зависает. В коде я нигде не увидел условия обнуления переменной BusterOne. По этому всё и зависает наглухо.
На мой взгляд в этому случае лучше использовать корутины.
2
18 / 11 / 8
Регистрация: 26.11.2021
Сообщений: 131
Записей в блоге: 1
12.12.2021, 21:56  [ТС]
Sprutnet Мне кажется у нас всё же разные задачи, void Update обновляется и выполняет свои действия намного чаще одной секунды. У вас всё будет отлично потому что нажатие клавиши будет проверяться чаще одной секунды, а мне нужно чтобы BusterOne прибавлял к score какое-то число каждую секунду. Я изменил код и так делать нельзя(наверное), теперь у меня void Update обновляется раз в 1-2 секунды. Если убрать Thread.Sleep(1000); то число score увеличивается намного чаще чем нужно.
C#
1
2
3
4
5
6
7
8
9
10
void Update() // 
    { if (BusterOne>0)
        {
            score += 1*BusterOne ;
            Thread.Sleep(1000);
        }
 
        Debug.Log("123");
        
    }
Добавлено через 2 минуты
Из-за того что void Update обновляется раз в 1-2 секунды то фпс в игре понижается очень сильно. И почему-то ещё к score прибавляется не 1,а 2 каждый раз
0
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
12.12.2021, 22:33
Лучший ответ Сообщение было отмечено Fill Simpson как решение

Решение

Fill Simpson,
Если нужно добавлять очки по времени, то лучше как-то так.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
        public int score = 0;
        private int BusterOne = 1;
 
        private void Start()
        {
            StartCoroutine(addScore()); //Старт корутины
        }
 
        private void Update()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                BusterOne++;    //При нажатии на пробел - увеличиваем переменную.
            }
            if (Input.GetKeyDown(KeyCode.Escape))
            {
                BusterOne = 0;  //При нажатии на ескейп - обнуляем
            }
        }
        private IEnumerator addScore()  //Описание корутины
        {
            while (true)    //Заключаем в цикл
            {
                yield return new WaitForSeconds(1); //Ждем заданное число секунд.
                if (BusterOne > 0)  //Если переменная больше 0 - то добавляем очки. 
                {
                    score++;
                } 
 
            }
        }
Кода написал для примера так, как не вижу всей картины. Данный код не будет вешать программу, так же он не будет снижать ФПС.
При нажатии на ескейп - начисление очков прекратится. При нажатии на пробел - продолжиться.
1
18 / 11 / 8
Регистрация: 26.11.2021
Сообщений: 131
Записей в блоге: 1
13.12.2021, 22:37  [ТС]
Ronin_v, Ronin_v, я немного переписал код под себя и вроде всё заработало как надо, но появился баг. Вообще у меня магазин где я покупаю бустер и сцена там где отображаются деньги это 2 разные сцены. И когда я нахожусь в магазине то бустер увеличивает score правильно, но когда я перехожу на основную сцену, где отображается score то корутина срабатывает 2 раза подряд. Я искал в чём может быть проблема, но так ничего и не нашёл. Корутина нигде больше не запускается кроме private void Start(). В чём может быть проблема?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
    static int BusterOne = 0;
    // Покупка бустера
    public void Buster1()
    {
        if (BusterOne >= 1 && score >= 1000 * BusterOne * 1.5f)
        {
            
            Debug.Log("2");
            score -= 1000 * BusterOne * 1.5f;
            BusterOne += 1;
        }
        else
        {
            Debug.Log("No money 2");
        }
        if (BusterOne < 1 && score>=1000)
        {
            BusterOne += 1;
            score -= 1000;
            Debug.Log("1");
            
        }
        else
        {
 
            Debug.Log("No money1");
        }
    }
    private void Start()
    {
        StartCoroutine(FirstBuster()); //Старт корутины
    }    
    private IEnumerator FirstBuster()  //Описание корутины
    {
        while (true)    //Заключаем в цикл
        {
            yield return new WaitForSeconds(1); //Ждем заданное число секунд.
            if (BusterOne > 0)  //Если переменная больше 0 - то добавляем очки. 
            {
                score += 1f*BusterOne;
                Debug.Log("IEnumerator");
            }
 
        }
    }
0
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
13.12.2021, 22:48
Fill Simpson, А если перейти со сцены 1 на сцену 2, а потом обратно на сцену 1 и обратно на сцену 2 - корутина запуститься 4 раза?
1
18 / 11 / 8
Регистрация: 26.11.2021
Сообщений: 131
Записей в блоге: 1
13.12.2021, 22:56  [ТС]
Ronin_v, Нет, вот я насобирал 1000 score очков, захожу на сцену с магазином, купил этот бустер и я там чтобы проверить что может быть не так написал в корутине Debug.Log("IEnumerator") и на сцене с магазином она обновляется как надо( в консоли Unity там типо 1,2,3,4...) а когда перехожу на основную сцену то обновляется каждый раз по 2( типо 1,2,3,4,5 потом перешёл на основную сцену и 7,9,11,13,15 если обратно в магазин перехожу то 16,17,18) Надеюсь понятно объяснил, если нет, то могу видео записать
0
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
13.12.2021, 22:58
Fill Simpson,
Цитата Сообщение от Fill Simpson Посмотреть сообщение
могу видео записать
Было бы не плохо.
1
18 / 11 / 8
Регистрация: 26.11.2021
Сообщений: 131
Записей в блоге: 1
13.12.2021, 23:05  [ТС]
Ronin_v,
0
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
13.12.2021, 23:55
Fill Simpson, Попробуйте продебажить старт корутины. Debug.Log в старте возле запуска корутины.
1
18 / 11 / 8
Регистрация: 26.11.2021
Сообщений: 131
Записей в блоге: 1
14.12.2021, 00:14  [ТС]
Ronin_v, так?
C#
1
2
3
4
5
    private void Start()
    {
        StartCoroutine(FirstBuster()); //Старт корутины
        Debug.Log("IEnumerator Start");
    }
0
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
14.12.2021, 00:16
Да. Что показывает? выводится один раз или два?
1
18 / 11 / 8
Регистрация: 26.11.2021
Сообщений: 131
Записей в блоге: 1
14.12.2021, 00:17  [ТС]
как только проект запустил 2 раза сразу
0
 Аватар для Ronin_v
293 / 189 / 111
Регистрация: 22.07.2020
Сообщений: 538
14.12.2021, 00:45
Fill Simpson, Думаю, у Вас в проекте есть дубляж. Возможно где-то продублирован это скрипт два раза. Вот он два раза и запускается. Проверьте внимательно все объекты. Не закинули ли Вы случайно два раза один и тот же скрипт на какой либо объект. Или возможно у Вас во время старта создается объект, на котором висит этот скрипт а он уже существует. По этому и скриптов тоже может быть два.
1
18 / 11 / 8
Регистрация: 26.11.2021
Сообщений: 131
Записей в блоге: 1
14.12.2021, 21:39  [ТС]
Ronin_v, нашёл, спасибо большое, всё работает как часики.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.12.2021, 21:39
Помогаю со студенческими работами здесь

При помощи таймера каждую секунду число a увеличивать, пока оно не станет равным числу b
Здравствуйте, помогите реализовать метод для таймера. С формы считываются 2 целочисленных числа, число а и число b (a&lt;b). Нужно, что...

Как обновлять от <p> до </p> каждую секунду?
Доброе утро всем, есть страничка: &lt;html&gt; &lt;head&gt; &lt;meta name=viewport content='width=device-width, initial-scale=1'&gt; ...

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

Как выполнять операцию каждую секунду?
Мне нужно, что б мое консольное приложение запускалось и за все время работы выполняло бы одну операцию каждую секунду.

Как обновить значение функции каждую секунду?
Есть страничка html на которую выводится значение функции: &lt;script&gt; document.write(func(10)); &lt;/script&gt; Но мне нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru