如何获取文本并将其保存在 InputField 中?

How can I get the text and save it in InputField?

我有一个数组 InputFields,在我的情况下 - 六个 InputFields。如何从每个 InputField 获取文本并保存它?

一切都应该像这样工作:我打开应用程序,更改一个、两个或所有输入字段,然后关闭应用程序。再次,我打开,输入字段必须是我之前写的值。

我有一段代码似乎可以正常工作,但这段代码是这样工作的:它只接受用户输入的最后一个值并将其写入最后一个输入字段。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SaveText : MonoBehaviour {
    public GameObject[] InputFields;
    public static string n;

    public void Start ()
{
    for(int i = 0; i < InputFields.Length; i++)
    {
        InputFields[i].GetComponent<InputField> ().text = PlayerPrefs.GetString (InputFields[i].name);
        Debug.Log (PlayerPrefs.GetString (InputFields[i].name));
        n = InputFields[i].name;
        var input = InputFields[i].GetComponent<InputField> ();
        var se = new InputField.SubmitEvent ();
        se.AddListener (SubmitName);
        input.onEndEdit = se;
    }

}

public void SubmitName(string arg)
{
    PlayerPrefs.SetString (n, arg);
}

我在 Unity 中初始化的输入字段数组在脚本组件的自由单元格中拖动每个输入字段。

好吧,您正在为所有不同的玩家偏好变量使用一个变量,n。因此,当您更改字段(使用 SubmitName)时,它会使用 n pref 变量并对其进行更改。这将对应于您在循环中为 n 提供的最后一个值。

一个选项是让它也成为一个数组(private string prefValues[])或将调用输入字段传递给 SubmitName(或者更确切地说是它的名称)并使用它而不是 n.

一个小例子(根据你的代码,你实际上可以将 GameObject[] 更改为 InputField[],这样可以节省一些 GetComponent 调用):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class EventTest : MonoBehaviour
{
    public InputField[] inputFields;

    void Start ()
    {
        foreach(InputField field in inputFields)
        {
            var se = new InputField.SubmitEvent();
            se.AddListener(delegate {
                SubmitText(field.name, field.text);
            });
            field.onEndEdit = se;
        }
    }

    public void SubmitText(string prefKey, string prefVal)
    {
        Debug.Log("Saved " + prefVal + " to " + prefKey);
    }
}

编辑:
在下面的代码中从 prefs 添加了 saving/loading 行。对于我的测试设置,我只有两个场景。两者都有两个输入字段和一个调用该场景更改的按钮。我可以随心所欲地在字段上输入内容,更改场景并保持不变。同样在编辑器中重新启动播放模式时。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class EventTest : MonoBehaviour
{
    public InputField[] inputFields;

    void Start ()
    {
        foreach(InputField field in inputFields)
        {
            // Get field values from player prefs if existing
            // (it should only not exist the very first time or if you delete/clear the prefs)
            if(PlayerPrefs.HasKey(field.name))
                field.text = PlayerPrefs.GetString(field.name);

            var se = new InputField.SubmitEvent();
            se.AddListener(delegate {
                SubmitText(field.name, field.text);
            });
            field.onEndEdit = se;
        }
    }

    public void SubmitText(string prefKey, string prefValue)
    {
        // store the typed text of the respective input field
        PlayerPrefs.SetString(prefKey, prefValue);
    }

    public void ChangeScene()
    {
        if(SceneManager.GetActiveScene().name == "Scene1")
        {
            SceneManager.LoadScene("Scene2");
        }
        else
        {
            SceneManager.LoadScene("Scene1");
        }
    }
}

如果要保存数据,在应用程序停止或暂停后,您需要向 MonoBehavior 添加更多功能,以便它可以处理系统结束或暂停时的其他操作.

看下面函数in the documentation

OnApplicationQuit()

OnApplicationPause()

这些函数将被自动调用。在这些函数中,您需要遍历文本字段并保存它们。它是在程序失去其资源之前调用的最后一个函数。

关于场景变化,你需要新场景告诉旧场景做任何进一步的动作。就像您可以 read in this post 一样,只有一种方法可以知道是否加载了新场景。 也许你有一个地方可以保存最后一个活动场景对象,然后在对象未被清除时调用最后一个场景函数来执行保存过程。