@ArhoneR

Как правильно реализовать Coroutine и метод OnMouseDown, чтобы увеличить кол-во очков за нажатие на объекты в течение определенного времени?

У меня есть игра типа Fruit Ninja, сделанная в Unity. Фрукты появляются в сцене, когда вы нажимаете на них, они уничтожаются, и вы получаете 1 очко за каждый фрукт, которое отображается на панели очков. Я хочу реализовать механику увеличения очков, например, такую: Когда вы нажимаете на объект с тегом "scoreBoost", в течение следующих 5 секунд каждое нажатие на любой фрукт будет давать вам дополнительно 1 очко.

У меня есть несколько основных скриптов: gameManager и target. В скрипте gameManager есть метод UpdateScore, который показывает текущий счет на панели очков. Я перепробовал множество вариантов с корутинами и циклами, в итоге остановился на этом. Вот метод OnMouseDown для целевого srcipt:
private void OnMouseDown()
   {
        if (gameManager.isGameActive)
        {
            if (gameObject.CompareTag("scoreBoost"))
            {
                StartCoroutine(ApplyScoreBonus());
            }
            while (scoreBonus == true)
            {
                Destroy(gameObject);
                Instantiate(exposionParticle, transform.position, Quaternion.identity);
                gameManager.UpdateScore(pointValue + 1);
            }
       
            Destroy(gameObject);
            Instantiate(exposionParticle, transform.position, Quaternion.identity);
            gameManager.UpdateScore(pointValue);
        }
   }

Код корутины ApplyScoreBoost:
IEnumerator ApplyScoreBonus()
    {
        scoreBonus = true;
    
        yield return new WaitForSeconds(5);

        scoreBonus = false;

    }

Когда я нажимаю на объект с тегом "scoreBoost", игра просто замирает.
  • Вопрос задан
  • 53 просмотра
Пригласить эксперта
Ответы на вопрос 2
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Согласно туториалу, таймеры лучше делать через отдельные объекты, а не методы-корутины.
Ответ написан
Комментировать
freeExec
@freeExec
Участник OpenStreetMap
Зависло, потому что юнити работает в одном потоке и вы его зациклили в while (scoreBonus == true). А корутина начнёт работать только когда ваш вызов метода OnMouseDown завершиться. Соответственно проверки надо делать в Update
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы