#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. Спасибо, что кортина сработала. Я пробовал что-то подобное ранее и не видел, чтобы это сработало, так что большое спасибо вам обоим за помощь 🙂