c# - 如何调用具有 bool 值 true unity C# 的数组元素

标签 c# arrays unity3d button boolean

我有四个按钮使用相同的预制件并保存数组中的 4 个文本元素,其中只有一个被分配 bool 值为 true。单击任何 false 元素时,我试图访问该 true 元素。我想在单击错误元素时突出显示真实元素。谁能帮我实现这个功能? 使用简单对象池 引用统一问答游戏教程 谢谢

回答按钮脚本

public class AnswerButton : MonoBehaviour                                 
{                           
    public Text answerText;
    private AnswerData answerData;
    private GameController gameController;
    private bool isCorrect;

void Start()
{
    gameController = FindObjectOfType<GameController>();
}

public void Setup(AnswerData data)
{
    answerData = data;
    answerText.text = answerData.answerText;
}


public void HandleClick()
{
    gameController.AnswerButtonClicked(answerData.isCorrect);
    {
        if (answerData.isCorrect)
        {

        }

        if (!answerData.isCorrect)
        {


        }

    }

回答数据脚本

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

[System.Serializable]
public class AnswerData 
{
    public string answerText;
    public bool isCorrect;
}

问题数据脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class QuestionData
{

   public string questionText;
   public AnswerData[] answers;
}

游戏 Controller 脚本

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

public class GameController : MonoBehaviour
 {
   public Text questionText;
   public Text scoreDisplayText;
   public SimpleObjectPool answerButtonObjectPool;
   public Transform answerButtonParent;
   public GameObject questionPanel;
   public GameObject roundOverPanel;
   public GameObject levelsPanel;
   private DataController dataController; 
   private RoundData currentRoundData;

   private bool isRoundActive;
   private float timeBeetweenQuestions = 3.0f;

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

   private QuestionData[] questionPool;
   private int questionIndex;
   private int qNumber = 0;
   private List<int> questionIndexesChosen = new List<int>();
   public int playerScore = 0;
   public int totalQuestions;


   private static int pointAddedForCorrectAnswer;

   public AudioSource answerButtonClicked;
   public AudioSource wrongAnswerClicked;


   void Start ()
   {
            dataController = FindObjectOfType<DataController>();
            currentRoundData = dataController.GetCurrentRoundData();
            questionPool = currentRoundData.questions;

            playerScore = 0;
            questionIndex = 0;
            scoreDisplayText.text = "Score: " + playerScore.ToString();
            isRoundActive = true;
            ShowQuestion();
   }



   private void ShowQuestion()
   {
            RemoveAnswerButtons();

            QuestionData questionData = questionPool[questionIndex];
            questionText.text = questionData.questionText;

            for (int i = 0; i < questionData.answers.Length; i++)
            {


          GameObject answerButtonGameObject = 
          answerButtonObjectPool.GetObject();   

          answerButtonGameObjects.Add(answerButtonGameObject);

          answerButtonGameObject.transform.SetParent(answerButtonParent);

          AnswerButton answerButton = 
         answerButtonGameObject.GetComponent<AnswerButton>();
         AnswerButton.Setup(questionData.answers[i]);

        }
 }

 private void RemoveAnswerButtons()
 {
     while (answerButtonGameObjects.Count > 0)
     {

           answerButtonObjectPool.ReturnObject(answerButtonGameObjects[0]);
           answerButtonGameObjects.RemoveAt(0);
     }
 }

 IEnumerator TransitionToNextQuestion()

 {
        yield return new WaitForSeconds(timeBeetweenQuestions);
        ShowQuestion();
 }

 IEnumerator WaitForFewSeconds()

 {
        yield return new WaitForSeconds(timeBeetweenQuestions);
        EndRound();
 }
    IEnumerator ReturnCorrectButtonColor()
{
    Debug.Log("im correct");
    GetComponent<Button>().image.color = Color.green;
    yield return new WaitForSeconds(seconds: 2.9f);
    GetComponent<Button>().image.color = Color.white;

}

IEnumerator ReturnWrongButtonColor()
{
    Debug.Log("im wrong");
    GetComponent<Button>().image.color = Color.red;
    yield return new WaitForSeconds(seconds: 2.9f);
    GetComponent<Button>().image.color = Color.white;

}

public void AnswerButtonClicked (bool isCorrect)

{
   if (isCorrect)
    {
        playerScore += currentRoundData.pointAddedForCorrectAnswer;
        scoreDisplayText.text = "Score: " + playerScore.ToString();

        //play coorect answer sound
        answerButtonClicked.Play();
        StartCoroutine(ReturnCorrectButtonColor());
    }

    if (!isCorrect)
    {
        //play wrong answer sound 
        answerButtonClicked = wrongAnswerClicked;
        answerButtonClicked.Play();
        StartCoroutine(ReturnWrongButtonColor());
        //     buttons = GameObject.FindGameObjectsWithTag("Answer");

       //    {
      //    foreach (GameObject button in buttons)
     //    {
     //        if (button.GetComponent<AnswerButton>     
     //().answerData.isCorrect)
    //        {
   //            button.GetComponent<AnswerButton> 
   //  ().StartCoroutine(ReturnCorrectButtonColor());
   //        }
  //    }
//}
    }


        if (qNumber < questionPool.Length - 1)   /
        {
              qNumber++;
              StartCoroutine(TransitionToNextQuestion());

        }
        else
        {

              StartCoroutine(WaitForFewSeconds());
        }
}

        public void EndRound()
        {
             isRoundActive = false;
             questionPanel.SetActive(false);
             roundOverPanel.SetActive(true);

        }

       //on  button click return to main menu
       public void ReturnToMenu ()
       {
          SceneManager.LoadScene("MenuScreen");
       }



 }

最佳答案

为了同时突出显示“错误”(单击的按钮)和“正确”按钮,您需要能够访问这两个按钮。这意味着您无法通过应答按钮脚本的 HandleClick 方法进行突出显示,因为它只能访问自身,例如到错误的按钮。

好处是这个方法会通知 GameController 按钮已被点击。 GameController 知道所有的按钮,因此它可以轻松地突出显示两个按钮。

因此,您应该从 GameController 的 AnswerButtonClicked 执行此操作,而不是从 Answer Button 的 HandleClick 启动高亮显示子例程:在此处识别右键和单击的按钮并为它们启动适当的子例程。

更新:

例如,您的 ReturnCorrectButtonColor 看起来像:

IEnumerator ReturnCorrectButtonColor( GameObject button )
{
    Debug.Log("im correct");
    button.GetComponent<Button>().image.color = Color.green;
    yield return new WaitForSeconds(seconds: 2.9f);
    button.GetComponent<Button>().image.color = Color.white;
}

所以在 AnswerButtonClicked 中,您确定要突出显示哪个按钮作为正确答案按钮,并将其作为参数传递给此方法:

StartCoroutine(ReturnCorrectButtonColor(correctButton));

关于c# - 如何调用具有 bool 值 true unity C# 的数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51961276/

相关文章:

c# - 从 C# 代码设置边距

Javascript:查找其他 ID

c# - 如何将 JNI C# 类传递给 Java 或处理这种情况?

c# - 增加和减少光照强度超时

arrays - Ruby:一个数组的 `pop` 和另一个数组的 `push`

c# - 在 Update() 函数中完成后如何停止方法? - C# - Unity3D

javascript - 从服务器端 asp.net 调用 ajax 时引发错误

c# - RuntimeBinderException 因为 Razor 中的空引用

c# - 在 UpdatePanel 之外更改 TextBox 中的文本

数组作为单独的类型