我有一个数组 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中的空闲单元格中。
答案 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一样,只有一种方法可以知道是否加载了新场景。 也许你有一个地方可以保存最后一个活动场景对象,然后调用最后一个场景功能来执行保存过程,同时不清除对象。