【问题标题】:How to get quiz game questions to show when button is clicked in Unity?如何在 Unity 中单击按钮时显示问答游戏问题?
【发布时间】:2015-04-16 18:17:15
【问题描述】:

我正在尝试制作一个带有四个按钮的问答游戏,问题存储在一个数组中。这些字母应该一次打印出一个,并且在显示前 3 个索引之后,只有当按下屏幕上的按钮时才会显示下一个索引。

到目前为止,我似乎只能显示前 3 个索引,但我不确定如何让按钮触发数组中的下一个问题来显示。

我的代码是:

public GameObject button1;
public GameObject button2;
public GameObject button3;
public GameObject button4;
public float letterPause = 0.05f;
public float sentencePause = 2.0f;
string[] strArray = new string[13];
int i;
int count = 3;
int score;
bool nextQuestion = false;

void Start () {
    strArray[0] = "Hello and welcome!";
    strArray[1] = "This 11 question quiz is going to test your knowledge";
    strArray[2] = "Question 1";
    strArray[3] = "Question 2";
    strArray[4] = "Question 3";
    strArray[5] = "Question 4";
    strArray[6] = "Question 5";
    strArray[7] = "Question 6";
    strArray[8] = "Question 7";
    strArray[9] = "Question 8";
    strArray[10] = "Question 9";
    strArray[11] = "Question 10";
    strArray[12] = "Question 11";
    StartCoroutine (TypeText ());
}

IEnumerator TypeText () {
    for (i = 0; i < count; i++) {
        foreach (char letter in strArray[i].ToCharArray()) {

            gameObject.GetComponent<Text> ().text += letter;
            yield return new WaitForSeconds (letterPause);
        }

        if (i != count - 1) {
        yield return new WaitForSeconds (sentencePause);
        gameObject.GetComponent<Text> ().text = "";
        }
    }
    StartCoroutine (TypeText2 ());
}

IEnumerator TypeText2 () {
    while (nextQuestion == true) {
        for (i = 3; i < strArray.Length; i++) {
            foreach (char letter in strArray[i].ToCharArray()) {

                gameObject.GetComponent<Text> ().text += letter;
                yield return new WaitForSeconds (letterPause);
            }

            gameObject.GetComponent<Text> ().text = "";
        }
    }
}

public void OnClickButton1() {
    button1.GetComponentInChildren<Text> ().text = "";
    button2.GetComponentInChildren<Text> ().text = "";
    button3.GetComponentInChildren<Text> ().text = "";
    button4.GetComponentInChildren<Text> ().text = "";
    nextQuestion = true;

}

public void OnClickButton2() {
    button1.GetComponentInChildren<Text> ().text = "";
    button2.GetComponentInChildren<Text> ().text = "";
    button3.GetComponentInChildren<Text> ().text = "";
    button4.GetComponentInChildren<Text> ().text = "";
    nextQuestion = true;
}

public void OnClickButton3() {
    button1.GetComponentInChildren<Text> ().text = "";
    button2.GetComponentInChildren<Text> ().text = "";
    button3.GetComponentInChildren<Text> ().text = "";
    button4.GetComponentInChildren<Text> ().text = "";
    nextQuestion = true;
}

public void OnClickButton4() {
    button1.GetComponentInChildren<Text> ().text = "";
    button2.GetComponentInChildren<Text> ().text = "";
    button3.GetComponentInChildren<Text> ().text = "";
    button4.GetComponentInChildren<Text> ().text = "";
    nextQuestion = true;
}

【问题讨论】:

  • 您使用什么 GUI 系统来创建按钮?如果是新的 Unity UI 系统,只需在这个单一行为上创建一个公共方法并将其链接到按钮的属性中。
  • 我正在使用新的 Unity UI 系统,但是当您说将其链接到按钮的属性时,我不确定您的意思。

标签: c# arrays unity3d


【解决方案1】:

您的第二个协程不正确。我使用 count 变量作为问题在数组中的位置来询问和迭代使用它。

这是解决方案:

using UnityEngine;
using System.Collections;

