-Unity- предоставление подсказок обратной связи по порядку независимо от того, какая неправильная кнопка была нажата - PullRequest
0 голосов
/ 07 февраля 2019

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

У меня есть эта сцена с панелями викторины (т.е. 4 кнопки - 1 правильный ответ и 3 неправильных)

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

Это некоторые изображения панели и код, который у меня есть на данный момент.

Панель вопросов Изображение с холстомelements

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


 public class PPLQuizManager : MonoBehaviour
 {

 public GameObject HNSCanvas;

 [Header("PPL Left Panel")]
 public GameObject PPLLeftPanel;
 public RectTransform PPLParentLeftPanel;

 public GameObject PPLTextBox;
 public GameObject PPLContinue;
 public GameObject PPLReturn;

 //Pictures that illustrate the tutor's reaction     

 public List<Sprite> questionimages;

 public List<Sprite> HintImages;

 public List<Sprite> CorrectImages;

 public GameObject PPLStringImages;


 [Header("PPL Right Panel")]
 public GameObject PPLRightPanel;

 public GameObject PPLChoice1;
 public GameObject PPLChoice2;
 public GameObject PPLChoice3;
 public GameObject PPLChoice4;
 public int PPLChoiceMade;

 [Header("PPL Bottom Panel")]
 public GameObject PPLBottomPanel;

 public GameObject PPLHint1TextBox;
 public GameObject PPLHint2TextBox;
 public GameObject PPLHint3TextBox;
 public GameObject PPLWinTextBox;
 public GameObject PPLHintPic;
 public GameObject PPLBadge;
 public GameObject PPLMedalPic;

 [Header("PPL Center Panel")]
 public GameObject PPLCenterPanel;

 public GameObject PPLHintPic1;
 public GameObject PPLHintPic2;
 public GameObject PPLHintPic3;
 public GameObject PPLWinPic;


 public void PPLChoiceOption1()
 {

     PPLChoice1.GetComponent<Button>().interactable = false;
     PPLTextBox.GetComponent<Text>().text = "Read the hint. Try again.";
     showRandomHintImage();
     PPLChoiceMade = 1;

 }

 public void PPLChoiceOption2()
 {
     PPLChoice2.GetComponent<Button>().interactable = false;
     PPLTextBox.GetComponent<Text>().text = "Congratulations!";
     showRandomCorrectImage();
     PPLChoiceMade = 2;

 }

 public void PPLChoiceOption3()
 {
     PPLChoice3.GetComponent<Button>().interactable = false;
     PPLTextBox.GetComponent<Text>().text = "Here's a hint!";
     showRandomHintImage();
     PPLChoiceMade = 3;

 }

 public void PPLChoiceOption4()
 {
     PPLChoice4.GetComponent<Button>().interactable = false;
     PPLTextBox.GetComponent<Text>().text = "Hint time. Go for it!";
     showRandomHintImage();
     PPLChoiceMade = 4;

 }

     public void showRandomQuestionImage()
     {
             int count = questionimages.Count;
             int index = Random.Range(0, count);
             Image image1 = PPLStringImages.GetComponent<Image>();
             image1.sprite = questionimages[index];
     }

     public void showRandomCorrectImage()
     {
         int count = CorrectImages.Count;
         int index = Random.Range(0, count);
         Image image2 = PPLStringImages.GetComponent<Image>();
         image2.sprite = CorrectImages[index];
     }

     public void showRandomHintImage()
     {
         int count = HintImages.Count;
         int index = Random.Range(0, count);
         Image image3 = PPLStringImages.GetComponent<Image>();
         image3.sprite = HintImages[index];
     }

 private void Start()
 {
         showRandomQuestionImage();

 }     

 // Update is called once per frame
 void Update()
 {
    //check the rest of this post 
 }
 }

То, что я сделал для того, чтобы оно работало, - это присвоение каждой подсказки определенной кнопке неправильного ответа.Но этот метод не будет интересен для моего исследования, особенно потому, что 3-я подсказка - это практически бесплатная раздача ответов.Таким образом, если студент нажимает на неправильный ответ, который я вручную назначил для 3-й подсказки, он получит ответ на серебряном блюде, и мои данные будут дерьмовыми.= (

Просто для запоминания: Мне нужно отображать подсказки 1, 2 и 3 по порядку, независимо от того, какую неправильную кнопку нажимают учащиеся.


ДОПОЛНИТЕЛЬНОЗАПРОС =): Есть ли способ управлять этими игровыми объектами более экономичным и эффективным способом?

