Сохранение всего текста InputField в сцене в двоичный файл и загрузка их обратно в Unity - PullRequest
0 голосов
/ 11 января 2020

Мне было интересно, сможет ли кто-нибудь помочь мне с проблемой, возникшей при сохранении текста поля ввода в двоичном виде. Я делаю инструмент для создания карт с Unity и пытаюсь сохранить весь текст полей ввода в двоичный файл через список и загрузить их обратно в игру, когда кнопка загрузки нажата, я уверен что поля ввода сохранены правильно, так как на моем компьютере есть файл, но я не уверен, как загрузить их все обратно.

Код, который у меня есть в настоящее время, выглядит нормально, но при попытке загрузить данные не изменяют текст поля ввода. Теперь я знаю, что неправильно сделал метод LoadPlan (), потому что не могу понять, как его правильно загрузить, поэтому я и здесь. Если бы кто-то мог помочь, я был бы чрезвычайно благодарен.

Вот мой код:

SaveSystem.cs

public static void SaveUser(FieldController controller)
   {
       BinaryFormatter formatter = new BinaryFormatter();

       string path = Application.persistentDataPath + "/user.frostbyte";
       FileStream stream = new FileStream(path, FileMode.Create);

       UserData data = new UserData(controller);

       formatter.Serialize(stream, data);
       stream.Close();
   }

public static UserData LoadData()
   {
       string path = Application.persistentDataPath + "/user.frostbyte";
       if(File.Exists(path))
       {
           BinaryFormatter formatter = new BinaryFormatter();
           FileStream stream = new FileStream(path, FileMode.Open);

           UserData data = formatter.Deserialize(stream) as UserData;
           stream.Close();

           return data;
       }
       else
       {
           Debug.LogError("Save file not found in " + path);
           return null;
       }
   }

UserData .cs

public static List<string> inputFieldText = new List<string>();

   public UserData (FieldController fieldController)
   {
       foreach (InputField inputField in GameObject.FindObjectsOfType<InputField>())
       {
           foreach (TextMeshProUGUI text in inputField.GetComponentsInChildren<TextMeshProUGUI>())
           {
               if (text.gameObject.name != "Placeholder")
                   inputFieldText.Add(text.text);
           }
       }
   }

FieldController.cs

public void SavePlan()
   {
       SaveSystem.SaveUser(this);
   }

   public void LoadPlan()
   {
       UserData data = SaveSystem.LoadData();

       foreach (InputField inputField in GameObject.FindObjectsOfType<InputField>())
       {
           foreach (TextMeshProUGUI text in inputField.GetComponentsInChildren<TextMeshProUGUI>())
           {
               if (text.gameObject.name != "Placeholder")
                   text.text = UserData.inputFieldText[0];
           }
       }
   }

1 Ответ

0 голосов
/ 11 января 2020
  1. Доступ к тексту InputField можно получить с помощью свойства text:

    someInputField.text = text;

  2. Вы пытаетесь использовать stati c список, который не имеет ничего общего с десериализованным объектом.

  3. Я рекомендую вам не помещать какие-либо логи c в DTO (Data Transfer Object). В вашем случае DTO - UserData.
  4. . Я не рекомендую вам использовать FindObjectsOfType по соображениям производительности.

Попробуйте это решение:

SaveSystem .cs: ​​

public class SaveSystem
{
    static string path = Application.persistentDataPath + "/user.frostbyte";

    public static void SaveUser(UserData data)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        FileStream stream = new FileStream(path, FileMode.Create);

        formatter.Serialize(stream, data);

        stream.Close();
    }

    public static UserData LoadUser()
    {
        if (File.Exists(path))
        {
            BinaryFormatter formatter = new BinaryFormatter();
            FileStream stream = new FileStream(path, FileMode.Open);

            UserData data = formatter.Deserialize(stream) as UserData;

            stream.Close();
            return data;
        }
        else
        {
            Debug.LogError("Save file not found in " + path);
            return null;
        }
    }
}

UserData.cs:

[Serializable]
public class UserData
{
    public List<string> values;

    public UserData (List<string> values)
    {
        this.values = values;
    }
}

FieldController.cs:

public class FieldController : MonoBehaviour
{
    [ContextMenu("Save")]
    public void SavePlan()
    {
        List<string> texts = new List<string>();
        foreach (InputField inputField in FindObjectsOfType<InputField>())
            texts.Add(inputField.text);

        UserData data = new UserData(texts);

        SaveSystem.SaveUser(data);
    }

    [ContextMenu("Load")]
    public void LoadPlan()
    {
        UserData data = SaveSystem.LoadUser();

        InputField[] fields = FindObjectsOfType<InputField>();
        for (var i = 0; i < fields.Length; i++)
            fields[i].text = data.values[i];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...