2015-02-25 2 views
0

Друг попросил меня помочь ему в его игре, которая была запрограммирована двумя другими программистами. Один из них был не очень ясен, поэтому части кода перепутались, но это не проблема.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)); 
} 
+0

Где ваш код? – Raptor

+0

@ Raptor - Как я уже сказал, игра - это мой друг =/Я, вероятно, не должен публиковать его. – Darkatom

+0

, тогда мы не можем помочь. – Raptor

ответ

0

попробовать позвонить в вашу GetTrackFromPosition() в Awake метод и вызывать PlayerPrefs. Сохранить() в методе SaveTrackInPosition() (после этого SetString() s)

+0

Не работает. Уже сделал это (сказал, что в описании), но я попробовал снова сейчас и нет, все еще не работая в автономном режиме. – Darkatom

+0

как насчет моего последнего редактирования? – sithereal

+0

GetTrackFromPosition() вызывается только в SaveLevel() (я редактирую сообщение прямо сейчас с помощью функции), чтобы перемещать дорожки или просматривать их значения. Так что это не должно быть проблемой = / – Darkatom