-Unity- предоставление подсказок обратной связи по порядку независимо от того, какая неправильная кнопка была нажата
Я исследователь в области образования, занимаюсь разработкой игры для своей докторской программы. Я учусь на ходу с учебниками и форумами.
У меня есть эта сцена с панелями викторины (т.е. 4 кнопки - 1 правильный ответ и 3 неправильных)
Я хотел бы знать, как обеспечить подсказки обратной связи по порядку независимо от того, какая неправильная кнопка была нажата.
Вот некоторые фотографии панели и код, который у меня есть на данный момент.
Панель вопросов Изображение с элементами холста
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 ответа
Чтобы ответить на ваш дополнительный запрос, создайте объект родительского контейнера и поместите все ваши контейнеры в этот родительский объект, а затем выполните цикл таким образом.
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);
}
}
}
}
В качестве дополнительной заметки
Вы должны создать отдельную функцию для инициализации списка, чтобы вы не переполняли свою функцию запуска, а также не разбивали то, что внутри обновления, на функции, чтобы вы сохранили свой код в чистоте и модульности. Не забудьте потратить некоторое время на оптимизацию и помнить о методах оптимизации и модульного проектирования. У меня было много проектов, потерпевших крах в мои первые годы, когда я проектировал свои системы быстро, а не "правильно":)
Давайте посмотрим на это в псевдокоде
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
Вам понадобится несколько вещей с учетом этого псевдокода:
Счетчик для отслеживания количества неверных ответов
public int numberOfWrongAnswers = 0;
Массив (или список) подсказок для предоставления
public string[] hints;
Массив, содержащий ссылки на ваши кнопки
public GameObject[] answerButtons;
Общий метод, чтобы определить, какая кнопка была нажата
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 для следующей и т. Д.