使用键以便从字典中随机获取值C#unity

时间:2018-09-04 14:40:53

标签: c# dictionary unity3d

我最初设法创建一个东西,其中将有一个问题(在数组中)和答案(在一个数组中),并将文本值随机分配给每个值,其中一个是正确的。考虑到这种性质,特别是规模,我意识到字典会更有效。因此,我尝试操纵我的代码并将其与字典合并。但是,这样做似乎似乎代码无效,特别是因为“数组索引超出范围”(我使用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;
}
}

1 个答案:

答案 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,但我不明白为什么您会希望按钮的所有实例共享相同的正确键,字符串和索引...我不是真的了解您解决方案的整体逻辑,但是我觉得这些字段不应该是静态的。