1

在我的情况下,我有一个数组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 中拖动脚本组件中空闲单元格中的每个输入字段。

4

2 回答 2

0

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

查看文档中的以下功能

OnApplicationQuit()

OnApplicationPause()

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

关于场景更改,您需要新场景告诉旧场景执行任何进一步的操作。就像您在这篇文章中看到的那样,只有一种方法可以知道是否加载了新场景。也许您有一个地方可以保存最后一个活动场景对象,然后在对象未清除时调用最后一个场景函数来执行保存过程。

于 2017-01-21T15:53:19.080 回答
0

好吧,您对所有不同的播放器首选项变量使用单个变量,n. 因此,当您更改字段(使用 SubmitName)时,它会使用该npref 变量并对其进行更改。这将对应于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);
    }
}

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

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");
        }
    }
}
于 2017-01-21T15:24:47.193 回答