Редактор Unity зависает при запуске определенной функции

#c# #unity3d

#c# #unity3d

Вопрос:

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

Класс, вызывающий функцию восстановления.

 Cooldown cooldown;
    
cooldown = gameObject.GetComponentInChildren<Cooldown>();//Sets cooldown to have the same values as the prefab.
    
    public void gatherCooldown()
    {
        cooldown.resourceCooldown();
    }
 

Класс перезарядки

 public class Cooldown : MonoBehaviour
{
    public Image imageCooldown;
    public float cooldown = 5;
    public bool isCooldown

    public void resourceCooldown()
    {
        while (imageCooldown.fillAmount >= 0)
        {
            imageCooldown.fillAmount -= 1 / cooldown * Time.deltaTime;
        }

    }
}
 

Комментарии:

1. Я далек от эксперта по Unity, но разве у вас не должно быть некоторой задержки в цикле while? Потому что, если значение deltatime достаточно близко к 0, разве это не означает, что у вас почти бесконечный цикл?

2. Что именно вы пытаетесь сделать? Запуск такого метода блокировки почти никогда не является хорошей идеей, поскольку он должен останавливать выполнение всего остального. Я подозреваю, что вместо этого ваш метод должен быть сопрограммой

3. я просто хочу, чтобы проигрыватель оставался в том же положении, пока количество изображений не будет равно 0, а затем уничтожит этот объект. Я пытался использовать сопрограмму, но я новичок и немного запутался в них

4. даже не читал код, но freeze = бесконечный цикл. Вы должны быть осторожны с использованием whiles и следить за тем, чтобы код продолжался

Ответ №1:

В настоящее время вы используете метод блокировки. Чтобы исправить это, вы могли Corountine бы вместо этого использовать a для уменьшения размера ваших изображений fillAmount .

Пример сопрограммы:

 private IEnumerator DecreaseFillAmount() {
    // Entered the Coroutine
    isCooldown = true;
    // Repeat until the fillAmount is smaller than or equal to 0
    while (imageCooldown.fillAmount > 0) {
        imageCooldown.fillAmount -= (1 / cooldown) * Time.deltaTime;
        yield return null;
    }
    // Left the Coroutine
    isCooldown = false;
}
 

Вам также необходимо убедиться, что вы правильно вызываете свой сопрограмму, с помощью которой вы достигаете этого StartCoroutine() .

Вызов сопрограммы:

 public void resourceCooldown() {
    // Call the DecreaseFillAmount Coroutine.
    StartCoroutine(DecreaseFillAmount());
}
 

Ответ №2:

Вы while замораживаете основной поток.

Вероятно, это должно быть скорее сопрограммой

 public class Cooldown : MonoBehaviour
{
    public Image imageCooldown;
    public float cooldown = 5;
    public bool isCooldown;

    private IEnumerator CooldownRoutine()
    {
        isCooldown = true;

        while (imageCooldown.fillAmount >= 0)
        {
            imageCooldown.fillAmount -= 1 / cooldown * Time.deltaTime;

            // Tells Unity to "pause" this routine, render this frame
            // And continue from here in the next frame
            yield return null;
        }

        isCooldown = false;
    }

    public void resourceCooldown()
    {
        StartCoroutin(CooldownRoutine ());
    }
}
 

Комментарии:

1. Спасибо, что кортина сработала. Я пробовал что-то подобное ранее и не видел, чтобы это сработало, так что большое спасибо вам обоим за помощь 🙂