我最初设法创建一个东西,其中将有一个问题(在数组中)和答案(在一个数组中),并将文本值随机分配给每个值,其中一个是正确的。考虑到这种性质,特别是规模,我意识到字典会更有效。因此,我尝试操纵我的代码并将其与字典合并。但是,这样做似乎似乎代码无效,特别是因为“数组索引超出范围”(我使用int数组来查找键),因此未引用键,因此没有数据出来。我想知道是否有人可以帮助我解决这个问题。
为此,我制作了1个问题脚本和1本字典。我的想法是,我将从字典中返回一个值,然后将其插入问题文本中。
(有问题的字典是一个问题...另一个是关于按钮的问题,但是我想在获得问题的答案后,如果按钮不相同,按钮应该相当相似)
public class buttonDictionary : MonoBehaviour
{
public Dictionary<int, string> buttonA = new Dictionary<int, string>();
public Dictionary<int, string> questions = new Dictionary<int, string>();
public static int correctinput;
public static int index;
public static int key;
public static string answer1;
public int[] keys;
public static string answer;
public int wrongIndex;
private string wrongAnswer;
public static buttonDictionary arrays;
public static string question;
public static int correctButton;
// Use this for initialization
void Start()
{
// Adds all of the answers to this scene into the dictionary
buttonA.Add(0, "I");
buttonA.Add(1, "Like");
buttonA.Add(2, "Dogs");
buttonA.Add(3, "If");
buttonA.Add(4, "They");
buttonA.Add(5, "Like");
buttonA.Add(6, "Me");
buttonA.Add(7, "You");
buttonA.Add(8, "QDW");
buttonA.Add(9, "QDWQ");
// Adds all of the questions to the dictionary
questions.Add(0, "d");
questions.Add(1, "f");
questions.Add(2, "f");
questions.Add(3, "g");
questions.Add(4, "ff");
questions.Add(5, "gg");
questions.Add(6, "ff");
questions.Add(7, "gg");
questions.Add(8, "hh");
questions.Add(9, "ff");
// Update is called once per frame
}
void Awake()
{
arrays = this;
// Copies all keys in the dictionary into an array and generates a random number, then generates a key
int[] keys = new int[buttonA.Count];
buttonA.Keys.CopyTo(keys, 0);
int index = Random.Range(0, keys.Length);
GetAnswer1();
GetQuestion1();
}
void Update()
{
if (Input.GetKey("escape"))
Application.Quit();
}
// gets an index that refers to the key
public int He()
{
int index = Random.Range(0, keys.Length);
return index;
}
// Gets the question
public string GetQuestion1()
{
var key = keys[index];
question = questions[key];
return question;
}
public class Question : MonoBehaviour
{
// Use this for initialization
void Start()
{
SetText();
}
// Update is called once per frame
void Update()
{
}
void SetText()
{
GameObject textBox = gameObject;
textBox.GetComponent<Text>().text = buttonDictionary.question;
}
}
答案 0 :(得分:1)
每次在方法的内部范围内重新声明一个变量,如下所示:
public static int index;
// (...)
public int He()
{
int index = Random.Range(0, keys.Length);
return index;
}
您正在制作一个局部变量,该局部变量遮蔽了您在类主体中声明的字段,它们只是一个不同的对象。您将随机整数存储在名为index
的变量中,该变量在退出方法He()
时将不存在。 (除了方法返回的内容外,但我看不到您在代码中的任何地方都使用了此返回值)。
然后,当您稍后尝试访问它时,采用另一种方法,如下所示:
public string GetQuestion1()
{
var key = keys[index];
// (...)
}
index
还是body类中声明的字段,该字段从未被触摸过,其默认值始终为0。如果要在其中更新index
的值, He
方法以供进一步参考,您只需引用它,而无需声明类型:
public int He()
{
index = Random.Range(0, keys.Length);
return index;
}
此外,您将所有这些字段都声明为static
,但我不明白为什么您会希望按钮的所有实例共享相同的正确键,字符串和索引...我不是真的了解您解决方案的整体逻辑,但是我觉得这些字段不应该是静态的。