1

私の状況では、配列InputFieldsがあります-6つの InputFields。各 InputField からテキストを取得して保存するにはどうすればよいですか?

すべてが次のように機能するはずです。アプリをオンにし、入力フィールドの 1 つ、2 つ、またはすべてを変更してから、アプリケーションをオフにします。もう一度オンにすると、入力フィールドは以前に書いた値である必要があります。

正しく動作するはずのコードがありますが、このコードは次のように動作します。ユーザーが最後に入力した値のみを取得し、それを最後の入力フィールドに書き込みます。

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

さて、あなたはすべての異なるプレーヤー設定変数に対して 1 つの変数を使用していますn。そのため、フィールドを (SubmitName で) 変更すると、そのnpref 変数が使用されて変更されます。これはn、ループで最後に指定した値に対応します。

オプションは、それも配列にするか(private string prefValues[])、呼び出し元の入力フィールドをSubmitName(またはむしろその名前)に渡し、代わりにそれを使用することですn

ちょっとした例 (あなたのコードから、いくつかの GetComponent 呼び出しを保存するように実際に変更することができます) GameObject[]:InputField[]

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

編集:
以下のコードに設定を保存/ロードするための行を追加しました。私のテスト セットアップでは、2 つのシーンしかありません。両方とも、2 つの入力フィールドと、そのシーン チェンジを呼び出すボタンがあります。好きなようにフィールドに入力したり、シーンを変更したりできます。また、エディタでプレイモードを再起動したとき。

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 に答える