gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:50:35 32 4
gpt4 key购买 nike

我有四个按钮使用相同的预制件并保存数组中的 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com