【问题标题】:Unity game on iOS ArgumentOutOfRangeException in dictionary字典中 iOS ArgumentOutOfRangeException 上的 Unity 游戏
【发布时间】:2015-05-15 03:37:05
【问题描述】:

我有一个成就模块,用于保存和加载带有成就名称(键)以及是否已完成(布尔值)的字典。我正在使用 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:参数超出范围。 参数名称:索引 在 System.Collections.Generic.List`1[System.String].get_Item(Int32 索引)[0x00000] 中:0 在AchievementScript.SaveDictionaryInAchievements(.AchievementList 列表,GameDataEditor.GDEAchievementsData gdeData)[0x00000] 中:0 在AchievementScript.Save()[0x00000]中:0 在AchievementScript.OnApplicationFocus (Boolean focusStatus) [0x00000] in :0 at AchievementScript.OnApplicationPause (Boolean pauseState) [0x00000] in :0

对于加载:

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

向 GDE 团队问同样的问题,但如果有人知道为什么会发生这种情况,那么能得到一些启发会很棒。

【问题讨论】:

    标签: c# unity3d unityscript


    【解决方案1】:

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

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

    foreach(List<String> achievement in gdeData.Achievements.Where(l => l.Count >= 2)
    

    或通过if 声明

    foreach(List<String> achievement in gdeData.Achievements)
    {
        if(achievment < 2) continue;
        // Put the rest of your foreach logic here.
    }
    

    【讨论】:

    • 哦,这太天真了,我使用 GDE 来确保我使用的是 2 元素长数组,但不小心添加了一个空数组而忘记了填充它!谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-02-14
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多