public class QuizScript : MonoBehaviour {
    public GameObject button1;
    public GameObject button2;
    public GameObject button3;
    public GameObject button4;
    public float letterPause = 0.05f;
    public float sentencePause = 2.0f;
    string[] strArray = new string[13];
    int i;
    int count = 3;
    int score;
    bool nextQuestion = false;

void Start () {
    strArray[0] = "Hello and welcome!";
    strArray[1] = "This 11 question quiz is going to test your knowledge";
    strArray[2] = "Question 1";
    strArray[3] = "Question 2";
    strArray[4] = "Question 3";
    strArray[5] = "Question 4";
    strArray[6] = "Question 5";
    strArray[7] = "Question 6";
    strArray[8] = "Question 7";
    strArray[9] = "Question 8";
    strArray[10] = "Question 9";
    strArray[11] = "Question 10";
    strArray[12] = "Question 11";
    StartCoroutine (TypeText ());
}

IEnumerator TypeText () {
    for (i = 0; i < count; i++) {
        foreach (char letter in strArray[i].ToCharArray()) {

            gameObject.GetComponent<text> ().text += letter;
            yield return new WaitForSeconds (letterPause);
        }

        if (i != count - 1) {
            yield return new WaitForSeconds (sentencePause);
            gameObject.GetComponent<text> ().text = "";
        }
    }
}

IEnumerator TypeText2 () {
    gameObject.GetComponent<text> ().text = "";
    if(count > strArray.Length - 1) {
        //Winninng or loosing condition 
    } else {            
        //Show the next question
        foreach (char letter in strArray[count - 1].ToCharArray()) {    
            gameObject.GetComponent<text> ().text += letter;
            yield return new WaitForSeconds (letterPause);
        }
    }
}

public void OnClickButton1() {
    button1.GetComponent<text> ().text = "";
    button2.GetComponent<text> ().text = "";
    button3.GetComponent<text> ().text = "";
    button4.GetComponent<text> ().text = "";
    count++;
    StartCoroutine (TypeText2 ());
}

public void OnClickButton2() {
    button1.GetComponent<text> ().text = "";
    button2.GetComponent<text> ().text = "";
    button3.GetComponent<text> ().text = "";
    button4.GetComponent<text> ().text = "";
    count++;
    StartCoroutine (TypeText2 ());
}

public void OnClickButton3() {
    button1.GetComponent<text> ().text = "";
    button2.GetComponent<text> ().text = "";
    button3.GetComponent<text> ().text = "";
    button4.GetComponent<text> ().text = "";
    count++;
    StartCoroutine (TypeText2 ());
}

public void OnClickButton4() {
    button1.GetComponent<text> ().text = "";
    button2.GetComponent<text> ().text = "";
    button3.GetComponent<text> ().text = "";
    button4.GetComponent<text> ().text = "";
    count++;
    StartCoroutine (TypeText2 ());
    }
}

您可以通过创建值来存储您经常使用的组件来进一步优化您的脚本。 喜欢

button1.GetComponent<text> ();

你可以将它存储在变量中

text button1Text = button1.GetComponent<text> ();

并使用它使用

button1Text.text = "";

而不是每次都找到组件。 希望这会有所帮助。

【讨论】:

  • 我将我的第二个协程更改为您的,这导致strArray[2] 重复两次,所以我不得不将第一个协程的条件更改为for (i = 0; i &lt; count - 1; i++),而不是只显示一次。但是,我不确定我是否理解在 if 循环中放置输赢条件的内容,因为我希望下一个问题显示是否单击了任何按钮。
  • 我的错误.. 我应该提到您的主要代码中的其他代码更改。在这段代码中,它不是从第一个协程开始,而是在每次点击答案时被调用。单击会增加问题计数器并开始显示下一个问题。只需使用整个代码而不是使用协程。这应该适用于您的游戏。当你的玩家回答了所有 11 个问题时,if 循环是为了在那里应该做什么;就像游戏结束时带有重试和退出选项的完整得分屏幕一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
相关资源
最近更新 更多