字典中的 iOS ArgumentOutOfRangeException 上的 Unity 游戏
Unity game on iOS ArgumentOutOfRangeException in dictionary
我有一个成就模块,用于保存和加载带有成就名称(键)以及是否已完成(布尔值)的字典。我正在使用 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: Argument is out of range.
Parameter name: index
at System.Collections.Generic.List`1[System.String].get_Item (Int32 index) [0x00000] in :0
at AchievementScript.SaveDictionaryInAchievements (.AchievementList list, GameDataEditor.GDEAchievementsData gdeData) [0x00000] in :0
at AchievementScript.Save () [0x00000] in :0
at AchievementScript.OnApplicationFocus (Boolean focusStatus) [0x00000] in :0
at AchievementScript.OnApplicationPause (Boolean pauseState) [0x00000] in :0
并加载:
ArgumentOutOfRangeException: Argument is out of range.
Parameter name: index
at System.Collections.Generic.List`1[System.String].get_Item (Int32 index) [0x00000] in :0
at AchievementScript.LoadAchievementsInDictionary (GameDataEditor.GDEAchievementsData gdeData) [0x00000] in :0
at AchievementScript.Load () [0x00000] in :0
at AchievementScript.OnApplicationFocus (Boolean focusStatus) [0x00000] in :0
向 GDE 团队提出同样的问题,但如果有人知道为什么会发生这种情况,最好能得到一些启发。
多次访问 achievement[0]
和 achievement[1]
,而不先检查 achievement
的大小 - 这可能会导致索引不足异常,因为其中没有足够的元素achievement
。请注意,如果说 List<>
为空,即使访问 [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(游戏数据编辑器)插件 (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: Argument is out of range. Parameter name: index at System.Collections.Generic.List`1[System.String].get_Item (Int32 index) [0x00000] in :0 at AchievementScript.SaveDictionaryInAchievements (.AchievementList list, GameDataEditor.GDEAchievementsData gdeData) [0x00000] in :0 at AchievementScript.Save () [0x00000] in :0 at AchievementScript.OnApplicationFocus (Boolean focusStatus) [0x00000] in :0 at AchievementScript.OnApplicationPause (Boolean pauseState) [0x00000] in :0
并加载:
ArgumentOutOfRangeException: Argument is out of range. Parameter name: index at System.Collections.Generic.List`1[System.String].get_Item (Int32 index) [0x00000] in :0 at AchievementScript.LoadAchievementsInDictionary (GameDataEditor.GDEAchievementsData gdeData) [0x00000] in :0 at AchievementScript.Load () [0x00000] in :0 at AchievementScript.OnApplicationFocus (Boolean focusStatus) [0x00000] in :0
向 GDE 团队提出同样的问题,但如果有人知道为什么会发生这种情况,最好能得到一些启发。
多次访问 achievement[0]
和 achievement[1]
,而不先检查 achievement
的大小 - 这可能会导致索引不足异常,因为其中没有足够的元素achievement
。请注意,如果说 List<>
为空,即使访问 [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.
}