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

时间:2017-01-21 14:05:41

标签: c# unity3d input input-field unity3d-gui

我有一个数组 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中拖动每个输入字段在Script Component中的空闲单元格中。

2 个答案:

答案 0 :(得分:0)

好吧,您正在为所有不同的播放器首选变量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保存/加载的行。对于我的测试设置,我只有两个场景。两者都有两个输入字段和一个调用该场景更改的按钮。我可以随意在字段上输入内容,更改场景并保留。在编辑器中重新启动playmode时也是如此。

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");
        }
    }
}

答案 1 :(得分:0)

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

查看以下函数in the documentation

OnApplicationQuit()

OnApplicationPause()

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

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