// Update is called once per frame
 void Update()
 {     
         //PPL buttons and answer management
         if (PPLChoiceMade == 1)
         {

             PPLCenterPanel.SetActive(true);
             PPLHintPic1.SetActive(true);
             PPLHintPic2.SetActive(false);
             PPLHintPic3.SetActive(false);

             PPLHint1TextBox.SetActive(true);
             PPLHint2TextBox.SetActive(false);
             PPLHint3TextBox.SetActive(false);

         }

         if (PPLChoiceMade == 2)
         {          

             PPLCenterPanel.SetActive(true);
             PPLHintPic1.SetActive(false);
             PPLHintPic2.SetActive(false);
             PPLHintPic3.SetActive(false);
             PPLWinPic.SetActive(true);

             PPLChoice1.SetActive(false);
             PPLChoice2.SetActive(true);
             PPLChoice3.SetActive(false);
             PPLChoice4.SetActive(false);

             PPLContinue.SetActive(true);
             PPLReturn.SetActive(false);

             PPLWinTextBox.SetActive(true);
             PPLHint1TextBox.SetActive(false);
             PPLHint2TextBox.SetActive(false);
             PPLHint3TextBox.SetActive(false);


             PPLBadge.SetActive(true);
             PPLMedalPic.SetActive(true);

         }

         if (PPLChoiceMade == 3)
         {            

             PPLCenterPanel.SetActive(true);
             PPLHintPic1.SetActive(false);
             PPLHintPic2.SetActive(true);
             PPLHintPic3.SetActive(false);

             PPLHint1TextBox.SetActive(false);
             PPLHint2TextBox.SetActive(true);
             PPLHint3TextBox.SetActive(false);

         }

         if (PPLChoiceMade == 4)
         {            

             PPLCenterPanel.SetActive(true);
             PPLHintPic1.SetActive(false);
             PPLHintPic2.SetActive(false);
             PPLHintPic3.SetActive(true);

             PPLHint1TextBox.SetActive(false);
             PPLHint2TextBox.SetActive(false);
             PPLHint3TextBox.SetActive(true);

         }

Любая помощь будет высоко оценена !! (особенно потому, что я уже сжег тонны нейронов, пытаясь выяснить это сам ... Lol!)

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Давайте посмотрим на это в псевдокоде

if student clicks wrong
    Increment the number of times they have given wrong answers by 1
    What number of incorrect answers have they given?
        if 1 then display hint 1
        if 2 then display hint 2
        if 3 then display hint 3
    Allow them to answer again

Вам понадобится несколько вещей с учетом этого псевдокода:

  1. Счетчик для отслеживанияколичество неверных ответов

    public int numberOfWrongAnswers = 0;

  2. Массив (или список) подсказок для получения

    public string[] hints;

  3. Массив, содержащий ссылки на ваши кнопки

    public GameObject[] answerButtons;

  4. Общий метод для определения, какая кнопка была нажата

    public void PPLChoiceOption(int selection)

Исходя из этого, я бы сделал ваш метод подобным этому

public void PPLChoiceOption(int selection)
{
    buttons[selection].GetComponent<Button>().interactable = false;
    PPLTextBox.GetComponent<Text>().text = hints[numberOfWrongAnswers - 1];
    showRandomHintImage();
    PPLChoiceMade = selection;
}

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

0 голосов
/ 08 февраля 2019

Чтобы ответить на ваш дополнительный запрос, создайте объект родительского контейнера и поместите все ваши контейнеры в этот родительский объект, а затем выполните цикл таким образом

public GameObject hintBoxContainer;

private List<GameObject> hintBoxes = new List<GameObject>();

private void Start(){
  for(int i =0; i < hintBoxContainer.transform.childCount; i++){
    hintBoxes.Add(hintBoxContainer.transform.getChild(i).gameObject);
  }
}

private void Update(){
  if(PPLChoiceMade == 1){
    //Since we know the first hintbox is at the index of 0
    for(int i =0; i < hintBoxes.Count; i++){
      if(i == 0){
        hintBox[i].SetActive(true);
      }else{
        hintBox[i].SetActive(false);
      }
    }
  }
}

В качестве дополнительной заметки

Вам следуетсоздайте отдельную функцию для инициализации списка, чтобы вы не переполняли начальную функцию, а также не разбивайте то, что находится внутри обновления, на функции, чтобы ваш код оставался чистым и модульным.Не забудьте потратить некоторое время на оптимизацию и помнить о методах оптимизации и модульного проектирования. У меня было много проектов, потерпевших крах в мои первые годы, когда я проектировал свои системы быстрее, чем «правильно»:)

...