iOS上的Unity游戏字典

时间:2015-05-14 18:28:07

标签: c# unity3d unityscript

我有一个成就模块,用于保存和加载字典,其中包含成就(密钥)的名称以及是否已完成(bool值)。我正在使用GDE(游戏数据编辑器)插件(this one)

我的模块在Unity编辑器中正常工作,保存并加载所有内容。但在iOS中,它会因超出范围异常而崩溃。我的保存和加载方法:

    public void Load(){

    GDEAchievementsData achievements;

    if (!GDEDataManager.DataDictionary.TryGetCustom(GDEItemKeys.Achievements_Achievements, out achievements)){
        Debug.LogError("Error reading save data!");
    }

    LoadAchievementsInDictionary(achievements);

    Debug.Log("Achievement loaded data");
}

public void Save(){

    GDEAchievementsData achievements;

    if (!GDEDataManager.DataDictionary.TryGetCustom(GDEItemKeys.Achievements_Achievements, out achievements)){
        Debug.LogError("Error reading save data!");
    }

    SaveDictionaryInAchievements(AchievementScript.achievements, achievements);

    achievements.Set_Achievements();

    Debug.Log("ACHIEVEMENTS saved data");

}

void LoadAchievementsInDictionary(GDEAchievementsData gdeData){

    Debug.Log("Achievements: "+gdeData.Achievements);

    if(achievements==null){
        achievements = new AchievementList();
    }

    foreach(List<String> achievement in gdeData.Achievements){
        if(achievements.list.ContainsKey(achievement[0]))
        {
            achievements.list[achievement[0]] = (achievement[1]=="true")||(achievement[1]=="True");
        }else{
            achievements.list.Add(achievement[0], achievement[1]=="true"||achievement[1]=="True");
        }
    }

}

void SaveDictionaryInAchievements(AchievementList list, GDEAchievementsData gdeData){
    for(int i = 0; i < gdeData.Achievements.Count; i++){
        List<string> item = gdeData.Achievements[i];
        string achievementName = item[0];
        item[1] = list.list[achievementName].ToString();
    }

}

在XCode调试器中生成的错误,用于保存:

  

ArgumentOutOfRangeException:参数超出范围。   参数名称:index     在System.Collections.Generic.List`1 [System.String] .get_Item(Int32 index)[0x00000] in:0     在AchievementScript.SaveDictionaryInAchievements(.AchievementList list,GameDataEditor.GDEAchievementsData gdeData)[0x00000] in:0     在AchievementScript.Save()[0x00000]中:0     在AchievementScript.OnApplicationFocus(Boolean focusStatus)[0x00000]中:0     在AchievementScript.OnApplicationPause(Boolean pauseState)[0x00000] in:0

加载:

  

ArgumentOutOfRangeException:参数超出范围。   参数名称:index     在System.Collections.Generic.List`1 [System.String] .get_Item(Int32 index)[0x00000] in:0     在AchievementScript.LoadAchievementsInDictionary(GameDataEditor.GDEAchievementsData gdeData)[0x00000] in:0     在AchievementScript.Load()[0x00000]中:0     在AchievementScript.OnApplicationFocus(Boolean focusStatus)[0x00000]中:0

向GDE团队提出同样的问题,但如果有人知道为什么会这样,那么获得一些启示会很棒。

1 个答案:

答案 0 :(得分:1)

您多次访问achievement[0]achievement[1],而不首先检查achievement的大小 - 这可能会导致索引异常,因为{{{{}}中没有足够的元素1}}。请注意,如果achievement为空,即使访问[0]也会导致此错误。

要解决此问题,请务必检查列表大小。这可以通过Linq

完成
List<>

或通过foreach(List<String> achievement in gdeData.Achievements.Where(l => l.Count >= 2) 声明

if