Друг попросил меня помочь ему в его игре, которая была запрограммирована двумя другими программистами. Один из них был не очень ясен, поэтому части кода перепутались, но это не проблема.Unity - PlayerPrefs не сохраняется в автономном режиме
Эта игра позволяет игроку редактировать и сохранять новые уровни. Первые программисты использовали PlayerPrefs, чтобы хранить в нем все данные из них, а не объект структуры или класса (я не вижу в этом смысла, но для перепрограммирования все потребуется некоторое время, которого у меня нет).
Что я сделал: я добавил новый параметр для каждого уровня, называемый «Сложность». При сохранении в редакторе уровни должны сохраняться в порядке (от Easy A-Z до Hard A-Z). Я сделал две общие функции для сохранения/загрузки уровней, которые в основном являются getString/setString и getInt/setInt, которые я вызываю для их хранения и извлечения. И это работает отлично, на моем компьютере.
Проблема: при построении люди, не имеющие Unity, не могут сохранить новый отредактированный уровень и не обновлять тот, который они редактируют. PlayerPrefs просто не сохраняет информацию. Однако, это происходит на моем. Я меняю вещи в редакторе, и они происходят правильно. Я запускаю сборку (.exe) на своем компьютере, и она сохраняет. Странная вещь, которую я замечаю, заключается в том, что, по крайней мере, на моем компьютере редактор и сборник используют одну и ту же информацию, поэтому, если я сохраню или отредактирую уровень, изменения будут сохранены для редактора и наоборот.
В качестве побочного примечания они не запрограммировали кнопку «выхода» или, по крайней мере, я ее еще не нашел, поэтому мне нужно вывести alt + f4. Я добавил PlayerPref.Save() в конце функции saveLevel, но ничего не сделал. Это не имеет значения, поскольку, когда я получил игру, она была функциональной и сохранена правильно.
Любые идеи?
EDIT:
Вставка отсортирован новый уровень:
public void SaveLevel()
{
if (inputLevelName != null)
{
SortBeatList();
// - Get difficulty chosen by the player
string trackDiff = "";
if (easyDifficulty.isOn == true)
{
trackDiff = " (Easy)";
}
else if (mediumDifficulty.isOn == true)
{
trackDiff = " (Medium)";
}
else if (hardDifficulty.isOn == true)
{
trackDiff = " (Hard)";
}
string auxDiff = PlayerPrefs.GetString (PlayerPrefs.GetInt ("CurrentLevel") + "Difficulty");
string auxName = PlayerPrefs.GetString (PlayerPrefs.GetInt ("CurrentLevel") + "Name");
// - Save current level
if (inputLevelName.text.CompareTo (auxName) == 0 && CompareDifficulties(trackDiff, auxDiff) == 0)
{
SaveTrackInPosition(PlayerPrefs.GetInt ("CurrentLevel"), inputLevelName.text, trackDiff, beatStruct);
}
else
{
int numberOfLevels = PlayerPrefs.GetInt ("LevelCount",-1);
int cont = 0;
// - Search for correct difficulty place
while (cont < numberOfLevels && CompareDifficulties(PlayerPrefs.GetString (cont + "Difficulty") , trackDiff) > 0)
cont++;
auxDiff = PlayerPrefs.GetString (cont + "Difficulty");
auxName = PlayerPrefs.GetString (cont + "Name");
if (CompareDifficulties(trackDiff, auxDiff) == 0)
// - Search for correct space for name
while (cont < numberOfLevels && CompareDifficulties(trackDiff, auxDiff) == 0 &&
inputLevelName.text.CompareTo (auxName) > 0)
{
cont++;
auxName = PlayerPrefs.GetString (cont + "Name");
auxDiff = PlayerPrefs.GetString (cont + "Difficulty");
}
auxName = PlayerPrefs.GetString (cont + "Name");
if (CompareDifficulties(trackDiff, auxDiff) == 0 && inputLevelName.text.CompareTo (auxName) == 0) // -- Replace existing track
{
// - Update or replace
PlayerPrefs.SetInt ("CurrentLevel", cont);
SaveTrackInPosition(PlayerPrefs.GetInt ("CurrentLevel"), inputLevelName.text, trackDiff, beatStruct);
}
else if (cont >= numberOfLevels)
{
// - Insert at last
PlayerPrefs.SetInt ("LevelCount", numberOfLevels + 1);
PlayerPrefs.SetInt ("CurrentLevel", numberOfLevels);
SaveTrackInPosition(PlayerPrefs.GetInt ("CurrentLevel"), inputLevelName.text, trackDiff, beatStruct);
}
else if(CompareDifficulties(trackDiff, auxDiff) > 0 || (CompareDifficulties(trackDiff, auxDiff) == 0 && inputLevelName.text.CompareTo (auxName) < 0))
{
// - Move and insert
Track auxTrack;
PlayerPrefs.SetInt ("LevelCount", numberOfLevels + 1);
for (int i = numberOfLevels; i > cont; i--) // -- Move everything one position to the right
{
auxTrack = GetTrackFromPosition (i - 1);
SaveTrackInPosition (i, auxTrack.name, auxTrack.difficulty, auxTrack.beatTrack);
}
PlayerPrefs.SetInt ("CurrentLevel", cont);
SaveTrackInPosition (cont, inputLevelName.text, trackDiff, beatStruct);
}
}
}
}
Основные Сохранение/извлечение функции:
public Track GetTrackFromPosition (int position)
{
Track auxTrack;
auxTrack.name = PlayerPrefs.GetString (position + "Name");
auxTrack.level = PlayerPrefs.GetString (position + "Level");
auxTrack.difficulty = PlayerPrefs.GetString (position + "Difficulty");
auxTrack.beatTrack = Serialisation.DeserialiseStruct<BeatStruct>(PlayerPrefs.GetString (auxTrack.level));
return auxTrack;
}
public void SaveTrackInPosition (int position, string name, string difficulty, BeatStruct beatTrack)
{
PlayerPrefs.SetString (position + "Name", name);
PlayerPrefs.SetString (position + "Difficulty", difficulty);
PlayerPrefs.SetString (position + "Level",
Serialisation.SerialiseStructToString<BeatStruct>(beatTrack));
}
Где ваш код? – Raptor
@ Raptor - Как я уже сказал, игра - это мой друг =/Я, вероятно, не должен публиковать его. – Darkatom
, тогда мы не можем помочь. – Raptor