C # Unity Queue очищает себя - PullRequest
       13

C # Unity Queue очищает себя

1 голос
/ 26 сентября 2019

У меня проблемы с выяснением ошибки.Моя игра инициализирует несколько очередей для хранения игровых подсказок, и в кнопке «Пуск» функция StartDialogue() заполняет каждую из очередей и переходит к DisplayNext().Предполагается, что функция DisplayNext() удаляет первую подсказку из определенных очередей и помещает их в диалоговые окна.После этого игрок выбирает правильную кнопку для ответа и вызывает DisplayNext() для перехода к следующему запросу.

Однако моя проблема заключается в том, что мой счетчик sen_queue устанавливает себя в 0, когда правильная кнопка вызываетDisplayNext().Отладочный выход сначала отображается 4, когда нажата «Старт», но когда нажата правильная кнопка, он отображает 0. При первом нажатии правильной кнопки он переходит к функции EndDialogue().Я приложил свой код ниже.Я понятия не имею, как это исправить, поэтому любая помощь будет принята с благодарностью!Огромное спасибо заранее!Однако моя проблема в том, что мой счетчик sen_queue устанавливает себя в 0, когда правильная кнопка вызывает DisplayNext().Отладочный выход сначала отображается 4, когда нажата «Старт», но когда нажата правильная кнопка, он отображает 0. При первом нажатии правильной кнопки он переходит к функции EndDialogue().Я приложил свой код ниже.Я понятия не имею, как это исправить, поэтому любая помощь будет принята с благодарностью!Большое спасибо заранее!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class QuestionManager : MonoBehaviour
{
    public Text dialogueText;
    public Text topText;
    public Text botText;

    public Queue<string> sen_queue;
    public Queue<string> top_queue;
    public Queue<string> bot_queue;
    public Queue<string> wrong_queue;

    private bool prev_wrong;

    public GameObject finalsaltwater;
    public GameObject water;
    public GameObject sand;
    public GameObject salt;
    public GameObject filtersand;
    public GameObject platewater;


    void Start()
    {
        Screen.SetResolution(1600, 900, true);

        sen_queue = new Queue<string>();
        top_queue = new Queue<string>();
        bot_queue = new Queue<string>();
        wrong_queue = new Queue<string>();
        prev_wrong = false;

        finalsaltwater.SetActive(false);
        filtersand.SetActive(false);
        platewater.SetActive(false);
    }


    public void StartDialogue(Question question, Question topprompt, Question botprompt, Question wrong)
    {
        sen_queue.Clear();
        top_queue.Clear();
        bot_queue.Clear();
        wrong_queue.Clear();

        foreach (string sentence in question.sentences)
        {
            sen_queue.Enqueue(sentence);
        }
        foreach (string sentence in topprompt.sentences)
        {
            top_queue.Enqueue(sentence);
        }
        foreach (string sentence in botprompt.sentences)
        {
            bot_queue.Enqueue(sentence);
        }
        foreach (string sentence in wrong.sentences)
        {
            wrong_queue.Enqueue(sentence);
        }

        DisplayNext();
    }


    IEnumerator ToggleFalse(GameObject thing)
    {
        yield return new WaitForSeconds(1.5f);
        thing.SetActive(false);
    }


    IEnumerator ToggleTrue(GameObject thing)
    {
        yield return new WaitForSeconds(1.5f);
        thing.SetActive(true);
    }


    public void DisplayNext()
    {
        Debug.Log("IN DISPLAY " + sen_queue.Count);

        if (sen_queue.Count == 0)
        {
            EndDialogue();
            return;
        }

        if (top_queue.Count == 2)
        {
            platewater.SetActive(true);
            water.SetActive(false);
            StartCoroutine(ToggleFalse(salt));
        } else if (top_queue.Count == 1)
        {
            filtersand.SetActive(true);
            sand.SetActive(false);
            platewater.SetActive(false);
            StartCoroutine(ToggleTrue(finalsaltwater));
        } else if (top_queue.Count == 0)
        {
            platewater.SetActive(true);
            StartCoroutine(ToggleTrue(salt));
            StartCoroutine(ToggleFalse(platewater));
            finalsaltwater.SetActive(false);
        }

        string sentence = sen_queue.Dequeue();

        if (top_queue.Count != 0)
        {
            string topbutton = top_queue.Dequeue();
            topText.text = topbutton;
        }
        if (bot_queue.Count != 0)
        {
            string botbutton = bot_queue.Dequeue();
            botText.text = botbutton;
        }
        prev_wrong = false;
        dialogueText.text = sentence;
    }


    public void IncorrectDisplay()
    {
        if (wrong_queue.Count == 0)
        {
            return;
        }

        if (prev_wrong == false)
        {
            string wrong_sen = wrong_queue.Dequeue();
            dialogueText.text = wrong_sen;
        }
        prev_wrong = true;
    }


    public void EndDialogue()
    {
        dialogueText.text = "Good job! Refresh the page if you want to restart.";
        return;
    }

}
...