2017-03-07 66 views
1

作爲字典使用我開發一個遊戲,用戶玩遊戲前選擇一個類別。根據不同的類別中選擇所需的詞典在這裏加載是這樣做選擇文本文件在Unity

public Text selectedCategory; //contains the text of the selected category 
private Dictionary<String,String> wordList = new Dictionary<String,String>(); //holds the dictionary 
private string[] wordListArray; //the array the contents of the text file is first loaded to 
private TextAsset textAsset; //the text asset to be used 
private string category; // the category selected 

void Awake(){ 
    category = selectedCategory.text; 
    textAsset = Resources.Load ("words", typeof(TextAsset)) as TextAsset; 
    Debug.Log ("Words dictionary is loaded"); 
    wordListArray = textAsset.text.Split (new char[] {'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries); 
    wordList = wordListArray.ToDictionary (s => s); 
    Debug.Log ("File loaded as dictionary"); 
} 

此代碼第一塊完美的作品,但是當我將其更改爲

void Awake(){ 
    category = selectedCategory.text; 
    if (String.Compare(category, "Animals") == 1) { 
     textAsset = Resources.Load ("animals", typeof(TextAsset)) as TextAsset; 
     Debug.Log ("Animals dictionary is loaded"); 
    } else { 
     textAsset = Resources.Load ("words", typeof(TextAsset)) as TextAsset; 
     Debug.Log ("Words dictionary is loaded"); 
    } 
    wordListArray = textAsset.text.Split (new char[] {'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries); 
    wordList = wordListArray.ToDictionary (s => s); 
    Debug.Log ("File loaded as dictionary"); 
} 

我得到的錯誤代碼的代碼

的ArgumentException:具有相同鍵的元素已經存在於詞典中。 System.Collections.Generic.Dictionary 2[System.String,System.String].Add (System.String key, System.String value) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:404) System.Linq.Enumerable.ToDictionary[String,String,String] (IEnumerable 1源,System.Func 2 keySelector, System.Func 2 elementSelector,的IEqualityComparer 1 comparer) System.Linq.Enumerable.ToDictionary[String,String] (IEnumerable 1種源,System.Func 2 keySelector, IEqualityComparer 1比較器) System.Linq.Enumerable.ToDictionary [字符串,字符串](IEnumerable的1 source, System.Func 2的KeySelector) GameController.Awake()(在資產/腳本/ GameController.cs:127)

+2

看起來不像你的代碼來通過你的問題? –

+0

@Abdul謝謝我有同樣的問題,你的問題幫助我找到解決方案 –

+0

@Thematkinson我編輯了它...謝謝 – Abdul

回答

3

AC#字典有一個鍵值結構,這意味着它看起來是這樣的:

Dictionary<string, string> dictionary例如:

(Key => Value) 

"greeting" => "Hello" 
"animal" => "Dog" 

當獲得一個值時,你給字典字符串Key,它返回值。

Debug.Log(dictionary["greeting"]) --> "Hello" 

所以,當你在你的文本文件,嘗試添加多個鍵相同的值,例如:

"greeting" => "Hello" 
"animal" => "Dog" 
"greeting" => "Hey" 

,你會得到一個例外,因爲你打破怎麼詞典作品(一個唯一的關鍵值)。如果你沒有得到異常,你會嘗試訪問鍵值「問候」,你會得到哪個值?

Debug.Log(dictionary["greeting"]) --> ??? 

這就是爲什麼你在編譯時得到一個異常。

你需要確保每一個密鑰都是唯一的。在你的文本文件中,你有同一個單詞的多個實例。我沒有看到使用字典,也許你被困在單詞「Dictionary」的語義以及你想使用它的地方。我認爲列表就是你之後的(?),意思是沒有鍵,只有值。

因爲我不知道你想達到什麼目的,就很難推薦一個解決方案,但你可以閱讀更多的字典here。並且here是您如何從數組中填充它的一個答案,如果您實際上需要它作爲字典。


更新:

我用一本字典,因爲我希望能夠以檢查文本文件包含一個字

好!我認爲字典不是你想要的;這是你之後的列表。添加的所有單詞的列表:

wordList = wordListArray.ToList(); 

和檢查,如果列表中包含要檢字(可以在陣列上要做的事)

if (wordList.contains(YourString)) { 
    Debug.Log(YourString + " exist in wordList!"); 
} 

UPDATE2:

我得到字典的結構,但從我的代碼我將文本文件的內容加載到字典中,並在此之前根據類別ry選擇一個特定的文本文件加載...說我有名字動物,國家,名稱的文本文件。如果該人選擇名稱文本文件加載名稱

給我的印象是你有另一個問題,即如何選擇加載哪個文件。對於這個,你需要一些東西來改變,我會假設你有,我們稱之爲playerChoice。這裏是你如何能做到這一點:

TextAsset textAsset; 
switch (playerChoice) { 
    case "PlayerOption1": 
     textAsset = Resources.Load<TextAsset>("words1", typeof(TextAsset)); 
    break; 
    case "PlayerOption2": 
     textAsset = Resources.Load<TextAsset>("words2", typeof(TextAsset)); 
    break; 
} 

// and then the rest of your textAsset, 
// handling code (splitting on linebreaks and .ToList()) 

因爲我不知道什麼時候要加載不同的文件,這是因爲低抽象我可以做。

+0

我用了一本字典,因爲我想能夠檢查文本文件是否包含一個字 – Abdul

+1

@Fredrik。 +1 –

+0

@Abdul好的!我更新了答案,查看底部!比格爾沃思先生,謝謝! =) – Maakep

1

這裏的邏輯似乎有點混亂。您似乎試圖決定使用textAsset變量加載哪個文本文檔,但您似乎從文件加載所有文本,然後將其粘貼到字典中。

如果你有不同的文本文件與獨特的內容,那麼只是有一個枚舉的列表,讓玩家選擇一個。然後根據他們的決定加載不同的文本文件。

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 

然後在你的代碼有類似:

var currentChoice; //Value set elsewhere in code (through UI) 
textAsset = Resources.Load (currentChoice.ToString(), typeof(TextAsset)) as TextAsset; 

然後你根據自己的選擇權資產。

+1

是的,這比我的建議更清潔。 +1右回亞朋友 – Maakep

+0

感謝哥們,很久以後Stack Overflow愛情巨星會繼續。 –

1

結合以@Fredrik這裏給出的答案是完整的工作代碼

public Text selectedCategory; //contains the text of the selected category 
private List<String> wordList; //holds the dictionary 
private string[] wordListArray; //the array the contents of the text file is first loaded to 
private TextAsset textAsset; //the text asset to be used 
private string category; // the category selected 

//new function to load the dictionary 
void LoadDictionary(string category){ 
    switch (category) { 
    case "Animals": 
     textAsset = Resources.Load ("animals", typeof(TextAsset)) as TextAsset; 
     Debug.Log ("Animals dictionary is loaded"); 
     break; 
    default: 
     textAsset = Resources.Load ("words", typeof(TextAsset)) as TextAsset; 
     Debug.Log ("Words dictionary is loaded"); 
     break; 
    } 
    wordListArray = textAsset.text.Split (new char[] {'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries); 
    wordList = wordListArray.ToList(); 
    Debug.Log ("File is loaded"); 
} 

調用此功能在啓動功能如下

void Start() { 
    selectedCategory.text = PlayerPrefs.GetString("categorySelected"); 
    category = selectedCategory.text; 
    LoadDictionary (category); 
}